2011-10-31 5 views
15

Tôi có tệp CERT và khóa cá nhân. Tôi đang sử dụng cUrl và PHP để kết nối với một dịch vụ khác. Tại thời điểm này, tôi đã cert và key trong các tập tin và nó hoạt động hoàn toàn tốt đẹp với đoạn mã sau:Truyền .PEM và .KEY dưới dạng chuỗi trong Curl bằng cách sử dụng PHP

$pemfile = "cert.pem"; 
$keyfile = "private_key.key"; 
$url = "someTestUrl"; 
$requestXml = "requestData"; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); 
curl_setopt($ch, CURLOPT_FAILONERROR, 1); 
curl_setopt($ch, CURLOPT_SSLCERT, $pemfile); 
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); 
curl_setopt($ch, CURLOPT_SSLKEY, $keyfile); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXml); 
$ret = curl_exec($ch); 

Câu hỏi của tôi là: Tôi có thể vượt qua cert và key như dây đàn thay vì đi qua nó thành file? Tôi đã cố gắng đơn giản thông qua nội dung các tập tin tương ứng như dây đàn như thế này:?

$pemfile = "-----BEGIN CERTIFICATE-----CERTDATAASSTRING-----END CERTIFICATE-----"; 
$keyfile = "-----BEGIN RSA PRIVATE KEY-----PRIVATEKEYINCODE-----END RSA PRIVATE KEY-----"; 

... và không cần phải nói ... nó đã không làm việc :(

Bất kỳ ý tưởng gợi ý gợi ý ???

+0

Tôi có thể hỏi bạn tệp '.key' nào bạn cung cấp không? Tôi chỉ có tệp '.pem'. –

Trả lời

21

Câu trả lời là không may dễ dàng như nó rất đơn giản:.! không, nó không thể

Các libcurl cơ bản không có API cho việc cung cấp các phím như dây đàn, chỉ như là file

Bonus vật liệu:

Nếu bạn chắc chắn rằng libcurl của bạn được xây dựng với OpenSSL, bạn thực sự có thể sử dụng tùy chọn CURLOPT_SSL_CTX_FUNCTION để làm điều đó. Tuy nhiên:

  1. mà làm cho nó một libcurl + giải pháp cụ OpenSSL

  2. Tôi không nghĩ rằng PHP/CURL cho thấy rằng chức năng (đủ) cho phép điều này. Bạn có lẽ sẽ cần phải mở rộng mã ràng buộc đầu tiên ...

(Tôi nên thêm rằng tôi là tác giả chính và duy trì libcurl.)

+0

Có các tên tập tin đặc biệt, được hỗ trợ bởi PHP và một trong số đó là luồng 'php: // memory'. Libcurl có hỗ trợ tên tệp như vậy không? (không được kiểm tra) – lisachenko

+0

Tôi không biết. Nếu họ làm việc như các tập tin thường xuyên để libcurl sau đó họ sẽ làm việc, nhưng tôi nghi ngờ họ làm như vậy tôi đoán của tôi sẽ được rằng họ không làm việc ... –

+0

@Alexander: Đối với các tùy chọn có giá trị chuỗi (ví dụ: CURLOPT_URL, CURLOPT_SSLCERT, v.v.), 'php-curl' chỉ chuyển đổi giá trị được truyền sang chuỗi C và chuyển trực tiếp đến' libcurl'. Vì 'libcurl' không biết gì về' php: // memory', nên không thể. – netcoder

3

Bạn có thể tạo tập tin tạm thời, hãy viết các dây vào các tệp và sau đó trỏ đến các tệp tạm thời ...

8

Sử dụng tmpfile() có thể đủ để giải quyết sự cố.

$tempPemFile = tmpfile(); 
fwrite($tempPemFile, $pemfile); 
$tempPemPath = stream_get_meta_data($tempPemFile); 
$tempPemPath = $tempPemPath['uri']; 

và sau đó:

curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath); 

nhưng chắc chắn rằng bạn đóng nó lại sau khi để file tmp là xóa

fclose($tempPemFile); 
0

Tôi không SSL Expert nhưng CURLOPT_SSLKEY là tập tin private.pem của tệp CURLOPT_SSLCERT public.pem?

thông số của tôi

CURLOPT_CAINFO => /path/cacert.pem 
CURLOPT_SSLKEY => /path/private.pem 
CURLOPT_SSLCERT => /path/public.pem 

Hãy thử trả lời đề nghị của tôi và cho tôi biết nếu nó là hữu ích hay không.