![](/img/trans.png)
[英]PyMongo [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
[英]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 文件)。
context.load_cert_chain(certfile="cert.cer", keyfile="prKey.pem")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.