PHPでStream_Socket_Enable_Crypto関数を使用する場合、エラーメッセージが発生することがあります。「SSL操作が失敗しました」。この問題は通常、サーバーとの暗号化された接続を確立するとき、特にSSL/TLS暗号化プロトコルが有効になっている場合に発生します。この問題を解決するには、SSL構成、証明書、およびPHP環境の詳細なトラブルシューティングを実施する必要があります。この記事では、開発者がこの問題を解決できるように、いくつかの効果的なソリューションを紹介します。
stream_socket_enable_cryptoは、通常、ストリームソケット接続で使用されるストリーム暗号化を有効にするためにPHPで使用される関数です。このエラーはさまざまな状況で発生する可能性があり、一般的な理由には次のとおりです。
無効または期限切れの証明書:SSL証明書に問題がある場合、接続が失敗する可能性があります。
OpenSSL構成の問題:PHPは、暗号化操作を処理するためにOpenSSL拡張に依存しています。 OpenSSLが正しく構成されていない場合、SSL操作が失敗する可能性があります。
サーバーサポートの問題:サーバーのSSL構成が互換性がない場合があるか、サポートされているプロトコルバージョンが異なる場合があります。
PHP構成の問題:PHPのOpenSSL拡張機能は有効または不適切に構成されていないため、暗号化操作が故障する可能性があります。
まず、サーバー側が使用するSSL証明書が有効であり、クライアントがそれを正しく確認できることを確認してください。 OpenSSL S_Clientなどのブラウザまたはコマンドラインツールを使用して、SSL証明書の有効性を確認できます。
たとえば、コマンドを使用して証明書を確認します。
<span><span>openssl s_client -connect yourserver.com:443
</span></span>
証明書が無効または期限切れの場合は、サーバー管理者に連絡して証明書を更新してください。
PHP構成でOpenSSL拡張機能が有効になっていることを確認してください。 php.iniファイルで次の構成を確認してください。
<span><span><span class="hljs-attr">extension</span></span><span>=openssl
</span></span>
OpenSSLが有効になっていない場合は、ラインを除外してPHPサービスを再起動します。
PHPのPHPINFO()関数を使用して、OpenSSL拡張がロードされているかどうかを確認できます。ロードされていない場合は、PHPを再コンパイルするか、適切なOpenSSLライブラリをインストールしてみてください。
SSL/TLSプロトコルバージョンの不一致は、「SSL操作に失敗した」エラーの一般的な原因でもあります。 Stream_socket_enable_crypto関数では、 stream_crypto_method_sslv23_clientなどのパラメーターを使用して暗号化プロトコルを指定できます。プロトコルバージョンを変更して問題を解決することができます。
<span><span><span class="hljs-variable">$stream</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"ssl://yourserver.com:443"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$stream</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"接続に失敗しました: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-title function_ invoke__">stream_socket_enable_crypto</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>, STREAM_CRYPTO_METHOD_TLS_CLIENT);
}
</span></span>
Stream_crypto_method_tls_clientが適切に機能しない場合、 stream_crypto_method_sslv23_clientまたはstream_crypto_method_tlsv1_2_clientなどの他の暗号化プロトコルオプションを試すことができます。
PHP構成またはシステム環境がOpenSSLの使用に影響を与える場合があります。サーバーのOpenSSLライブラリとPHP構成が最新バージョンであることを確認してください。次のコマンドを実行して、OpenSSLのバージョンを確認できます。
<span><span>openssl version
</span></span>
システムが古いOpenSSLバージョンを使用している場合は、最新バージョンに更新することをお勧めします。 OpenSSLの古いバージョンは、新しい暗号化プロトコルをサポートしていないため、障害が発生します。
クライアントの構成に問題がない場合は、サーバー側のSSL構成を確認できます。サーバーに正しいSSL/TLSプロトコルバージョンと暗号化アルゴリズムが有効になっていることを確認してください。多くの最新のサーバーは、古いSSLバージョン(SSLV2やSSLV3など)を無効にしているため、両当事者の合意バージョンが一貫していることを確認する必要があります。
次のコマンドを使用して、サーバーが必要なSSL/TLSプロトコルバージョンをサポートしているかどうかを確認します。
<span><span>openssl s_client -connect yourserver.com:443 -tls1_2
</span></span>
問題をより適切に診断するために、PHPで詳細なエラーログを有効にできます。 ERROR_REPORTINGとDISPLAY_ERRORSを設定して、より多くのデバッグ情報を出力します。
<span><span><span class="hljs-title function_ invoke__">error_reporting</span></span><span>(E_ALL);
</span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'display_errors'</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>);
</span></span>
さらに、 Stream_Context_Createを使用してSSLコンテキストオプションを設定して、暗号化された接続の動作をデバッグおよび制御するのに役立ちます。
<span><span><span class="hljs-variable">$context</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
</span><span><span class="hljs-string">'ssl'</span></span><span> => [
</span><span><span class="hljs-string">'verify_peer'</span></span><span> => </span><span><span class="hljs-literal">true</span></span><span>,
</span><span><span class="hljs-string">'verify_peer_name'</span></span><span> => </span><span><span class="hljs-literal">true</span></span><span>,
</span><span><span class="hljs-string">'allow_self_signed'</span></span><span> => </span><span><span class="hljs-literal">false</span></span><span>,
</span><span><span class="hljs-string">'cafile'</span></span><span> => </span><span><span class="hljs-string">'/path/to/cacert.pem'</span></span><span>,
]
]);
</span><span><span class="hljs-variable">$stream</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"ssl://yourserver.com:443"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>, STREAM_CLIENT_CONNECT, </span><span><span class="hljs-variable">$context</span></span><span>);
</span></span>
上記の手順がまだ問題を解決しない場合は、PHPを最新の安定バージョンにアップグレードすることを検討できます。古いPHPバージョンには、アップグレード後に修正される可能性のある互換性の問題がある場合があります。
「SSL操作に失敗した」エラーに遭遇すると、通常、SSL構成の問題、証明書の問題、またはOpenSSL拡張機能の問題が発生します。この問題の効果的な解決策は次のとおりです。
証明書の有効性を確認します。
PHPにOpenSSL拡張機能が有効になっていることを確認してください。
正しい暗号化プロトコルを構成します。
PHPとOpenSSLバージョンの互換性を確認してください。
サーバー側のSSL設定を構成およびデバッグします。
上記の方法により、暗号化された接続を正常に確立するために、 Stream_Socket_Enable_Crypto関数のエラーの問題を効果的に解決できるはずです。