web-dev-qa-db-ja.com

SSLピア証明書またはSSHリモートキーに問題がありました

curl_exec php関数とCA証明書を使用するAPIをテストしていますが、問題が発生して少し迷っています。

Apache VirtualHostでSSLを構成し、問題ないように見えます(https:://[myVHost]...を開くと動作します)。

ただし、API curl呼び出しで次のメッセージが返されます。

  • SSL peer certificate or SSH remote key was not OK

私はSSLの経験があまりないので、その原因についての考えはほとんどありません。

更新:

これは私のcURLリクエストで使用しているコードです。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);
13
WonderLand

CURLOPT_SSL_VERIFYPEERオプションが設定されている場合は合格しない自己署名SSL証明書を使用している可能性があります。

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

  1. 有効なSSL証明書を購入します。
  2. CurlでSSL検証を無効にします。 ( 追加--insecureオプション

検証を無効にすると、実際にホストと通信しているかどうかを確認できません。したがって、必要なセキュリティのレベルによって異なります。

8
Daniel Milde

CURLOPT_SSL_VERIFYPEERの他に、false/0に変更される可能性のある他の2つの設定があります。

CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYSTATUS

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

3
waibelp

私は古い投稿に答えていますが、それは新しい視聴者に役立つと思います-

追加することで問題を確認できます

$opts[CURLOPT_VERBOSE] = 1

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

一般名:192.168.0.1(一致)

ここでは192.168.0.1が例です。

2
rrsuj

同じ問題がありました。私はここの指示に従います: http://siteber.com/download-failed-ssl-peer-certificate-or-ssh-remote-key-was-not-ok/ そしてそれは私のものを修正しました。

基本的に私は/etc/resolv.confに行きました

そして、

OpenDNSサーバー:

208.67.222.222

208.67.220.220

GoogleのパブリックDNSサーバー:

ネームサーバー8.8.8.8ネームサーバー8.8.4.4

0
Andrew

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

有効なSSL証明書は、次のコマンドを開発者コマンドプロンプトの_VS2012_に含めることで作成できます。 (これは、最初にdeveloperと入力することで取得できます)

次のコマンドは、URLが_www.example.com_であるWebサーバーでSecure Sockets Layer(SSL)を使用するWebアプリケーションのテストに使用できる自己署名証明書を作成します。 _-eku_オプションで定義されたOIDは、その証明書を_SSL server certificate_として識別します。証明書はmyストアに保存され、ユーザーではなくマシンで利用できます)レベル。証明書の秘密鍵はエクスポート可能であり、証明書は_May 10, 2010 through December 22, 2011_から有効です。

Makecert -r -pe -n CN = "www.example.com" -b 2010/05/10 -e 12/22/2011 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel暗号化プロバイダー" -sy 12

SSL証明書の作成方法の詳細

この証明書が信頼できることを確認してください。これは、コマンドにCERTMGRと入力することで実行できます。

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

これでうまくいくはずです。うまくいかない場合はお知らせください。

0
Abhishek

中間者攻撃を心配している場合は、SSL_VERIFYPEERを有効にすることをお勧めします。

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

それを機能させることができず、接続しているAPIが警告なしに通常のブラウザーで機能するSSL証明書を持っている場合、$pathをサーバーのCAルートバンドルに設定できるはずです。

0
Jhong