如何在pyOpenSSL中获取DTLS当前密码套件

1 投票
1 回答
2559 浏览
提问于 2025-04-18 06:07

我需要在pyOpenSSL中获取DTLS协议的协商密码。对于TCP套接字,我已经成功实现了,但在处理数据报时就没那么简单了。请提供一个C或Python的示例。这是我到目前为止尝试的内容:

import socket
from OpenSSL import SSL
from OpenSSL._util import (
    ffi as _ffi,
    lib as _lib)


DTLSv1_METHOD = 7
SSL.Context._methods[DTLSv1_METHOD]=getattr(_lib, "DTLSv1_client_method")
ctx = SSL.Context(DTLSv1_METHOD)
ctx.set_cipher_list('AES128-SHA')
ctx.use_certificate_file("path-to-cert.pem")
ctx.use_privatekey_file("path-to-key.pem")
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('dtls-host', 443))
con = SSL.Connection(ctx, s)
con.set_connect_state()
con.connect(('dtls-host', 443))
cc = _lib.SSL_get_current_cipher(con._ssl)
print _ffi.string( _lib.SSL_CIPHER_get_name(cc))

打印的结果是 (None)

1 个回答

1

结果是None,因为这是你连接时协商的加密方式。更准确地说,是因为目前还没有为你的连接协商出任何加密方式。加密方式的选择是在握手过程中进行的,而在这个例子中,握手还没有完成。

在调用 SSL_get_current_cipher 之前,试试 con.do_handshake()

另外要记住,以 _ 开头的名字是私有的,如果你希望你的程序在未来的pyOpenSSL版本中继续正常工作,最好不要使用这些私有名称。

撰写回答