簡體   English   中英

卷曲失敗,並顯示錯誤#58:無法使用客戶端證書(找不到密鑰或密碼短語錯誤?)

[英]Curl failed with error #58: unable to use client certificate (no key found or wrong pass phrase?)

我收到此錯誤:致命錯誤:Curl失敗,錯誤#58:無法使用客戶端證書(找不到密鑰或密碼錯誤?)

我有一個腳本可以從.p12文件中提取證書信息。 我以為這是開始的問題,但是我用它來粘貼生成的.pem文件的內容: https : //www.sslshopper.com/certificate-decoder.html ,它解碼/顯示一切正常。 所以我認為.pem可以。

$ch = curl_init();
            curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
                  curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSLCERT, 'cert.pem'); 
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            // converting
            $response = curl_exec($ch); 
            // converting
            $response1 = str_replace("<soap:Body>","",$response);
            $response2 = str_replace("</soap:Body>","",$response1);
            if($response === false){
              throw new Exception(curl_error($ch), curl_errno($ch));
            }

pem文件是這樣的:

-----BEGIN CERTIFICATE-----
<cert bla bla>
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
<key bla bla>
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
<cert bla bla>
-----END CERTIFICATE-----–

任何建議歡迎。

謝謝

首先有幾點評論:

  • 通過使用這些設置, 您可以承受潛在的MITM攻擊

     curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

    通常,您通常希望VERIFYHOST=2VERIFYPEER=true (無論如何應該是默認值)。 正確執行驗證還意味着您將需要在CAINFO或CAPATH中設置CA證書或服務器證書。 我將在此處引用此選項PHP / curl文檔

    可以使用CURLOPT_CAINFO選項指定要驗證的備用證書,或者可以使用CURLOPT_CAPATH選項指定證書目錄。

  • 將您的私鑰(您在-----BEGIN PRIVATE KEY-----私鑰-----BEGIN PRIVATE KEY-----塊中獲得的)粘貼到您不太了解的遠程網站中不一定是個好主意。 您的私鑰旨在保持私密性。 您可以使用openssl x509openssl rsa檢查格式是否符合您的期望。

libcurl有兩個選項: CURLOPT_SSLCERTCURLOPT_SSLKEY ,分別用於證書及其私鑰。 我必須承認我最近沒有嘗試過PHP cURL綁定,有些工具的確可以讓您將cert和private key都放在同一個文件中(就像您所做的一樣),但是PHP文檔中的一些注釋建議您可以這樣做, libcurl的文檔中並未真正提到(您在這里沒有使用P12格式)。 另外,libcurl本身沒有記錄CURLOPT_SSLCERTPASSWD (這對於cert文件中受密碼保護的密鑰是有意義的),因此PHP綁定和libcurl本身可能會有一些細微差別(您會發現其他大多數選項是幾乎是直接映射)。

我建議將-----BEGIN/END PRIVATE KEY-----之間的內容移動到一個單獨的文件中,並將CURLOPT_SSLKEY指向該文件路徑,並將證書(以及大概的證書鏈,以下證書)與當前設置。 確保證書鏈的順序正確,尤其要確保第一個是您的客戶證書(您具有私鑰)。 您可以通過將每個-----BEGIN/END CERTIFICATE-----塊的內容粘貼到openssl x509 -text -noout的標准輸入中來檢查它們的內容。 這些模塊中的每一個都會為您提供主題和發行者。 帶有主題X和頒發者Y的證書之后應帶有主題Y和頒發者Z的證書(依此類推)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM