DevToys Pro

бесплатные веб-инструменты для разработчиков

Блог
Оцените нас:
Попробуйте расширение для браузера:
← Назад к блогу

Декодирование сертификатов X.509

16 мин чтения

Вам нужно проверить TLS сертификат, отладить ошибки SSL или извлечь детали сертификата для аутентификации. Но сертификаты X.509 закодированы в бинарных форматах, содержат криптичные OID'ы и включают расширения со сложными назначениями. Понимание того, как декодировать сертификаты и интерпретировать их поля, необходимо для аудита безопасности, устранения неполадок HTTPS-соединений и реализации аутентификации на основе сертификатов.

Что такое сертификат X.509?

Сертификат X.509 — это цифровой документ, который связывает открытый ключ с идентификацией (доменным именем, организацией или человеком). Это основа TLS/SSL, обеспечивающая безопасные HTTPS-соединения и цифровые подписи.

Сертификаты содержат:

  • Субъект: Кому выдан сертификат (CN=example.com, O=Company)
  • Издатель: Кто выдал сертификат (Центр сертификации)
  • Открытый ключ: Криптографический ключ для шифрования/проверки
  • Период действия: Даты "Не ранее" / "Не позднее"
  • Расширения: Дополнительные ограничения и назначения (SAN, EKU и т.д.)
  • Подпись: Цифровая подпись CA, подтверждающая подлинность

PEM vs DER: Форматы сертификатов

Сертификаты X.509 могут быть закодированы в двух основных форматах:

PEM (Privacy-Enhanced Mail)

PEM — это данные DER, закодированные в Base64 и обёрнутые строками заголовка/подвала. Это читаемый человеком и наиболее распространённый формат для веб-сертификатов.

-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKL0UG+mRqqUMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRAwDgYDVQQHDAdPYWtsYW5kMQ8w
DQYDVQQKDAZFeGFtcGxlMB4XDTE2MDQwODA4NDEzNFoXDTI2MDQwNjA4NDEzNFow
...
-----END CERTIFICATE-----

Особенности:

  • Текстовый формат, можно копировать/вставлять
  • Расширения файлов: .pem, .crt, .cer
  • Используется Apache, Nginx, OpenSSL
  • Может содержать несколько сертификатов (цепочку сертификатов)

DER (Distinguished Encoding Rules)

DER — это бинарное кодирование ASN.1. Более компактное, но не читаемое человеком.

30 82 03 5d 30 82 02 45 a0 03 02 01 02 02 09 00
a2 f4 50 6f a6 46 aa 94 30 0d 06 09 2a 86 48 86
...

Особенности:

  • Бинарный формат, более компактный
  • Расширения файлов: .der, .cer
  • Используется Windows, Java
  • Один сертификат на файл

Конвертация между форматами

# PEM в DER
openssl x509 -in cert.pem -outform DER -out cert.der

# DER в PEM
openssl x509 -in cert.der -inform DER -outform PEM -out cert.pem

Структура сертификата

Сертификат X.509v3 состоит из трёх основных разделов:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: a2:f4:50:6f:a6:46:aa:94
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=Let's Encrypt Authority X3, O=Let's Encrypt, C=US
        Validity:
            Not Before: Jan  1 00:00:00 2026 GMT
            Not After : Mar 31 23:59:59 2026 GMT
        Subject: CN=example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus: 00:ab:cd:ef:...
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:example.com, DNS:www.example.com
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Key Usage:
                Digital Signature, Key Encipherment
    Signature Algorithm: sha256WithRSAEncryption
         12:34:56:78:...

Основные поля сертификата

Серийный номер

Уникальный идентификатор, присвоенный Центром сертификации. Используется для отслеживания отзыва в CRL (Списках отозванных сертификатов).

Serial Number: 03:e7:e4:d4:d5:3c:d8:d9:ff:ac:b7:5b:6e:8f:5c:6a:6c:15

Издатель и Субъект

Издатель: Центр сертификации, подписавший сертификат

Субъект: Сущность, которой выдан сертификат

Оба используют формат Distinguished Name (DN):

Issuer: C=US, O=Let's Encrypt, CN=R3
Subject: CN=example.com

