zaLinux.ru

Как просмотреть содержимое ключей и сертификатов SSL


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

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

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

  • rootCA.key - ключ CA
  • rootCA.crt - сертификат CA
  • mydomain.com.key - ключ сервера
  • mydomain.com.csr - запрос за подпись сертификата сайта
  • mydomain.com.crt - сертификат сайта

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

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

cat rootCA.key

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

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

Если вам эти строки кажутся знакомыми на кодировку Base64, то вы совершенно правы — это она и есть. (Смотрите также «Как быстро узнать и преобразовать кодировку»).

Этот формат, называемый форматом PEM, расшифровывается как Privacy Enhanced Mail.

PEM — это текстовое представление реального двоичного ключа или сертификата в формате DER. Представляет собой двоичного формата DER в кодировке base64 и с дополнительными строками «-----BEGIN PRIVATE KEY-----», «-----BEGIN CERTIFICATE-----» и другими в начале файла и строками «-----END PRIVATE KEY-----», «-----END CERTIFICATE-----» в конце файла.

Мы можем хранить двоичную версию файла только с кодировкой DER, но наиболее распространенным способом является версия PEM.

Вы можете увидеть структуру приватного следующей командой:

openssl rsa -text -in rootCA.key

Опция -in ИМЯ_ФАЙЛА указывает имя файла ввода для чтения ключа или стандартный ввод, если эта опция не указана. Если ключ зашифрован, будет запрошен пароль.

Опция -text печатает различные компоненты открытого или закрытого ключа в виде простого текста в дополнение к закодированной версии.

Пример вывода:

RSA Private-Key: (4096 bit, 2 primes)
modulus:
    00:c9:04:a9:2b:e9:7c:f3:01:c5:c3:7b:20:d0:76:
    [...]
publicExponent: 65537 (0x10001)
privateExponent:
    1f:86:71:99:87:66:a7:1d:b2:0c:34:35:33:3c:53:
    [...]
prime1:
    00:f0:af:82:a6:f1:40:85:ee:c0:77:cc:41:ce:11:
    [...]
prime2:
    00:d5:cf:03:c6:2a:01:79:9a:e3:1d:ec:1b:52:40:
    [...]
exponent1:
    00:d7:7e:ed:65:f7:9f:a3:cb:2e:bc:94:3f:5e:f8:
    [...]
exponent2:
    00:ae:a1:5e:db:c4:03:60:67:79:89:3f:07:31:ae:
    [...]
coefficient:
    00:e4:7d:de:4e:00:a0:8d:c4:5a:14:93:b6:7f:c9:
    [...]
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
[...]
-----END RSA PRIVATE KEY-----

Любой формат ключа на самом деле является контейнером для набора длинных чисел. Все остальные данные можно считать «шумом».

Закрытый ключ содержит: модуль (modulus), частный показатель (privateExponent), открытый показатель (publicExponent), простое число 1 (prime1), простое число 2 (prime2), показатель степени 1 (exponent1), показатель степени 2 (exponent2) и коэффициент (coefficient).

Открытый ключ содержит только модуль (modulus) и открытый показатель (publicExponent).

Вы можете из влечь из файла ключей публичный ключ:

openssl rsa -in rootCA.key -pubout -out rootCA-public.key

По умолчанию выводится закрытый ключ: с опцией -pubout вместо него будет выведен открытый ключ. Эта опция устанавливается автоматически, если ввод является открытым ключом.

Следующая команда покажет информацию о публичном ключе:


openssl rsa -text -in rootCA-public.key -pubin

По умолчанию из входного файла считывается закрытый ключ. Используемая в предыдущей команде опция -pubin делает так, что вместо приватного ключа читается открытый ключ.

Можно также добавить опцию -noout — с ней будет выведена та же самая информация, но не будет показана кодированная версия ключа.

openssl rsa -text -in rootCA-public.key -pubin -noout

С такими же опциями, но уже используя команду req, можно изучить содержимое запроса на подпись сертификата:

openssl req -in mydomain.com.csr -noout -text

При создании SSL сертификата мы создали две пары ключей (корневые и для домена), то есть это файлы rootCA.key и mydomain.com.key, но по своей технической сути они идентичны.

Что касается сертификатов, которых у нас тоже два (rootCA.crt и mydomain.com.crt), то по своей природе они не являются одинаковыми: корневой сертификат является самоподписанным, а сертификат домена подписан приватным корневым ключом.

Информацию о содержимом сертификатов можно посмотреть командой x509 (остальные опции нам уже знакомы):

openssl x509 -in rootCA.crt -noout -text
openssl x509 -in mydomain.com.crt -text -noout

Самоподписанные сертификаты обычно содержат только самые основные данные сертификатов, как показано в предыдущем примере. Для сравнения, сертификаты, выданные общедоступными центрами сертификации, гораздо интереснее, поскольку они содержат ряд дополнительных полей (с помощью механизма расширений X.509).

