在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 器,一切都会正常工作。
我搜索了很多关于这个问题,我注意到它发生相当频繁,但我找不到一个解决方案,我不得不承认我不明白出了什么问题。
拜托,有谁能帮忙吗?
谢谢你,谢谢你
1条答案
按热度按时间j9per5c41#
在Steffen Ullrich的帮助下,我设法让我的证书按预期的那样工作。
我只需要在我的证书文件中添加所有中介证书,就完成了工作。
多谢你的帮忙