Распространённые компоненты DN:

  • CN (Common Name): Доменное имя или имя человека
  • O (Organization): Название компании
  • OU (Organizational Unit): Отдел
  • C (Country): Двухбуквенный код страны
  • ST (State): Штат или регион
  • L (Locality): Город

Период действия

Сертификаты имеют временной диапазон, в течение которого они считаются действительными:

Not Before: Jan  1 00:00:00 2026 GMT
Not After : Mar 31 23:59:59 2026 GMT

Важно: Сертификаты нельзя использовать до даты "Not Before" или после даты "Not After". Большинство браузеров строго соблюдают это правило.

Открытый ключ

Открытый ключ, используемый для шифрования и проверки подписи:

Public Key Algorithm: rsaEncryption
    Public-Key: (2048 bit)
    Modulus:
        00:c2:a6:c8:d3:4b:9e:7a:1c:4f:6e:3d:9b:8c:7f:
        ...
    Exponent: 65537 (0x10001)

Распространённые алгоритмы:

  • RSA 2048-бит: Наиболее распространённый, широко поддерживается
  • RSA 4096-бит: Более высокая безопасность, большие сертификаты
  • ECDSA P-256: Эллиптическая кривая, меньше и быстрее
  • ECDSA P-384: Эллиптическая кривая с более высокой безопасностью

Алгоритм подписи

Криптографический алгоритм хеширования и подписи:

Signature Algorithm: sha256WithRSAEncryption

Современные сертификаты используют:

  • sha256WithRSAEncryption — SHA-256 + RSA (наиболее распространённый)
  • ecdsa-with-SHA256 — SHA-256 + ECDSA
  • ecdsa-with-SHA384 — SHA-384 + ECDSA

Избегайте: sha1WithRSAEncryption (устаревший, небезопасный)

Расширения сертификата

Расширения X.509v3 добавляют функциональность помимо базовой идентификации:

Subject Alternative Name (SAN)

Самое важное расширение для веб-сертификатов. Указывает дополнительные имена хостов, для которых сертификат действителен:

X509v3 Subject Alternative Name:
    DNS:example.com, DNS:www.example.com, DNS:*.example.com

Почему это важно: Современные браузеры проверяют только SAN, а не CN субъекта. Сертификат без SAN не будет работать для HTTPS.

Подстановочные знаки: *.example.com соответствует www.example.com, api.example.com, но НЕ example.com или subdomain.api.example.com.

Extended Key Usage (EKU)

Указывает, для чего может использоваться сертификат:

X509v3 Extended Key Usage:
    TLS Web Server Authentication, TLS Web Client Authentication

Распространённые значения EKU:

  • serverAuth (1.3.6.1.5.5.7.3.1): Серверные сертификаты TLS/SSL (HTTPS)
  • clientAuth (1.3.6.1.5.5.7.3.2): Клиентские сертификаты (взаимный TLS)
  • codeSigning (1.3.6.1.5.5.7.3.3): Подпись кода
  • emailProtection (1.3.6.1.5.5.7.3.4): Шифрование электронной почты S/MIME
  • timeStamping (1.3.6.1.5.5.7.3.8): Доверенная временная метка

Key Usage

Ограничивает криптографические операции, которые может выполнять ключ:

X509v3 Key Usage: critical
    Digital Signature, Key Encipherment

Значения:

  • Digital Signature: Подписывать данные (аутентификация, целостность)
  • Key Encipherment: Шифровать сеансовые ключи (обмен ключами RSA)
  • Key Agreement: Устанавливать общие секреты (обмен ключами ECDH)
  • Certificate Sign: Подписывать другие сертификаты (только сертификаты CA)
  • CRL Sign: Подписывать списки отозванных сертификатов

Basic Constraints

Указывает, является ли это сертификатом CA, и ограничивает глубину цепочки сертификатов:

X509v3 Basic Constraints: critical
    CA:FALSE

CA:TRUE: Этот сертификат может подписывать другие сертификаты (промежуточный или корневой CA)

CA:FALSE: Конечный сертификат (листовой сертификат)

Authority Key Identifier (AKI) и Subject Key Identifier (SKI)

Идентификаторы для связывания сертификатов в цепочке:

X509v3 Authority Key Identifier:
    keyid:A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1

