Python:证书验证失败:使用SSL Package 程序时无法获取本地颁发者证书

gopyfrb3  于 2022-11-14  发布在  Python
关注(0)|答案(1)|浏览(214)

在Python中,我编写了一个简单的FTP服务器和客户端,我想用TLS来保护它,为此,我使用了Python提供的TLS/SSL Package 器。
我的问题是在客户端运行socket.connect时总是会出现以下错误:
发生异常:SSL证书验证错误[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地颁发者证书(_ssl.c:1123)文件“/work/Python/hisreportClient/hsireportClient.py“,第167行,在f_socket.connect(f_server)中
下面是我在服务器端开始监听的方法:

from socketserver import ThreadingTCPServer
from app.mod_report.controlersTCP import tcpRequestHandler
import ssl

...

sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
sslcontext.load_cert_chain('/work/Python/hoaReport/ssl/hoizey_net.crt','/work/Python/hoaReport/ssl/certificat.key')

f_listen = ('0.0.0.0', 6667)            # TODO : Paraméter le port en base de données
f_server=ThreadingTCPServer(f_listen, tcpRequestHandler)
f_server.socket=sslcontext.wrap_socket(f_server.socket, server_side=True)
f_server.serve_forever()

以及如何连接到客户端的服务器:

from socket import socket, AF_INET, SOCK_STREAM, IPPROTO_TCP, TCP_NODELAY
from ssl import SSLContext, PROTOCOL_TLS_CLIENT, CERT_REQUIRED
from certifi import where as certifi_where

...

# Creates SSL Context
f_context = SSLContext(PROTOCOL_TLS_CLIENT)
f_context.verify_mode=CERT_REQUIRED
f_context.load_verify_locations(cafile=path.relpath(certifi_where()), capath=None, cadata=None)

# Opens the socket and connets to the server
f_socket=socket(AF_INET, SOCK_STREAM)
f_socket=f_context.wrap_socket(f_socket, server_hostname=f_serverHost)

f_serverPort=int(f_serverPort)
f_server=(f_serverHost, f_serverPort)

f_socket.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
f_socket.setblocking(True)
f_socket.connect(f_server)

我的服务器证书已经被Comodo签署了,我检查了CA根证书是否存在于certifici.where()指向的文件中。
当然,如果我删除SSL Package 器,一切都会正常工作。
我搜索了很多关于这个问题,我注意到它发生相当频繁,但我找不到一个解决方案,我不得不承认我不明白出了什么问题。
拜托,有谁能帮忙吗?
谢谢你,谢谢你

j9per5c4

j9per5c41#

在Steffen Ullrich的帮助下,我设法让我的证书按预期的那样工作。
我只需要在我的证书文件中添加所有中介证书,就完成了工作。
多谢你的帮忙

相关问题