Какая из следующих версий SSL-сертификата является правильной?

#python #ssl #ssl-certificate

#python #ssl #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
  

Я ожидал, что результаты будут такими же.

Комментарии:

1. Возможно, один из них возвращает числовое значение поля версии (2), а другой выдает «логическую версию» (3)? (0 — v1, 1 — v2, 2 — v3)

2. Да, это было так. Спасибо!

Ответ №1:

Метод 2 показывает фактическую версию x509, в то время как метод 1 показывает версию x509 на основе нуля, где 0 = v1, 1 = v2, 2 = v3.. Таким образом, на практике они оба показывают, что используется версия 3. Вы можете попробовать это самостоятельно, используя openssl x509 -text -in YOURCERT.pem , и вы получите что-то вроде

 Certificate:
    Data:
        Version: 3 (0x2)
  

и вы можете видеть, что указана версия 3, но также в скобках указано шестнадцатеричное значение (2), основанное на управлении версиями на основе нуля. Это просто вопрос того, какая из ваших библиотек использует какой метод