如何允许python信任我的服务器的TLS自签名证书:ssl.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败

时间:2018-04-27 08:19:49

标签: python sockets ssl network-programming

这不是this post的重复。我在那里尝试了解决方案,在我的情况下没有任何作用

我正在使用Windows和Python 3.6.5。我有一个TLS客户端的python脚本。我需要连接的服务器使用自签名证书。当我尝试使用我的脚本连接到它时,我收到此错误:

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)

我需要解析证书。我尝试将服务器的证书.pem内容添加到名为cacert.pem的文件中,该文件位于:C:\Python36\Lib\site-packages\certifi并再次运行该程序。没有什么变化。这是我的脚本。请帮助我让客户端为此服务器设置例外,因为我信任它的证书。

import socket, ssl
import itertools

context = ssl.SSLContext() 
context.verify_mode = ssl.CERT_OPTIONAL 
context.check_hostname = False

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
domain="192.168.56.3" # my server
ssl_sock = context.wrap_socket(s, server_hostname=domain)
ssl_sock.connect((domain, 443))

print("====== peer's certificate ======")
try:
    cert = ssl_sock.getpeercert()
    print(cert)
except SSLError as e:
    print("Error: ",e)
ssl_sock.close()

1 个答案:

答案 0 :(得分:1)

这个问题已经闲置了一段时间,但是如果有人仍在努力通过Python ssl库使用自签名证书连接到服务器,则该问题:

您可以使用load_verify_locations的{​​{1}}方法来指定自定义的自签名根证书(请参阅Python Docs for load_verify_locations)。

上述代码可以扩展如下:

SSLContext

请注意,如果要使用具有相同客户端/上下文的公共证书连接到其他服务器,还需要包括公共根证书。 (例如,您可以将... context = ssl.SSLContext() context.verify_mode = ssl.CERT_OPTIONAL context.check_hostname = False context.load_verify_locations(cafile='/path/to/your/cacert.pem') ... 的内容附加到证书根证书中,并引用该文件夹/路径)。

另请参阅此Python文档段落以获取更多信息:client-side operations