当前位置: 首页 > 面试题库 >

如何使用python检索远程主机的TLS / SSL对等证书?

陈文景
2023-03-14
问题内容

我需要浏览IP列表,并从该IP上的证书中检索通用名称(对于每个允许端口443连接的IP)。我已经能够使用套接字和ssl模块成功完成此操作。它适用于具有有效的已签名证书的所有IP,但不适用于自签名证书。

如果我使用此方法,则它需要由我的CA捆绑包验证的有效证书:

from socket import socket
import ssl

s = socket()
c = ssl.wrap_socket(s,cert_reqs=ssl.CERT_REQUIRED, ca_certs='ca-bundle.crt')
c.connect(('127.0.0.1', 443))

print c.getpeercert()

如果我删除,cert_reqs=ssl.CERT_REQUIRED那么它将连接但根本无法获得证书。

无论证书是否通过ca-bundle进行验证,如何在IP上检索证书的通用名称?


问题答案:

python ssl库似乎只有在具有有效签名的情况下才能为您解析证书。

    """Returns a formatted vershtml" target="_blank">ion of the data in the
    certificate provided by the other end of the SSL channel.
    Return None if no certificate was provided, {} if a
    certificate was provided, but not validated."""

您仍然可以使用该ssl.get_server_certificate()功能获取服务器证书,但是它将以PEM格式返回。(或者,您可以调用c.getpeercert(True),以二进制DER格式返回证书,而不管其是否经过验证。)

>>> print ssl.get_server_certificate(('server.test.com', 443))
-----BEGIN CERTIFICATE-----
MIID4zCCAsugAwIBA.....

从这里,我将使用M2Crypto或OpenSSL来读取证书并获取值:

    # M2Crypto
    cert = ssl.get_server_certificate(('www.google.com', 443))
    x509 = M2Crypto.X509.load_cert_string(cert)
    x509.get_subject().as_text()
    # 'C=US, ST=California, L=Mountain View, O=Google Inc, CN=www.google.com'

    # OpenSSL
    x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
    x509.get_subject().get_components()
    #[('C', 'US'),
    # ('ST', 'California'),
    # ('L', 'Mountain View'),
    # ('O', 'Google Inc'),
    # ('CN', 'www.google.com')]


 类似资料:
  • 我正试图将我的Spring Boot项目配置为对第三方IDP使用SAML身份验证。我已经实现了使vdenotaris中的配置与SSOCycle提供程序一起工作,现在我想将其切换到其他提供程序。 SAML元数据endpoint启用了HTTPS,我已经创建了一个密钥库,其中包含元数据中给出的证书(用于签名和加密)和HTTPendpoint提供的证书(基于此答案)。然后,我将它们保存在证书文件($CER

  • 问题内容: 如何使用Python解码经过pem编码的(base64)证书?例如,这来自github.com: 根据ssl-shopper的说法,应该是这样的: 如何使用python获取此纯文本? 问题答案: Python的标准库,即使是最新版本,也不包含任何可解码X.509证书的内容。但是,附加软件包确实支持此功能。引用文档中的示例: 另一个可选的附加软件包是。这是围绕OpenSSL C API的

  • 问题内容: 我正在尝试读取TLS消息。具体来说,是带有证书详细信息(handshake_type = 11)的证书。我正在做的是先检查邮件中是否包含。如果是这样,我将像这样提取有效负载:。接下来,我要检查 第一个 字节是,接下来的两个字节需要是正确的TLS版本。 问题在于此消息没有通过这些条件。WireShark向我显示了位置上的字节(已附加图片),但是我想这样做是为了方便。 那么我的假设是有效载

  • 问题内容: 我正在尝试编写一个集成测试,其中我们的测试使用Simple启动一个嵌入式HTTPS服务器。我使用创建了自签名证书,keytool并能够使用浏览器(特别是Chrome浏览器)访问服务器,并且收到有关自签名证书的警告。 但是,当我尝试使用Spring RestTemplate进行连接时,出现ResourceAccessException: 从其他问题和博客 文章中,我已经看到了Hostna

  • 今天数据隐私是一个十分关注的问题,作为开发人员,我们需要准备好解决这个问题。至少我们需要熟悉加密协议 SSL 和 TLS 等之上的其他协议实现数据安全。作为一个 HTTPS 网站的用户,你是安全。当然,这些协议是广泛不基于 http 的应用程序,例如安全SMTP(SMTPS)邮件服务,甚至关系数据库系统。 为了支持 SSL/TLS,Java 提供了 javax.net.ssl API 的类SslC

  • 问题内容: 我正在开发一个Android应用,并且需要访问一个HTTPS地址。我正在使用Volley来请求我的数据,但现在却收到此错误 要获得SSL工厂,我需要这样做: 队列初始化: 这是堆栈跟踪: 我搜索了错误,但没有找到适合我的情况的内容。谁能帮我? 问题答案: 让我们假设你的服务器的应用程序是具有服务器证书中的服务器机内托管的,例如。然后,在验证方法内部,您可以验证。 您可以通过以下链接阅读