PyOpenSSL从具有未知主机名的SNI主机获取服务器证书

时间:2016-08-17 09:50:09

标签: python sockets openssl pyopenssl

我的代码示例:

    import OpenSSL
    import socket

    ctx = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD)
    s = socket.socket(AF_INET, SOCK_STREAM)
    connection = OpenSSL.SSL.Connection(ctx, s)
    connection.connect((str(ip), port))
    connection.setblocking(1)
    connection.do_handshake()
    chain = connection.get_peer_cert_chain()

如果主机有SNI扩展,我会收到错误:

  

[('SSL例程','SSL3_READ_BYTES','sslv3警报握手失败')]

我相信我可以使用OpenSSL.SSL.Connection.set_tlsext_host_name(name)来解决这个问题,但是对于用户主机名是未知的,我想连接到每个可用的主机名。

所以我的问题是:有没有办法通过ip连接到主机并检索所有提供证书的可用主机名?或者有没有办法从SNI主机中检索所有证书?

1 个答案:

答案 0 :(得分:0)

  

有没有办法通过ip连接到主机并检索所有提供证书的可用主机名?或者有没有办法从SNI主机中检索所有证书?

使用HTTPS无法做到这一点。如果您很幸运,您可以收集有关服务器上某处可能的主机名的信息,或者通过嗅探解析到服务器IP的DNS查找,或者使用其他方法来确定哪些名称属于此IP地址:How can I find all the domain names that resolve to one ip address? < / p>