Нужно ли мне конвертировать .CER в .CRT для сертификатов SSL Apache? Если да, то как?

Нужно ли мне конвертировать .CER в .CRT для сертификатов SSL Apache? Если да, то как? Сертификаты

Pfx сертификат (формат pkcs # 12)

Формат SSL сертификата PKCS # 12 или, как его еще называют, PFX сертификат – бинарный формат, при использовании которого в одном зашифрованном файле хранится не только ваш личный сертификат сервера и промежуточные сертификаты центра сертификации, но и ваш закрытый ключ.

Данные команды OpenSSL дают возможность преобразовать сертификаты и ключи в разные форматы. Для того чтобы сделать их совместимыми с определенными видами серверов, либо ПО. К примеру, Вам необходимо конвертировать обыкновенный файл PEM, который будет работать с Apache, в формат PFX (PKCS # 12) с целью применения его с Tomcat, либо IIS.

Также существуют онлайн программы для конвертации сертификатов из одного формата в другой. Например, мы можем посоветовать SSL конвертер от SSLShopper. Используйте этот SSL конвертер для преобразования SSL-сертификатов различных форматов, таких как PEM, DER, P7B и PFX.

Чтобы использовать SSL-конвертер, просто выберите файл сертификата и его текущий тип (он определяется по формату расширения), затем выберите формат, в какой Вам необходимо преобразовать SSL сертификат и нажмите кнопку “Convert Certificate”. Обратите внимание, что в зависимости от того, в какой формат вам нужно конвертировать SSL сертификат, от вас потребуются разные исходящие файлы.

Pkcs # 7 / p7b сертификат

SSL сертификаты в формате PKCS # 7 или P7B – это файлы, которые хранятся в формате Base64 ASCII и имеют расширение файла .p7b или .p7c. P7B сертификаты содержат теги начала сертификата “—– BEGIN PKCS7 ——” и его конца “—– END PKCS7 —–“.

Файлы в формате P7B включают в себя только ваш SSL сертификат и промежуточные SSL сертификаты. Приватный ключ при этом идет отдельным файлом. SSL сертификаты в формате PKCS # 7 / P7B поддерживают следующие платформы: Microsoft Windows и Java Tomcat.

Конвертация pem > der

Что бы сконвертировать PEM в DER — выполните:

# openssl x509 -outform der -in /etc/apache2/ssl/apache.pem -out /etc/apache2/ssl/apache.der

Получить данные из DER-файла ключа можно так:

# openssl x509 -in /etc/apache2/ssl/apache.der -inform der -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 15118644328740439277 (0xd1d036ea3c0c44ed)
    Signature Algorithm: sha256WithRSAEncryption
        ...
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (1024 bit)
                ...
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                45:31:3E:0F:DF:12:FE:12:1A:52:00:5F:D5:9B:F5:70:9D:20:A6:A0
            X509v3 Authority Key Identifier:
                keyid:45:31:3E:0F:DF:12:FE:12:1A:52:00:5F:D5:9B:F5:70:9D:20:A6:A0

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
        ...
-----BEGIN CERTIFICATE-----
MIICsjCCAhugAwIBAgIJANHQNuo8DETtMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNV
...
7agttGBmXpVSy0Gu0uwyz3d4Loq0Nxz/UNXf00kH6p6taTSJWtqJC8yCBvMVSuVn
3TTE1C50wQTP3d7FPRY01/zc9guxUg==
-----END CERTIFICATE-----

Ссылки по теме

Про сертификаты:  Сертификат соответствия ГОСТ Р. | Сертификация в России

Конвертация pem в der

Для конвертации стандартного сертификата в формате PEM в бинарный формат DER, потребуется только файлSSL сертификата. Обычно, вы его получаете в архиве вместе с промежуточными сертификатами. Как правило, в его названии указано имя вашего домена.

Конвертация формата PEM в DER

Конвертация pem в p7b / pkcs#7

Если же вам нужно преобразовать ваш стандартный SSL сертификат в файл формата P7B / PKCS#7, вы можете кроме SSL сертификата вашего домена загрузить также файлы с цепочками сертификатов. Более подробно о том, что такое цепочка SSL сертификатов, мы писали в статье о CA-bundle.

Конвертация pem в pfx / pkcs#12

Обратите внимание, что для конвертации стандартного формата SSL сертификата необходимо добавить еще один файл – ваш приватный ключ. Приватный ключ – это конфиденциальная информация, которая должна быть только у вас. Поэтому центры сертификации не высылают его месте с файлами вашего сертификата.

Приватный ключ создается в момент генерации CSR запроса. Если вы генерируете CSR у себя на сервере, на нем же должен автоматически сохраниться ключ. Если вы создаете CSR запрос в специальном инструменте на нашем сайте (на странице по ссылке или во время заполнения технических данных), ключ показывается вам в конце генерации CSR (или введения технических данных), но не сохраняется в нашей базе данных. Поэтому важно, чтобы вы самостоятельно сохранили приватный ключ.

Конвертация pfx / pkcs#12 в pem

Если вам необходимо преобразовать SSL сертификат формата PFX в PEM-формат, следует открыть файл сертификата в любом текстовом редакторе и скопировать текст каждого сертификата вместе с тегами BEGIN / END в отдельные файлы, после чего их следует сохранить их как certificate.cer (для сертификата вашего сервера) и cacert.cer (для цепочки промежуточных сертификатов). То же самое следует проделать с текстом приватного ключа и сохранить его под названием privatekey.key.

Получение данных о сертификате

Для получения данных о сертификаты — можно использовать openssl, например:

# openssl x509 -in /etc/apache2/ssl/apache.pem -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 15118644328740439277 (0xd1d036ea3c0c44ed)
    Signature Algorithm: sha256WithRSAEncryption
        ...
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (1024 bit)
                ...
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                45:31:3E:0F:DF:12:FE:12:1A:52:00:5F:D5:9B:F5:70:9D:20:A6:A0
            X509v3 Authority Key Identifier:
                keyid:45:31:3E:0F:DF:12:FE:12:1A:52:00:5F:D5:9B:F5:70:9D:20:A6:A0

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
    ...
-----BEGIN CERTIFICATE-----
MIICsjCCAhugAwIBAgIJANHQNuo8DETtMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNV
...
3TTE1C50wQTP3d7FPRY01/zc9guxUg==
-----END CERTIFICATE-----

Просмотр содержимого ключей и сертификатов

Мы можем подробно изучить содержимое всех созданных в OpenSSL файлов, а также при необходимости конвертировать их в другие форматы.

Про сертификаты:  Пастила без сахара Пастилушка ассорти 0,8 кг — купить в интернет-магазине OZON с быстрой доставкой


В следующих командах используются тестовые файлы со следующими именами:

Обратите внимание на расширения файлов — они могут отличаться от тех, которые используются в других инструкциях. Например, вместо .key и .crt может использоваться расширение .pem. Расширение файла не имеет особого значения кроме как служить подсказкой пользователю, что именно находится в этом файле. Это же самое касается и имён файлов — вы можете выбирать любые имена.

Все эти файлы являются текстовыми:

cat rootCA.key


Там мы увидим примерно следующее:

-----BEGIN PRIVATE KEY-----
MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQDJBKkr6XzzAcXD
eyDQdvB0SWE2Fl3nqlX/c2RgqMgScXtgidEzOu9ms3Krju5UKLokkQJrZFPMtiIL
MuPJFdYjVyfkfnqlZiouBVgJ60s8NQBBI8KnyyAoJCIFdASoW4Kv5C5LT8pX9eRa
/huJaRJL5XsFUGnTOLvW2ZLN52iAux9CoZlmH6ZF4nuQpblwN0MHULAhze52VNFT
…………………………………………………..
…………………………………………………..
…………………………………………………..
…………………………………………………..
…………………………………………………..
…………………………………………………..
-----END PRIVATE KEY-----

Формат сертификата der

DER формат – это бинарный тип сертификата вместо формата PEM. В PEM формате чаще всего используется расширение файла .cer, но иногда можно встретить и расширение файла .der. Поэтому чтобы отличить SSL сертификат в формате PEM от формата DER, следует открыть его в текстовом редакторе и найти теги начала и окончания сертификата (BEGIN/END). DER SSL сертификаты, как правило, используются на платформах Java.

Формат сертификата pem

PEM – наиболее популярный формат среди сертификационных центров. PEM сертификаты могут иметь расширение .pem, .crt, .cer, и .key (файл приватного ключа). Она представляют собой ASCII файлы, закодированные по схеме Base64. Когда вы открываете файл pem формата в текстовом редакторе, вы можете увидеть, что текст кода в нем начинается с тега “—– BEGIN CERTIFICATE —–” и заканчивая тегом “—– END CERTIFICATE —–“.

Apache и другие подобные серверы используют сертификаты в PEM формате. Обратите внимание, что в одном файле может содержатся несколько SSL сертификатов и даже приватный ключ, один под другим. В таком случае каждый сертификат отделен от остальных ранее указанными тегами BEGIN и END. Как правило, для установки SSL сертификата на Apache, сертификаты и приватный ключ должны быть в разных файлах.

Чтение ssl-сертификата из строки в base64 der формате

Судя по вашем ответу, cert у вас это base64 представление сертификата в DER кодировке (добавляя BEGIN/END CERTIFICATE строчки, вы превращаете это в PEM представление).

Про сертификаты:  KRAUSE лестницы и стремянки. Официальный сайт в России.

В таком случае, достаточно декодировать из base64, чтобы передать сертификат в функции, ожидающие DER формат, например, используя asn1crypto пакет (чистый Питон, не использует openssl):

import base64
from asn1crypto import x509  # $ pip install asn1crypto

cert = x509.Certificate.load(base64.b64decode(base64_der))
print(cert.serial_number)

где base64_der это ваш сертификат, «который представлен в виде типа buffer». Кроме asn1crypto вы ещё можете использовать и другие библиотеки, например: pyOpenSSL, M2Crypto, cryptography, pyasn1. См., пример кода и основные отличия.

Альтернативно, можно наоборот обернуть base64_der, чтобы получить PEM представление:

import ssl

pem_string = '-----BEGIN CERTIFICATE-----'   base64_der   '-----END CERTIFICATE-----'
der_bytes = ssl.PEM_cert_to_DER_cert(pem_string)
cert = x509.Certificate.load(der_bytes)
print(cert.serial_number)

См. также asn1crypto.pem.detect().

Для быстрого хака, достаточно стандартной библиотеки:

import ssl

p = ssl._ssl._test_decode_cert(tmp_certificate_path)
print(p['serialNumber'])

где tmp_certificate_path это путь к PEM файлу из вашего ответа и ssl._ssl._test_decode_cert() это неофициальная функция из _ssl.c, которая существует только для тестов (значит может исчезнуть, изменить поведение в любой момент).


Для сравнения (чтобы оценить удобство, предоставляемое библиотеками типа asn1crypto), вот код, который использует OpenSSL API напрямую через ctypes, чтобы получить серийный номер x509 сертификата из строки, содержащей DER представление, закодированное в base64 формат как одна строчка:

#!/usr/bin/env python3
import contextlib
import ctypes.util
from ssl import SSLError

_ssl = ctypes.cdll.LoadLibrary(ctypes.util.find_library('ssl'))
BIO_FLAGS_BASE64_NO_NL = 0x100 # bio.h

def get_serial_number_from_base64_der_oneline(base64_der):
    if isinstance(base64_der, str):
        base64_der = base64_der.encode('ascii', 'strict')
    with contextlib.ExitStack() as stack:
        bio = _ssl.BIO_new_mem_buf(base64_der, len(base64_der))
        stack.callback(_ssl.BIO_free, bio)
        b64 = _ssl.BIO_new(BIO_f_base64()) 
        stack.callback(_ssl.BIO_free, b64)
        _ssl.BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL) # oneline
        certificate = _ssl.d2i_X509_bio(_ssl.BIO_push(b64, bio), None)
        stack.callback(_ssl.X509_free, certificate)
        # get a memory buffer # from _ssl.c
        biobuf = _ssl.BIO_new(BIO_s_mem())
        stack.callback(_ssl.BIO_free_all, biobuf)
        serialNumber = _ssl.X509_get_serialNumber(certificate)
        _ssl.i2a_ASN1_INTEGER(biobuf, serialNumber)
        # should not exceed 20 octets, 160 bits, so buf is big enough
        buf = ctypes.create_string_buffer(21) # char[21]
        size = _ssl.BIO_gets(biobuf, buf, len(buf)-1)
        if size <= 0:
            raise SSLError
        return buf[:size].decode()

# https://www.openssl.org/docs/manmaster/crypto/BIO_f_base64.html
# const BIO_METHOD *BIO_f_base64(void);
BIO_f_base64 = ctypes.CFUNCTYPE(ctypes.POINTER(ctypes.c_char))(("BIO_f_base64", _ssl))
BIO_s_mem = ctypes.CFUNCTYPE(ctypes.POINTER(ctypes.c_char))(("BIO_s_mem", _ssl))

def null_check(result, func, arguments):
    if not result:
        raise SSLError
    return result

for f in [BIO_f_base64, BIO_s_mem, _ssl.BIO_new_mem_buf, _ssl.BIO_new, _ssl.d2i_X509_bio]:
    f.errcheck = null_check

Алгоритм:

  1. декодируется base64 представление, используя BIO_f_base64(), получаем DER
  2. DER превращаем во внутреннее представление, используя d2i_X509_bio()
  3. X509_get_serialNumber() извлекает серийный номер как ASN1_INTEGER
  4. i2a_ASN1_INTEGER() даёт серийный номер как число в ascii строке

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

ExitStack() и null_check используются, чтобы ресурсы освободить в
случае ошибки. Так как используется C API, то приходится явно временем
жизни управлять.

Пример:

print(get_serial_number_from_base64_der_oneline(base64_der))

где base64_der та же строка что и в других примерах.

Оцените статью
Мой сертификат
Добавить комментарий