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);
CURLOPT_SSL_VERIFYPEERオプションが設定されている場合は合格しない自己署名SSL証明書を使用している可能性があります。
2つの解決策があります。
検証を無効にすると、実際にホストと通信しているかどうかを確認できません。したがって、必要なセキュリティのレベルによって異なります。
CURLOPT_SSL_VERIFYPEER
の他に、false
/0
に変更される可能性のある他の2つの設定があります。
CURLOPT_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYSTATUS
セキュリティを無効にするのではなく、SSL証明書と設定を修正する必要があることに注意してください。
私は古い投稿に答えていますが、それは新しい視聴者に役立つと思います-
追加することで問題を確認できます
$opts[CURLOPT_VERBOSE] = 1
自己署名証明書の場合、ホスト名はDNSキャッシュで利用できないため、クライアントはIPアドレスを使用してサーバーに接続できます。その場合、サーバー証明書の共通名(CN)はサーバーIPと一致する必要があります(サーバー証明書の生成時にIPアドレスを共通名として入力します)。正しく実行すると、次のメッセージが表示されます。
一般名:192.168.0.1(一致)
ここでは192.168.0.1が例です。
同じ問題がありました。私はここの指示に従います: 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
有効な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
この証明書が信頼できることを確認してください。これは、コマンドにCERTMGR
と入力することで実行できます。
これで作成された証明書はPERSONALフォルダにあります。それをコピーして、信頼できる人のフォルダに貼り付けます。
これでうまくいくはずです。うまくいかない場合はお知らせください。
中間者攻撃を心配している場合は、SSL_VERIFYPEER
を有効にすることをお勧めします。
$path
は、API所有者から提供された証明書(または証明書バンドル)を指すように設定されていますか?その証明書はWebサーバーのユーザーが読み取り可能ですか?その場合、証明書がブラウザで手動でhttpsアドレスにアクセスして証明書を検査するときと同じであることを確認しましたか?
それを機能させることができず、接続しているAPIが警告なしに通常のブラウザーで機能するSSL証明書を持っている場合、$path
をサーバーのCAルートバンドルに設定できるはずです。