Сертификат (цепочку сертификатов) любого сайта вы можете получить следующей командой (замените w-e-b.site на интересующий вас сайт):

openssl s_client -showcerts -connect w-e-b.site:443 </dev/null


Вы увидите сертификаты (один или несколько), найдите по полю CN тот, который вас интересует, например, сертификат домена w-e-b.site:

0 s:CN = w-e-b.site

И скопируйте содержимое начиная с -----BEGIN CERTIFICATE----- и заканчивая -----END CERTIFICATE-----. Затем сохраните это в файл.

Вы также можете сохранить сертификат центра сертификации и изучить его:

К примеру, сертификат сайта w-e-b.site я сохранил в файл w-e-b.site.crt, для просмотра информации о нём:

openssl x509 -in w-e-b.site.crt -text -noout

Пример вывода:

Issuer указывает на организацию, которая выдала (подписала) сертификат:

        Issuer: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

Validity — срок действия сертификата:

        Validity
            Not Before: May 12 03:42:46 2020 GMT
            Not After : Aug 10 03:42:46 2020 GMT

Subject: CN — домен (IP адрес) для которого предназначен сертификат:

        Subject: CN = w-e-b.site

Поддомены в группе X509v3 extensions → X509v3 Subject Alternative Name (подробности чуть позже):

            X509v3 Subject Alternative Name: 
                DNS:w-e-b.site, DNS:www.w-e-b.site

Теперь бегло рассмотрим расширения X.509.

Расширение Basic Constraints используется для маркировки сертификатов как принадлежащих ЦС, давая им возможность подписывать другие сертификаты. В сертификатах, отличных от CA, это расширение будет либо пропущено, либо будет установлено значение CA, равное FALSE. Это расширение является критическим, что означает, что все программные сертификаты должны понимать его значение.


            X509v3 Basic Constraints: critical
                CA:FALSE

Расширения Key Usage (KU) и Extended Key Usage (EKU) ограничивают возможности использования сертификата. Если эти расширения присутствуют, то разрешены только перечисленные варианты использования. Если расширения отсутствуют, ограничений на использование нет. То, что вы видите в этом примере, типично для сертификата веб-сервера, который, например, не позволяет подписывать код:

            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication

Расширение CRL Distribution Points перечисляет адреса, по которым можно найти информацию о списке отзыва сертификатов (CRL) ЦС. Эта информация важна в случаях, когда сертификаты необходимо отозвать. CRL — это подписанные CA списки отозванных сертификатов, публикуемые через регулярные промежутки времени (например, семь дней).

X509v3 CRL Distribution Points:
    Full Name:
      URI:http://crl.starfieldtech.com/sfs3-20.crl

Примечание: возможно, вы заметили, что местоположение CRL не использует защищённый сервер, и вам может быть интересно, является ли ссылка небезопасной. Не является. Поскольку каждый CRL подписан центром сертификации, который его выпустил, браузеры могут проверить его целостность. В том же случае, если бы CRL были доступны по TLS (адрес включал бы в себя протокол HTTPS), то браузеры могут столкнуться с проблемой «курицы и яйца», в которой они хотят проверить статус отзыва сертификата, используемого сервером, доставляющим сам CRL!

Расширение Certificate Policies используется для указания политики, в соответствии с которой был выпущен сертификат. Например, именно здесь можно найти индикаторы расширенной проверки (EV). Индикаторы представлены в форме уникальных идентификаторов объектов (OID) и являются уникальными для выдающего ЦС. Кроме того, это расширение часто содержит один или несколько пунктов CPS, которые обычно являются веб-страницами или документами PDF.

            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.1
                Policy: 1.3.6.1.4.1.44947.1.1.1
                  CPS: http://cps.letsencrypt.org

Расширение Authority Information Access (AIA) обычно содержит две важные части информации. Во-первых, он перечисляет адрес ответчика CA OCSP, который можно использовать для проверки отзыва сертификатов в режиме реального времени. Расширение также может содержать ссылку, где находится сертификат эмитента (следующий сертификат в цепочке). В наши дни серверные сертификаты редко подписываются непосредственно доверенными корневыми сертификатами, а это означает, что пользователи должны включать в свою конфигурацию один или несколько промежуточных сертификатов. Ошибки легко сделать, и сертификаты будут признаны недействительными. Некоторые клиенты (например, Internet Explorer) будут использовать информацию, представленную в этом расширении для исправления неполной цепочки сертификатов, но многие клиенты этого не сделают.

            Authority Information Access: 
                OCSP - URI:http://ocsp.int-x3.letsencrypt.org
                CA Issuers - URI:http://cert.int-x3.letsencrypt.org