X509v3 Subject Key Identifier:
    12:34:56:78:9A:BC:DE:F0:11:22:33:44:55:66:77:88:99:AA:BB:CC

AKI: Указывает на открытый ключ издателя (используется для проверки подписи)

SKI: Уникальный идентификатор открытого ключа этого сертификата

Authority Information Access (AIA)

URL-адреса для загрузки сертификата издателя и проверки отзыва:

Authority Information Access:
    OCSP - URI:http://ocsp.letsencrypt.org
    CA Issuers - URI:http://cert.letsencrypt.org/lets-encrypt-r3.der

OCSP: Online Certificate Status Protocol — проверка отзыва в реальном времени

CA Issuers: Где скачать промежуточный сертификат CA

CRL Distribution Points

URL-адреса для загрузки Списков отозванных сертификатов:

X509v3 CRL Distribution Points:
    Full Name:
      URI:http://crl.letsencrypt.org/lets-encrypt-r3.crl

Отпечатки сертификата

Отпечаток — это хеш всего сертификата. Он используется для закрепления сертификата и быстрой проверки:

SHA-256 Fingerprint:
    3B:4A:7C:2F:8D:1E:9B:3A:5F:6C:8D:2E:7A:4B:9C:1D:
    6E:3F:8A:2C:5B:7D:9E:1F:4A:6B:8C:3D:5E:7F:9A:2B

SHA-1 Fingerprint:
    A8:3E:6F:2C:7D:1B:4A:8E:5F:9C:2D:6B:3A:7E:1C:4F:8D:5B:9A:2E

Вычисление отпечатков

# Используя OpenSSL
openssl x509 -in cert.pem -fingerprint -sha256 -noout
openssl x509 -in cert.pem -fingerprint -sha1 -noout

# Используя Python
import hashlib

with open('cert.pem', 'rb') as f:
    cert_data = f.read()

# SHA-256 отпечаток
fingerprint = hashlib.sha256(cert_data).hexdigest()
print(':'.join(fingerprint[i:i+2] for i in range(0, len(fingerprint), 2)).upper())

Проверка цепочки сертификатов

Браузеры проверяют сертификаты, проверяя цепочку доверия от конечного сертификата до доверенного корневого CA:

[Конечный сертификат]     <- example.com
 подписан
[Промежуточный CA]        <- Let's Encrypt R3
    ↓ подписан
[Корневой CA]             <- ISRG Root X1 (в хранилище доверия браузера)

Этапы проверки

  1. Проверка подписи: Подпись каждого сертификата проверяется с использованием открытого ключа издателя
  2. Построение цепочки: Промежуточные сертификаты загружаются, если отсутствуют (используя расширение AIA)
  3. Проверка срока действия: Все сертификаты должны быть в пределах периода действия
  4. Проверка отзыва: Проверка OCSP или CRL на отозванные сертификаты
  5. Проверка имени: Имя хоста соответствует SAN или CN
  6. Проверка назначения: EKU и Key Usage соответствуют предполагаемому назначению

Распространённые ошибки проверки

"certificate has expired" — Текущее время находится вне диапазона Not Before/Not After

"unable to get local issuer certificate" — Отсутствует промежуточный сертификат

"certificate name mismatch" — Имя хоста отсутствует в SAN

"self signed certificate" — Сертификат не выдан доверенным CA

"certificate revoked" — Сертификат был отозван CA

Декодирование сертификатов с помощью OpenSSL

# Отобразить детали сертификата
openssl x509 -in cert.pem -text -noout

# Извлечь конкретные поля
openssl x509 -in cert.pem -noout -subject
openssl x509 -in cert.pem -noout -issuer
openssl x509 -in cert.pem -noout -dates
openssl x509 -in cert.pem -noout -fingerprint

# Загрузить и декодировать сертификат веб-сайта
echo | openssl s_client -connect example.com:443 2>/dev/null | \
  openssl x509 -text -noout

# Проверить срок действия сертификата
openssl x509 -in cert.pem -noout -enddate

# Проверить цепочку сертификатов
openssl verify -CAfile ca-bundle.crt cert.pem

Программное декодирование сертификатов

Python (библиотека cryptography)

from cryptography import x509
from cryptography.hazmat.backends import default_backend
import datetime

