python - 以下哪个 SSL 证书版本是正确的?
问题描述
我对 SSL 证书不太熟悉。我尝试使用两个不同的函数检索 SSL 证书版本。一种使用 OpenSSL 库,一种使用内置方法。它们为同一域名返回不同的版本号。哪一个是正确的?
这是 Python 3 的代码。
# -*- coding: utf-8 -*-
import socket
import OpenSSL
import ssl
def get_ssl_cert1(host, port=443):
conn = ssl.create_connection((host, port))
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
sock = context.wrap_socket(conn, server_hostname=host)
certificate = ssl.DER_cert_to_PEM_cert(sock.getpeercert(True))
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, certificate)
print("Certificate version from method 1: ", x509.get_version())
def get_ssl_cert2(host, port=443):
ctx = ssl.create_default_context()
s = ctx.wrap_socket(socket.socket(), server_hostname=host)
s.connect((host, port))
cert = s.getpeercert()
print("Certificate version from method 2: ", cert['version'])
if __name__ == "__main__":
host = 'www.google.com'
get_ssl_cert1(host)
get_ssl_cert2(host)
结果:
Certificate version from method 1: 2
Certificate version from method 2: 3
我希望结果是一样的。
解决方案
方法 2 显示实际的 x509 版本,而方法 1 显示基于零的 x509 版本,其中 0=v1, 1=v2, 2=v3.. 所以在实践中,它们都显示使用了版本 3。你可以自己试试这个openssl x509 -text -in YOURCERT.pem
,你会得到类似的东西
Certificate:
Data:
Version: 3 (0x2)
您可以看到,版本 3 已给出,但括号中还有一个十六进制值 (2),它基于从零开始的版本控制。这只是您的哪个库使用哪种方法的问题
推荐阅读
- javascript - return 语句显然没有返回任何东西
- automated-tests - TestCafe - 在某些 HTML 元素上时如何确定鼠标光标(指针)的形状
- html - 我们如何自动将不同的 SVG 路径居中到它们的视口中?
- c# - 如果从数据库中获取日期,如何获取日期前 3 天?
- python - 全局对齐两个字符串并返回python中不匹配和插入/缺失字符的索引
- ios - iOS 应用程序 - 在某些设备上无法通过蜂窝网络访问我们的域
- php - 在 Heroku 和匹配域上强制 https 破坏本地 WAMP 环境
- reactjs - 尝试使用 /:id 访问路由时,React 路由会给出 404
- sql - 如何在 SQL 中创建多个参照完整性条件
- php - 如何在不需要客户 ID 的情况下验证 Magento 2 中的优惠券