【问题标题】:How to get current cipher in pyOpenSSL for DTLS如何在 pyOpenSSL 中为 DTLS 获取当前密码
【发布时间】:2014-06-28 07:24:59
【问题描述】:

我需要在 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))

打印的结果是 (无)

【问题讨论】:

    标签: python openssl handshake pyopenssl dtls


    【解决方案1】:

    结果为无,因为这是为您的连接协商的密码。或者更确切地说,它是 None 因为 no 密码已经为您的连接协商。密码选择是握手的一部分,并且在此示例中的任何地方都没有进行握手。

    在拨打SSL_get_current_cipher之前尝试con.do_handshake()

    还请记住,_-前缀名称是私有的,如果您希望您的程序继续使用 pyOpenSSL 的未来版本,您真的不应该使用它们。

    【讨论】:

    • 尝试握手,但它永远挂起。关于“_”,除了通过本机 C 调用之外,没有其他方法可以获取 DTLS 内容,因为 pyOpenSSL 没有实现 DTLS 方法和 SSL_get_current-cipher 函数。同样在 TCP 情况下,连接确实包括握手。我已经在普通 C 中看到了用于 DTLS 的示例,其中调用 connect 而不调用 do_handshake。不幸的是,我没有在 Python 中看到任何工作示例。感谢您的回答。
    • 如果您无法完成握手,那么您还有另一个问题。也许您将 DTLS 支持整合在一起的方式实际上并不奏效。
    • 不太可能。如果您解压缩 pyOpenSSL.egg 并检查 SSL.py,您会发现它只是原生 C lib 的一个非常薄的包装器,除了并非所有 C 函数和 SSL 方法都已被包装。我所做的与 SSL.py 中的相同 - 包装缺少的 C 函数和 SSL 方法。我认为,对我来说一个合理的方法是先用纯 C 测试它,以完全排除恶意黑客攻击的可能性。
    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 2020-03-29
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2023-03-13
    相关资源
    最近更新 更多