繁体   English   中英

Python tcp socket with ssl encryption [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)

[英]Python tcp socket with ssl encryption [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)

我正在使用 Windows 10 计算机和 Windows 10 虚拟机。 我创建了一个 tcp 套接字服务器/客户端应用程序,该应用程序通过 python ssl 保护。 我的代码如下所示:

服务器:

context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.set_ciphers('ECDHE-ECDSA-AES256-GCM-SHA384') 
context.load_cert_chain(certfile="cert.pem", keyfile="prKey.pem")

tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpsock.bind((ip, port))
    
ssocket = context.wrap_socket(tcpsock, server_side=True)

客户:

context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True
context.load_verify_locations("cert.pem")

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssock = context.wrap_socket(sock, server_hostname=server_ip)

我的朋友创建了一个官方证书用于我的服务器端身份验证。 如果我理解正确,这是通过 OpenSSL 创建和验证的。 但是,当我尝试使用我的客户端连接到正在运行的服务器时,我收到以下错误消息(客户端错误):

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)

我将证书 + 匹配的私钥(pem 格式)放在虚拟机上,并且在我的本地主机上有一份证书(pem 格式)的副本。

我还有一个 cer 文件格式的证书,我将它安装到根 windows 证书存储(客户端和服务器端)。

由于这不起作用,我一直在研究并发现有关certifi的信息。 我安装了它,并通过使用print(certifi.where())找到了一个cacert.pem文件。 其中包含多个证书。 我通过复制和粘贴将我的朋友证书添加到该文件,安全,但我仍然收到相同的错误。

现在我真的有点迷失了什么是错的。 当我禁用context.verify_mode = ssl.CERT_REQUIRED我的代码工作得很好,但我真的想要我的代码的服务器端身份验证..

我将客户的代码更改为:

context = ssl.create_default_context()
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssock = context.wrap_socket(sock, server_hostname=self.ip)

这样我就不必手动交出证书文件。 相反,似乎我的 Windows 根证书库被扫描并自动找到我的 VM 证书(因为我安装了 .cer 文件)。


在服务器端,我只需要传递 certificate.cer 文件而不是 pem 格式。
 context.load_cert_chain(certfile="cert.cer", keyfile="prKey.pem")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM