PHP を使用して、サイト A からサイト B にデータを POST します。サイト A には商用 SSL 証明書があります。サイト B には自己署名証明書があります。これは実行可能ですか?そうでない場合、制限を回避するために設定できる PHP (または Apache) の構成オプションはありますか?
6 に答える
おそらく、サーバー A で curl を使用することになりますか? curl には、自己署名証明書を許可する証明書の検証を無効にするオプションがいくつかあります。リンクは引き続き暗号化されますが、サーバー B が本当にサーバー 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);
無効にすることを提案する回答CURLOPT_SSL_VERIFYPEER
は受け入れるべきではありません。問題は「なぜ cURL で動かないのか」であり、正しく指摘されているように危険です。証明書のチェックを無効にすると、中間者攻撃への扉が開かれ、平文の http を使用することに近づきます。
このエラーは、CA ルート証明書の最新のバンドルがないことが原因である可能性があります。これは通常、curl がホストの SSL 証明書を検証するために使用する一連の暗号署名を含むテキスト ファイルです。
PHP のインストールにこれらのファイルのいずれかがあり、最新であることを確認する必要があります (そうでない場合は、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からコピーされました。
それは実行可能です。PHP では、cURL を使用して POST を実行する場合、証明書が自己署名されているために失敗しないように、オプションを falseCURLOPT_SSL_VERIFYPEER
に設定するだけで済みます。CURLOPT_SSL_VERIFYHOST
ブラウザーにデータを POST するように要求している場合、ユーザーは、証明書が信頼されていないという通常の警告を受け取ります。
cURL を使用して PHP コード内から POST を実行している場合は、cURL の SSL チェックを無効にする必要があります。関連する質問によると、
CURLOPT_SSL_VERIFYPEER
とCURLOPT_SSL_VERIFYHOST
を設定する必要がありますFALSE
。これにより、2 つの主要なチェックが無効になります。両方が必要なわけではありませんが、少なくともこれでうまくいくはずです。