2011-05-25 107 views
5

我正在使用下面的示例來設置用於客戶端身份驗證的證書和密鑰。無法使用libcurl訪問需要客戶端身份驗證的站點

curl_easy_setopt(curl,CURLOPT_SSLCERT,"clientCert.pem"); 
    curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit"); 
    curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM"); 
    curl_easy_setopt(curl,CURLOPT_SSLKEY,"privateKey.pem"); 
    curl_easy_setopt(curl,CURLOPT_SSLKEYPASSWD,"changeit"); 
    curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM"); 

的證書沒有密碼,我不知道爲什麼在地球上的選項SSLCERTPASSWD存在,我只是提供了一個虛擬的值。 當我在Linux上運行,我得到的58錯誤代碼和錯誤消息 無法設置專用密鑰文件的程序:「privateKey.pem」型PEM

在Windows,但是我得到 無法使用客戶端證書(沒有找到密鑰或密碼錯誤?)

它似乎建議證書和密鑰不匹配,但我不知道如何。我使用openssl命令從p12文件中提取了證書和密鑰。 我用來提取密鑰,該命令是

openssl.exe pkcs12 -in client.p12 -nocerts -out privateKey.pem 

,並用於提取證書的命令是

openssl.exe pkcs12 -in client.p12 -nokeys -out clientCert.pem 

的P12文件已在瀏覽器中被成功地用於訪問客戶端身份驗證URL。 在拍攝自己之前請幫忙。

編輯: 這裏是證明私鑰和證書相互對應:

[[email protected] ~/curlm]$ openssl x509 -noout -modulus -in clientCert.pem | openssl md5 
d7207cf82b771251471672dd54c59927 

[[email protected] ~/curlm]$ openssl rsa -noout -modulus -in privateKey.pem | openssl md5 
Enter pass phrase for privateKey.pem: 
d7207cf82b771251471672dd54c59927 

那麼,爲什麼不能工作?

+1

我正面臨與命令行卷曲相同的結果。我將客戶端證書和密鑰連接成一個文件並嘗試如下:curl --cert concatenatedCert.pem --cert-type PEM --cacert cabundle.crt https:// inaveo:8775/DataIntegrationService/WebService/WS_test/ Enter PEM密碼短語: curl:(58)無法設置私鑰文件:'concatenatedCert.pem'類型PEM – 2011-05-25 15:02:40

回答

3

使用命令行curl時,我得到了同樣的錯誤,使用一個.pem文件,這個文件也是通過p12文件從openssl獲得的,p12在導入瀏覽器時也能夠正確地執行客戶端身份驗證。就像你所描述的,我想。

我的問題是由於.pem文件沒有按照正確的順序列出證書而引起的:似乎文件中的每個證書都必須緊跟其頒發者證書。 我編輯了文件,並改變了部分的順序和捲曲很高興

爲了記錄,我的原始.p12文件是通過備份來自Firefox的證書獲得的。

還要注意的是,在我的情況,我沒有得到提示輸入密碼,並得到

curl: (58) unable to set private key file: 'alice.pem' type PEM 
密碼前

提示

+0

非常感謝您... – 2012-03-07 06:46:51

2

我正面臨着類似的問題,我發現了問題是與證書和私鑰文件的文件權限有關。運行PHP的進程沒有讀取這些文件的權限。

一兩件事你可以嘗試(和幫助我搞清楚了這一點)是運行下面的代碼:

$result=openssl_get_privatekey('file://path/to/private/key.pem','password'); 

,並檢查返回值不是假的,沒有錯誤。我得到:

file_get_contents(/path/to/private/key.pem): failed to open stream: Permission denied 
0

感謝休的線程和raugfer爲openssl提示。後者:既有幫助又有誤導性。 ;-)

其實,我通過確保密鑰文件的路徑是正確的來解決問題。這就是爲什麼openssl提示誤導,暫時幫助我檢查我的PEM文件是否正常:

cURL需要完整的路徑,但沒有'file://'前綴。雖然fopen對相對路徑感到滿意,但cURL不是。所以,我所有打開密鑰文件的測試都是成功的,而cURL則不是。

順便說一句。:

curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit"); 
curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM"); 
curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM"); 

不需要,因爲密碼只用於解密私鑰和PEM是默認的。

相關問題