2013-01-07 51 views
8

我正在測試使用curl_exec php函數和CA證書的API,但出現問題,並且我有點遺失。SSL對等證書或SSH遠程密鑰不正確

我在我的apache VirtualHost上配置了SSL並且看起來沒問題(打開https:://[myVHost] ...作品)。

然而,API調用捲曲給我回這個消息:

  • SSL peer certificate or SSH remote key was not OK

我不是很有經驗的SSL所以我對那起因一些想法。

UPDATE:

這是我用我的捲曲請求的代碼,我有評論2條線,並改變它們的值(看「TODO」線),並以這種方式工作,然而,這只是一個以防萬一的工作......

$opts[CURLOPT_URL] = $url; 
    $opts[CURLOPT_RETURNTRANSFER] = true; 
    $opts[CURLOPT_CONNECTTIMEOUT] = 50; 
    $opts[CURLOPT_TIMEOUT] = 100; 
    $headers = array(
     'Accept: application/json', 
     "User-Agent: APIXXX-PHP-Client"); 
    $opts[CURLOPT_HTTPHEADER] = $headers; 
    $opts[CURLOPT_USERPWD] = $env->getApiKey() . ':'; 
    if (certificatePresent()) { 

     // $opts[CURLOPT_SSL_VERIFYPEER] = true; 
     // $opts[CURLOPT_SSL_VERIFYHOST] = 2; 

     // TODO: SET IT BACK 
     $opts[CURLOPT_SSL_VERIFYPEER] = 0; 
     $opts[CURLOPT_SSL_VERIFYHOST] = 0; 

     $opts[CURLOPT_CAINFO] = $path 

     } 

    curl_setopt_array($curl, $opts); 

    $response = curl_exec($curl); 
+0

我們需要您使用的完整且完整的代碼來提出請求,其中包括設置所有捲曲選項。另外,這是一個自簽名證書嗎? – Charles

+0

信息添加:)關於'自簽署certificate'問題,我不知道:該證書提供與API ... – WonderLand

+5

您已經成功地識別出的根本原因:'CURLOPT_SSL_VERIFYHOST'爲2。如果設置爲2 ,curl將驗證證書是否有效,並且它是由它所信任的CA頒發的。如果遠程證書是自簽名的或者不是由其信任的CA頒發的,它會發出抱怨並給出錯誤信息,如所給出的錯誤。如果您從第三方獲得證書,則需要說服curl相信簽署該證書的CA。你說你有一個CA證書,對吧?你用它做了什麼? – Charles

回答

4

您可能正在使用自簽名的SSL certifiacate,當CURLOPT_SSL_VERIFYPEER選項設置,將無法通過。

解決辦法有兩個:

  1. 購買有效的SSL證書。
  2. 在Curl中禁用SSL驗證。 (add --insecure option

如果您禁用驗證,則無法確定您是否真的與主機通信。 所以它取決於你需要的安全級別。

0

如果您擔心中間人攻擊,則您想啓用SSL_VERIFYPEER

您的$path是否設置爲指向由API所有者提供的證書(或證書包)? Web服務器用戶可以讀取該證書嗎?如果是這樣,是否證實證書與在瀏覽器中手動訪問https地址並檢查證書相同?

如果您無法使其正常工作,並且您要連接的API具有可在普通瀏覽器中正常運行的SSL證書,並且沒有任何警告,那麼您應該能夠將$path設置爲您的服務器上的CA根捆綁軟件包。

0

您可以構建一個有效的SSL證書,並確保它存儲在可信文件夾中。

通過在開發人員命令提示符VS2012中包含以下命令,可以創建有效的SSL證書。 (這可以通過在開始時鍵入開發人員獲得)

以下命令將創建一個自簽名證書,該證書可用於測試在URL爲www.example.com的Web服務器上使用安全套接字層(SSL)的Web應用程序。由-eku選項定義的OID將該證書標識爲SSL server certificate。證書存儲在我的商店中,並且在機器(而不是用戶)級別可用。證書的私鑰是可導出的,證書的有效期爲May 10, 2010 through December 22, 2011

Makecert -r -pe -n CN =「www.example.com」-b 05/10/2010 -e 12/22/2011 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr LOCALMACHINE -sky交換-SP「微軟RSA SChannel加密提供程序」 -sy 12

更多關於如何創建SSL certificate

現在確保這個證書是可信的,這可以通過在輸入CERTMGR完成cmd ..

現在創建的證書位於PERSONAL文件夾中..將其複製並粘貼到TRUSTED PEOPLE FOLDER。

這應該可以做到。讓我知道如果這不起作用。

2

雖然我回答舊的文章,我認爲這將有助於新的viewers-

您可以檢查問題通過增加

$opts[CURLOPT_VERBOSE] = 1 

對於自簽名證書,您的客戶端可能使用IP地址與服務器連接,因爲主機名在DNS緩存中不可用。在這種情況下,服務器證書的公共名稱(CN)需要與服務器IP匹配(在生成服務器證書時將IP地址作爲通用名稱)。當你這樣做是正確,你可以看到這條消息:

共同的名字:192.168.0.1(匹配)

這裏192.168.0.1就是一個例子。

0

除了CURLOPT_SSL_VERIFYPEER有可能改爲false/0其他兩個設置:

CURLOPT_SSL_VERIFYHOST 
CURLOPT_SSL_VERIFYSTATUS 

當心,你應該解決您的SSL證書&設置,而不是禁用安全的!