Расширения Subject Key Identifier и Authority Key Identifier устанавливают уникальные идентификаторы ключа субъекта и ключа авторизации соответственно. Значение, указанное в расширении Authority Key Identifier сертификата, должно соответствовать значению, указанному в расширении Subject Key Identifier в выдающем сертификате. Эта информация очень полезна в процессе построения пути сертификации, когда клиент пытается найти все возможные пути от конечного (серверного) сертификата до доверенного корня. Центры сертификации часто используют один закрытый ключ с несколькими сертификатами, и это поле позволяет программному обеспечению надёжно определять, какой сертификат может быть сопоставлен с каким ключом. В реальном мире многие цепочки сертификатов, предоставляемые серверами, недействительны, но этот факт часто остаётся незамеченным, поскольку браузеры могут находить альтернативные пути доверия.


            X509v3 Subject Key Identifier: 
                12:AF:9A:BC:DA:63:7D:5A:35:14:E6:8F:1D:B1:70:ED:83:E0:81:AC
            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

Наконец, расширение Subject Alternative Name используется для перечисления всех имен хостов, для которых действителен сертификат. Это расширение раньше было необязательным; если его нет, клиенты возвращаются к использованию информации, представленной в Common Name (CN), которое является частью поля «Subject». Если расширение присутствует, то содержимое поля CN игнорируется во время проверки.

            X509v3 Subject Alternative Name: 
                DNS:w-e-b.site, DNS:www.w-e-b.site

Рассмотрим опции команды x509, которые позволяют извлечь разнообразную информацию из сертификатов.

Чтобы показать издателя сертификата используйте опцию -issuer:

openssl x509 -in w-e-b.site.crt -noout -issuer

Пример вывода:

issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

Опция -fingerprint вычисляет и выводит дайджест DER-кодированной версии всего сертификата. Это обычно называют «отпечатком». Из-за характера дайджестов сообщений, отпечаток сертификата является уникальным для этого сертификата, и два сертификата с одинаковым отпечатком могут считаться одинаковыми. Для сертификатов обычно не нужно сверять сертификаты по отпечаткам, но это имеет смысл при использовании самоподписанных сертификатов (например, получении сертификата для VNC сессии, когда нет другого способа проверить, что сертификат не был подменён при пересылке). В этом случае можно сверить отпечаток сертификата, например, по телефону или электронной почте.

Для показа отпечатка сертификата:

openssl x509 -in w-e-b.site.crt -noout -fingerprint

Пример вывода:

SHA1 Fingerprint=43:4E:55:5B:27:09:33:00:3F:43:B0:B7:B2:5E:96:D5:10:42:3B:44

Чтобы вывести сертификат в виде строки символов в стиле C — char, используйте опцию -C:

openssl x509 -in w-e-b.site.crt -noout -C

Чтобы вывести расширения сертификата в текстовой форме, используйте опцию -ext. Несколько расширений можно перечислить через запятую, например "subjectAltName,subjectKeyIdentifier". Чтобы посмотреть весь список расширений:

man x509v3_config

Пример команды для вывода альтернативных имён в домене:

openssl x509 -in suip.biz.cert -noout -ext subjectAltName

Пример информации об альтернативных именах домена:

            X509v3 Subject Alternative Name: 
                DNS:suip.biz, DNS:www.suip.biz

Для вывода почтовых адресов, содержащихся в сертификате, используйте опцию -email. Адреса электронной почты могут отсутствовать в сертификате.

openssl x509 -in w-e-b.site.crt -noout -email

Для вывода адресов респондентов OCSP, если они присутствуют в сертификате, укажите опцию -ocsp_uri:

openssl x509 -in w-e-b.site.crt -noout -ocsp_uri

Пример вывода:

http://ocsp.int-x3.letsencrypt.org

Для показа дат из сертификата имеются следующие опции:

  • -startdate: Распечатывает дату начала сертификата, то есть дату notBefore (не ранее).
  • -enddate: Распечатывает дату истечения срока действия сертификата, то есть дату notAfter (не позднее).
  • -dates: Распечатывает даты начала и окончания срока действия сертификата.

Для вывода имени subject укажите опцию -subject:

openssl x509 -in w-e-b.site.crt -noout -subject

Пример вывода:

subject=CN = w-e-b.site

Чтобы показать имя subject сертификата в форме RFC2253 используйте сочетание опций -subject -nameopt RFC2253:

openssl x509 -in w-e-b.site.crt -noout -subject -nameopt RFC2253

Пример вывода:

subject=CN=w-e-b.site

Пример вывода имени subject сертификата в форме схемы на терминале, поддерживающем UTF8:

openssl x509 -in w-e-b.site.crt -noout -subject -nameopt oneline,-esc_msb

Опция -serial выводит серийный номер:

openssl x509 -in w-e-b.site.crt -noout -serial

Пример вывода:

serial=03AD15E134F5A4D76FEF369D86A4C1ED5B27

Чтобы извлечь публичный ключ из сертификата используйте опцию -pubkey:

openssl x509 -in w-e-b.site.crt -noout -pubkey

Для глубокого понимания OpenSSL смотрите также полное руководство: «OpenSSL: принципы работы, создание сертификатов, аудит».


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *