Websocket服务器不接受签名的客户端证书

时间:2020-06-19 13:53:21

标签: ssl certificate python websocket

要在构建其ssl上下文的python websocket服务器中设置身份验证,例如:

ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain('certificates/server_cert.pem', 'certificates/server_key.pem')
ctx.verify_mode = ssl.CERT_REQUIRED
ctx.load_verify_locations('certificates/bob_cert.pem')

按照here中的示例(仅用于创建证书),我创建了三个密钥对和证书,一个用于websocket服务器,两个用于客户端证书。如示例中所述,我用服务器证书对alice的证书进行了签名,而bob的证书是自签名的。

如果现在我通过bob的证书进行连接,并如上所述在服务器中设置verify_locations,则bob会神奇地进入服务器(该服务器不执行任何操作,然后回显您发送的内容)。 但是,如果我通过alice的证书(由服务器证书签名)进行连接,则不会被接受-得到ConnectionResetError时,上述代码中的参数verify_locations当然会被设置为接受 alice_cert。 pem 。为了完成操作,请在下面找到用于客户端的ssl上下文创建的代码(此处为bob):

ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ctx.check_hostname = True
ctx.load_verify_locations('certificates/server_cert.pem')
ctx.verify_mode = ssl.CERT_REQUIRED
ctx.load_cert_chain('certificates/bob_cert.pem', 'certificates/bob_key.pem')

我在做什么错或者在哪里误解了我所遵循的教程(上面的链接),如何使用bob使用不相关的(与服务器证书相关的)自签名证书(ISSUER CN = bob,SUBJ CN = bob)获得访问权,而由服务器证书(ISSUER CN = localhost,SUBJ CN = alice)签名的alice证书却被拒绝了?

1 个答案:

答案 0 :(得分:0)

好,发现问题。正如example所述,人们应该将 server_cert.pem 放在websocket服务器ssl上下文中的load_verify_locations中。现在可以按预期的方式运行。.爱丽丝进入,鲍勃没有。