Python 3.6 SSL - 使用TLSv1.0而不是TLSv1.2密码 - (2路身份验证和自签名证书)

时间:2018-02-28 19:01:19

标签: python python-3.x ssl openssl tls1.2

我正在使用带有python 3.6的ssl库。我正在使用我用openssl生成的自签名ECDSA证书。

服务器/客户端代码:

# Create a context in TLSv1.2, requiring a certificate (2-way auth)
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.options |= ssl.OP_NO_TLSv1
context.options |= ssl.OP_NO_TLSv1_1
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True # This line ommited in server code

# Set the list of allowed ciphers to those with key length of at least 128
# TODO Figure out why this isn't working
context.set_ciphers('TLSv1.2+HIGH+SHA256+ECDSA')

# Print some info about the connection
for cipher in context.get_ciphers():
    print(cipher)

输出:

{'id': 50380835, 'name': 'ECDHE-ECDSA-AES128-SHA256', 'protocol': 'TLSv1/SSLv3', 'description': 'ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256', 'strength_bits': 128, 'alg_bits': 128}

当前密码:

 connection.cipher()

('ECDHE-ECDSA-AES128-SHA256','TLSv1 / SSLv3',128)

我的问题:为什么选择的密码不是TLSv1.2?

修改:请求的屏幕截图

enter image description here

enter image description here

基于另一个线程,我尝试将我的代码更改为以下内容,但没有任何成功。

 # Create a context in TLSv1.2, requiring a certificate (2-way auth)
    self.context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
    self.context.options |= ssl.OP_NO_SSLv2
    self.context.options |= ssl.OP_NO_SSLv3
    self.context.options |= ssl.OP_NO_TLSv1
    self.context.options |= ssl.OP_NO_TLSv1_1
    self.context.verify_mode = ssl.CERT_REQUIRED
    # self.context.check_hostname = True

    # Set the list of allowed ciphers to those with high key length
    # I went with  SHA384 because it seemed to have more security
    self.context.set_ciphers('TLSv1.2+ECDSA+HIGH')

2 个答案:

答案 0 :(得分:1)

此密码与TLS 1.2兼容,它是RFC 5289中定义的普通密码。

我认为我们需要在某种程度上解释Python的文档以了解get_ciphers()返回的内容,因为它没有被解释。但cipher()给了我们答案:

  

SSLSocket.cipher()

     

返回一个三值元组,其中包含正在使用的密码的名称,定义其使用的SSL协议的版本,以及   正在使用的秘密位数。如果没有连接   建立,返回无。

网络捕获将确认TLS协议版本。

答案 1 :(得分:0)

您正在寻找SSLSocket.version()


根据欧仁·阿德尔(EugèneAdell)的答案,为什么SSLSocket.cipher()不能给您期望的结果,python calls SSL_CIPHER_get_version()的文档显示:

...返回表示最初定义密码的SSL / TLS协议版本的字符串。当前是SSLv2或TLSv1 / SSLv3。在某些情况下,它可能应该返回“ TLSv1.2”,但不会返回;使用SSL_CIPHER_description()代替。