2013-01-07 22 views
8

curl_exec PHP関数とCA証明書を使用するAPIをテストしていますが、何かがうまくいかず、少し失われています。SSLピア証明書またはSSHリモートキーが正しくありません

私はApacheのVirtualHostでSSLを設定していて、okと思われます(開けばhttps:://[myVHost] ...)。私は非常に私はそれの原因についていくつかのアイデアを持っているSSLを経験していないよ

  • SSL peer certificate or SSH remote key was not OK

しかしAPIカール呼び出しは、このメッセージを私に戻って与えます。

UPDATE:

は、これは私が私のcURLのリクエストで使用しているコードですが、私は、2行をコメントし、その値を変更します(「TODO」行を見て)、このようにそれが働いているしていますおそらくCURLOPT_SSL_VERIFYPEERオプションが設定されている場合に合格しない自己署名SSL certifiacateを、使用している

$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

情報が追加されました: '自己署名証明書'質問について私は知らない:証明書にはAPIが付属しています... – WonderLand

+5

根本原因を確認できました: 'CURLOPT_SSL_VERIFYHOST' is being 2. 2に設定するとcurlは、証明書が有効であること、およびそれが信頼するCAによって発行されたことを確認します。リモート証明書が自己署名されている場合、または信頼できるCAによって発行されていない場合は、与えられたようなエラーが表示されます。証明書を第三者から入手した場合、証明書に署名したCAを信頼するようにカールする必要があります。あなたはCA証明書を与えられたと言うのですか?あなたはそれで何をしましたか? – Charles

答えて

4

しかしこれは... arroundのちょうど仕事です。

2つの解決策があります。

  1. は、有効なSSL証明書を購入します。
  2. CurlでSSL検証を無効にします。 (add --insecure option

確認を無効にすると、実際にホストと通信しているかどうかを確認できません。 それはあなたが必要とするセキュリティのレベルに依存します。

0

man-in-the-middle攻撃が心配な場合は、SSL_VERIFYPEERを有効にしたいと思っています。

$pathはAPIオーナーが提供する証明書(または証明書バンドル)を指していますか?その証明書はWebサーバーユーザーによって読み取り可能ですか?その場合は、ブラウザで手動でhttpsアドレスにアクセスして証明書を検査した場合と同じ証明書であることを確認しましたか?

正常に動作せず、接続するAPIに警告なしで通常のブラウザで動作するSSL証明書がある場合は、サーバー上のCAルートバンドルに$pathを設定する必要があります。

0

有効なSSL証明書を作成し、それが信頼できるフォルダに保存されていることを確認できます。

有効なSSL証明書は、開発者コマンドプロンプトで次のコマンドをVS2012に含めることで作成できます。

次のコマンドは、URLがwww.example.comのWebサーバーでSecure Sockets Layer(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 SSL certificate

を作成する方法の詳細については12

-sy LOCALMACHINE -sky為替-spの「Microsoft RSA SChannelの暗号化プロバイダ」今、この証明書が信頼されていることを確認し、これは中CERTMGRを入力することで行うことができますcmd ..

作成された証明書はPERSONALフォルダにあります。それをコピーして、信頼できる人のフォルダに貼り付けます。

これはトリックを行う必要があります。それがうまくいかない場合は私に教えてください。

2

私は古いポストに答えるおりますが、私はそれはあなたが

$opts[CURLOPT_VERBOSE] = 1 
を追加することによって、問題を確認することができ、新たなviewers-

に役立つと思います

自己署名証明書の場合、ホスト名がDNSキャッシュで使用できないため、クライアントはIPアドレスを使用してサーバーに接続できます。その場合、サーバー証明書の共通名(CN)はサーバーIPと一致する必要があります(サーバー証明書を生成するときに共通名としてIPアドレスを入力します)。

一般名:あなたはそれを正しく行うと、このメッセージを見ることができますここで192.168.0.1(マッチ)

は192.168.0.1は一例です。

CURLOPT_SSL_VERIFYHOST 
CURLOPT_SSL_VERIFYSTATUS 

無効セキュリティの&設定代わりに、あなたのSSL証明書を修正する必要があることに注意してください:

0

CURLOPT_SSL_VERIFYPEERfalse/0に変更される可能性があります他の二つの設定があります!

関連する問題