# Загрузить сертификат
with open('cert.pem', 'rb') as f:
    cert_data = f.read()
    cert = x509.load_pem_x509_certificate(cert_data, default_backend())

# Извлечь поля
print("Subject:", cert.subject)
print("Issuer:", cert.issuer)
print("Serial:", cert.serial_number)
print("Not Before:", cert.not_valid_before)
print("Not After:", cert.not_valid_after)

# Проверить, истёк ли срок действия
now = datetime.datetime.utcnow()
is_expired = now > cert.not_valid_after
print("Expired:", is_expired)

# Получить SAN
try:
    san = cert.extensions.get_extension_for_oid(
        x509.oid.ExtensionOID.SUBJECT_ALTERNATIVE_NAME
    )
    dns_names = san.value.get_values_for_type(x509.DNSName)
    print("SAN DNS Names:", dns_names)
except x509.ExtensionNotFound:
    print("No SAN extension")

# Получить отпечаток
fingerprint = cert.fingerprint(hashes.SHA256())
print("SHA-256 Fingerprint:", fingerprint.hex())

JavaScript (Node.js)

const tls = require('tls');
const https = require('https');

// Получить сертификат с HTTPS сервера
const options = {
  host: 'example.com',
  port: 443,
  method: 'GET',
  rejectUnauthorized: false
};

const req = https.request(options, (res) => {
  const cert = res.socket.getPeerCertificate();
  
  console.log('Subject:', cert.subject);
  console.log('Issuer:', cert.issuer);
  console.log('Valid From:', cert.valid_from);
  console.log('Valid To:', cert.valid_to);
  console.log('Fingerprint (SHA-256):', cert.fingerprint256);
  console.log('Serial Number:', cert.serialNumber);
  console.log('Subject Alt Names:', cert.subjectaltname);
});

req.end();

Использование инструментов декодирования сертификатов

При работе с сертификатами X.509 используйте инструменты, которые предоставляют визуальный анализ и проверку:

Декодер сертификатов в DevToys Pro предоставляет:

  • Автоматическое определение формата (PEM/DER)
  • Все стандартные поля и поля расширений
  • Анализ SAN, EKU и Key Usage
  • Вычисление отпечатков (SHA-1, SHA-256)
  • Предупреждения об истечении срока действия
  • Отображение цепочки сертификатов

Лучшие практики

  1. Всегда включайте расширение SAN — одного CN недостаточно
  2. Используйте минимум 2048-бит RSA — или ECDSA P-256 для современных систем
  3. Предпочитайте 90-дневный срок действия — более короткие сроки снижают риск от скомпрометированных ключей
  4. Устанавливайте соответствующий EKU — не используйте сертификаты serverAuth для подписи кода
  5. Включайте промежуточные сертификаты — настройте веб-серверы на отправку полной цепочки
  6. Отслеживайте даты истечения — автоматизируйте продление до истечения срока действия
  7. Используйте подписи SHA-256 — избегайте устаревшего SHA-1

Распространённые ошибки

  • Отсутствие промежуточного сертификата — вызывает ошибки "unable to get issuer"
  • Имя хоста отсутствует в SAN — сертификат не будет проверен для домена
  • Истёкшие сертификаты — отслеживайте и обновляйте до истечения срока
  • Неправильный формат сертификата — сервер ожидает PEM, но получает DER
  • Несоответствие закрытого ключа — сертификат и закрытый ключ не совпадают
  • Самоподписанный в продакшене — браузеры не будут доверять без ручного импорта

Ключевые выводы

  • Сертификаты X.509 связывают открытые ключи с идентификаторами для TLS/SSL и подписи кода
  • Формат PEM — Base64-кодированный, DER — бинарный — оба содержат одинаковые данные
  • Subject Alternative Name (SAN) необходим для современных HTTPS сертификатов
  • Extended Key Usage (EKU) указывает разрешённое использование (serverAuth, clientAuth и т.д.)
  • Отпечатки — это хеши сертификатов, используемые для закрепления и проверки
  • Цепочки сертификатов связывают конечные сертификаты с доверенными корневыми CA
  • Всегда проверяйте цепочки сертификатов, срок действия, имя хоста и статус отзыва

Связанные инструменты: