📌  相关文章
📜  stream_socket_enable_crypto():ssl 操作失败,代码为 1.openssl 错误消息:error:1416f086:sslroutines:tls_process_server_certificate:certificate verify failed (1)

📅  最后修改于: 2023-12-03 14:47:43.476000             🧑  作者: Mango

stream_socket_enable_crypto(): SSL操作失败, 代码为 1. OpenSSL 错误消息: error:1416f086:sslroutines:tls_process_server_certificate: certificate verify failed

介绍

该错误通常意味着 SSL 连接的证书验证失败。SSL 连接是一种加密的网络通信协议,它为服务器和客户端提供了安全的数据传输方式。SSL 证书是一种包含公钥和其他信息的数字证书,用于证明服务器的身份。在 SSL 握手期间,客户端会检查服务器的 SSL 证书是否是由合法的证书机构颁发的,以此来验证服务器的身份。

当连接的 SSL 证书不能被验证时,就会发生这个错误。这可能是因为 SSL 证书已经过期、由自签名证书机构颁发、或者证书计算机的系统时间不正确。如果 SSL 证书不被信任,那么网络通信就不会建立,而 stream_socket_enable_crypto() 将返回该错误。

解决方案

要解决这个问题,需要解决证书验证失败的问题。以下是一些可能的解决方法:

  1. 检查服务器的 SSL 证书是否合法,是否由受信任的证书机构颁发的。如果你是管理员或拥有服务器的访问权限,可以通过检查 SSL 证书的完整性、颁发机构和证书链的有效性等方式来解决该问题。

  2. 检查客户端的系统时间是否正确。如果客户端的系统时间不正确,它将不能正确地验证 SSL 证书的过期日期。确保客户端的时钟正确同步和更新,以保证正确的验证。

  3. 尝试手动验证 SSL 证书。可以使用 OpenSSL 工具来手动验证 SSL 证书的有效性。这将提供有关 SSL 证书的重要信息,例如证书颁发机构、证书链和证书是否已过期。可以使用以下命令来验证 SSL 证书:

    openssl s_client -connect <host>:<port> -showcerts
    

    例如,要验证 example.com 的 SSL 证书,可以使用以下命令:

    openssl s_client -connect example.com:443 -showcerts
    
  4. 禁用证书验证。如果 SSL 证书无法正确验证,可能需要禁用 SSL 证书验证。这不是一个建议的解决方案,因为它会降低 SSL 连接的安全性。如果必须禁用证书验证,请使用以下命令:

    stream_context_set_option($streamCtx, 'ssl', 'verify_peer', false);
    stream_context_set_option($streamCtx, 'ssl', 'verify_peer_name', false);
    

    这将禁用证书验证和证书名称检查,并允许通过所有 SSL 证书。请注意,禁用证书验证将使 SSL 连接容易受到中间人攻击。