web-dev-qa-db-ja.com

POST自己署名証明書を使用したリクエスト

PHPを使用してサイトAからサイトBにPOSTデータを送信します。サイトAには商用SSL証明書があります。サイトBには自己署名証明書があります。これは実行可能ですか?そうでない場合、制限をバイパスするように設定できるPHP(またはApache))の構成オプションはありますか?

15
Aaron

おそらく、サーバーAでcurlを使用するのでしょうか。 curlには、証明書の検証を無効にするオプションがいくつかあります。これにより、自己署名証明書が通過できるようになります。リンクは引き続き暗号化されますが、そのサーバーBを実際に信頼することはできません[〜#〜] is [〜#〜]サーバーB:

curlopt_ssl_verifypeer  (checking the CA auth chain)
curlopt_ssl_verifyhost  (hostname/certname match checks)

例PHPコード:

$ch = curl_init("https://example.com/example/path"); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
24
Marc B

それは実行可能です。 PHPでは、cURLを使用してPOSTを実行している場合は、オプションCURLOPT_SSL_VERIFYPEERおよびCURLOPT_SSL_VERIFYHOSTをfalseに設定するだけで、証明書が自己署名されているために失敗しません。

2
drew010

ブラウザにPOSTデータを要求している場合、ユーザーは証明書が信頼されていないという通常の警告を受け取ります。

CURLを使用してPOST PHPコード内から実行する場合は、cURLのSSLチェックを無効にする必要があります。 関連する質問

CURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOSTFALSEに設定する必要があります。 >これにより、2つの主要なチェックが無効になります。両方が必要なわけではありませんが、少なくともこれでうまくいくはずです。

2
GargantuChet

私の場合、開発サーバーのみが自己署名されているので、verifypeerオプションをfalseに設定すると、機能します。しかし、本番サーバーは完全に署名されているため、verifypeerオプションを設定しません。いずれの場合も、verifyhostオプションは不要です。

0
David Spector

CURLOPT_SSL_VERIFYPEERを無効にすることを提案する回答は受け入れられません。質問は「なぜcURLで動作しないのか」であり、正しく指摘されているように危険です。証明書チェックを無効にすると、中間者攻撃への扉が開かれます。これは、プレーンテキストのhttpを使用することに近いものです。

このエラーは、CAルート証明書の最新のバンドルがないことが原因である可能性があります。これは通常、curlがホストのSSL証明書を検証するために使用する一連の暗号化署名を含むテキストファイルです。

PHPのインストールにこれらのファイルの1つがあり、最新であることを確認する必要があります(それ以外の場合は、ここからダウンロードしてください: http://curl.haxx.se /docs/caextract.html )。

次に、php.iniに設定します。

curl.cainfo = <absolute_path_to> cacert.pem

実行時に設定する場合は、次を使用します。

curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");

セキュリティ上の理由から、回答は https://stackoverflow.com/a/23585500/2650835 からコピーされました。

0
Dominik K