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

Python使用ssl.getpeercert()从URL获取通用名称

富锦
2023-03-14
问题内容

我正在尝试获取证书颁发者信息(通用名称),但是链接中的代码不适用于某些URL。

import ssl, socket

hostname = 'google.com'
ctx = ssl.create_default_context()
s = ctx.wrap_socket(socket.socket(), server_hostname=hostname)
s.connect((hostname, 443))
cert = s.getpeercert()

subject = dict(x[0] for x in cert['subject'])
issued_to = subject['commonName']

>>> issued_to
u'*.google.com'

例如,我尝试使用主机名“ cds.ca”,它说

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)

但我仍然可以使用Internet Explorer(* .cds.ca)来获得通用名称

所以我认为我应该使用自己的证书(.cer)而不是使用getpeercert(),那么我应该如何更改该行?

或者,还有其他方法可以使用我自己的证书文件来实现CN吗?


问题答案:

如果您仅想获取CN或其他证书详细信息,那么无论证书验证成功与否,都必须禁用验证。不幸的是sock.getpeercert(),设计简单的遗嘱只有在禁用证书验证后才返回空字典。这就是为什么必须使用它sock.getpeercert(True)来获取证书的二进制表示并使用OpenSSL.crypto从中提取CN的原因:

import socket
import ssl
import OpenSSL.crypto as crypto

dst = ('cds.ca',443)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(dst)

# upgrade the socket to SSL without checking the certificate
# !!!! don't transfer any sensitive data over this socket !!!!
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
s = ctx.wrap_socket(s, server_hostname=dst[0])

# get certificate
cert_bin = s.getpeercert(True)
x509 = crypto.load_certificate(crypto.FILETYPE_ASN1,cert_bin)
print("CN=" + x509.get_subject().CN)


 类似资料:
  • 问题内容: 例如,地址为: 我想将子域保存到变量中,这样我就可以这样做; 问题答案: 会将URL拆分为协议,位置,端口等。然后,您可以通过拆分位置来获得子域。

  • 问题内容: 当用户访问在我的flask应用程序上运行的URL时,我希望Web服务能够处理问号后指定的参数: 问题答案: 使用得到解析查询字符串的内容:

  • 问题内容: 当我尝试从JSON字符串检索值时,它给了我一个错误: 但是,如果我遍历数据,它将为我提供元素(和),而不是值: 哪个返回: 我需要怎么做才能得到and 的值?(和) 问题答案: 如果要遍历字典的键和值,请执行以下操作:

  • 问题内容: 在我的Django应用中,我需要从引荐来源网址中获取主机名及其协议,以便从类似以下网址的网址中获取: https://docs.google.com/spreadsheet/ccc?key=blah-blah-blah-blah#gid=1 https://stackoverflow.com/questions/1234567/blah-blah-blah-blah http://ww

  • 问题内容: 在JSP中,如何从URL获取参数? 例如,我有一个www.somesite.com/Transaction_List.jsp?accountID=5 要获取的 URL5 。 是否有request.getAttribute(“ accountID”)之类的会话或类似内容? 问题答案: 在GET请求中,请求参数取自查询字符串(URL上问号后面的数据)。例如,URL http://hostn

  • 问题内容: 我有一个类似的网址: 如何使用jQuery 获取锚点值并将其存储为变量? 问题答案: 您可以使用和,如下所示: 如果其中可能没有,请执行以下检查: 如果这是 当前 页面的URL,则可以使用它来获取它,并根据需要替换。