在服务器上,我使用我的私钥初始化SSLContext,这是我从caroot.crt文件加载的CA提供的certfile。现在,当我用节点之类的东西初始化它时,一切正常(例如:Setting up SSL with node.js)。我的意图是以同样的方式设置一切。我的假设是,在握手期间,服务器正在为客户端提供CA,就像我的节点服务器一样。似乎并非如此。我做错了什么?
如果没有使用ssl.CERT_REQUIRED,一切都运行正常,但我想验证端点(服务器)是否是他们所说的。
# Server
import socket
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.load_cert_chain(certfile='./path/to/certfile.crt',
keyfile='./path/to/keyfile.pem')
context.load_verify_locations('./path/to/caroot.crt')
context.set_default_verify_paths()
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('', 23000))
server_socket.listen(socket.SOMAXCONN)
def handle_client(ssl_socket):
data = ssl_socket.read()
while data:
print("%s" % (str(data)))
data = ssl_socket.read()
while True:
client_socket, addr = server_socket.accept()
ssl_client_socket = context.wrap_socket(client_socket, server_side=True)
handle_client(ssl_client_socket)
# Client
import socket
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
# I'm assuming this is not necessary, but I'd like to load the system provided CAs
context.set_default_verify_paths()
# Require CA validation to prevent MITM.
context.verify_mode = ssl.CERT_REQUIRED
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_client = context.wrap_socket(client_socket)
ssl_client.connect(('', 23000))
ssl_client.send(bytes('hello, world!', 'UTF-8'))
答案 0 :(得分:0)
事实证明,我的CA提供了3个不同的crt文件。我的解决方案是按特定顺序附加它们以生成传递给context.load_verify_locations
的正确CA链。
对于使用COMODO作为提供者的任何人,这里有一篇博文:http://billpatrianakos.me/blog/2014/04/04/installing-comodo-positive-ssl-certs-on-apache-and-openssl/
当然,该帖子是Apache特有的,前提仍然是相同的。有问题的命令是:
cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > yourdomain.com.cer
然后你做:
context.load_verify_locations('yourdomain.com.cer')
现在一切都按预期工作。