用于检查 ROOT SSL 证书的 Python 脚本

发布于 2025-01-11 12:23:16 字数 1166 浏览 0 评论 0原文

我想编写一个脚本,可以从其从属 CA 验证根 CA 证书。目前我只能返回最低级别的证书。 (例如,如果您查看此网页的证书路径,脚本将返回 R3 颁发的证书,但我需要获取 ISRG 根 X1。)

我用来从主机名如下:

'''

def get_certificate(hostname, port):
hostname_idna = idna.encode(hostname)
sock = socket()

sock.connect((hostname, port))
peername = sock.getpeername()
ctx = SSL.Context(SSL.SSLv23_METHOD) # most compatible
ctx.check_hostname = False
ctx.verify_mode = SSL.VERIFY_NONE

sock_ssl = SSL.Connection(ctx, sock)
sock_ssl.set_connect_state()
sock_ssl.set_tlsext_host_name(hostname_idna)
sock_ssl.do_handshake()
cert = sock_ssl.get_peer_certificate()
crypto_cert = cert.to_cryptography()
sock_ssl.close()
sock.close()

return HostInfo(cert=crypto_cert, peername=peername, hostname=hostname)

def get_common_name(cert):
try:
    names = cert.subject.get_attributes_for_oid(NameOID.COMMON_NAME)
    return names[0].value
except x509.ExtensionNotFound:
    return None

def get_issuer(cert):
try:
    names = cert.issuer.get_attributes_for_oid(NameOID.COMMON_NAME)
    return names[0].value
except x509.ExtensionNotFound:
    return None

'''

我不知道如何爬上权限链从其下级找到 ROOT CA。 有谁知道如何从第 2 层或第 3 层证书返回根/第 1 层 CA?

I want to write a script that can verify a root CA certificate from its subordinate CA. Currently, I can only return the lowest level certificate.
(For example, if you view the certification path for this web page, the script would return the certificate issued by R3, but I need to get the ISRG Root X1.)

Some of the code I'm using to pull a certificate from a hostname is as follows:

'''

def get_certificate(hostname, port):
hostname_idna = idna.encode(hostname)
sock = socket()

sock.connect((hostname, port))
peername = sock.getpeername()
ctx = SSL.Context(SSL.SSLv23_METHOD) # most compatible
ctx.check_hostname = False
ctx.verify_mode = SSL.VERIFY_NONE

sock_ssl = SSL.Connection(ctx, sock)
sock_ssl.set_connect_state()
sock_ssl.set_tlsext_host_name(hostname_idna)
sock_ssl.do_handshake()
cert = sock_ssl.get_peer_certificate()
crypto_cert = cert.to_cryptography()
sock_ssl.close()
sock.close()

return HostInfo(cert=crypto_cert, peername=peername, hostname=hostname)

def get_common_name(cert):
try:
    names = cert.subject.get_attributes_for_oid(NameOID.COMMON_NAME)
    return names[0].value
except x509.ExtensionNotFound:
    return None

def get_issuer(cert):
try:
    names = cert.issuer.get_attributes_for_oid(NameOID.COMMON_NAME)
    return names[0].value
except x509.ExtensionNotFound:
    return None

'''

I'm not sure how to climb the chain of authority to find the ROOT CA from its subordinate levels.
Does anyone know how to return the root/tier 1 CA from its tier 2 or 3 certs?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文