showcert: проверяем сертификаты (без боли)
showcert — маленькая CLI утилитка, альтернатива openssl для просмотра сертификатов. Она умеет 1% того, что может openssl, но зато умеет [почти] все, что нужно в обычной админской жизни и даже немного больше чем openssl. И гораздо проще в использовании. Основные функции:
Взять сертификат (или цепочку) из stdin, файла(файлов) или из TLS сервиса (HTTPS, POP3S, IMAPS), в том числе через STARTTLS (для SMTP, POP3, IMAP)
Проверить валидность сертификата.
Проверить «свежесть» сертификата, и если срок действия истекает через N дней — передать это в коде завершения.
Распечатать сертификат (цепочку) в краткой форме (только основное), полной, в PEM формате (для сохранения в cert.pem или fullchain.pem).
И все это делается простым, интуитивно-понятным образом, для людей.
Когда я хочу проверить дату истечения, например, почтового сертификата яндекса, немного гуглю, потом сноровисто пишу что-то вроде:
$ echo | openssl s_client -connect mx.yandex.ru:25 -starttls smtp 2>&1 | openssl x509 -noout -dates
Когда я печатаю эту строчку, вспоминаю немало многокоренных слов из флотской службы, а ведь я даже не служил. А теперь, представьте, что мы хотим не просто увидеть дату, а еще и как-то что-то сделать, если до истечения останется меньше 20 дней. как будет выглядеть команда? Мне вообще сложно представить, как это можно автоматизировать через openssl и простые шелл скрипты.
Просмотр сертификатов через showcert
А теперь (после установки: pip3 install showcert ) сравните с:
$ showcert mx.yandex.ru:25
Names: mx.yandex.ru mx.yandex.net
notBefore: 2022-07-25 11:16:45 (15 days old)
notAfter: 2023-01-22 20:59:59 (165 days left)
Issuer: C=BE O=GlobalSign nv-sa CN=GlobalSign RSA OV SSL CA 2018
Ну разве не проще? showcert сам (по номеру порта) догадывается, как начать STARTTLS (но конечно же, это можно переопределить через опцию -t / —starttls, например, -t no или -t imap).
Предупредить о том, что сертификат скоро протухнет? Окей!
$ showcert mx.yandex.ru:25 -qw 200 || echo PROBLEM
mx.yandex.ru:25 expires in 165 days
PROBLEM
-q — тихий режим, не печатать лишнего, только предупреждения, -w 200 — завершаться с кодом ошибки, если до протухания меньше 200 дней.
Проверить https вебсайт? showcert github.com (Несложный синтаксис?)
«Скопировать» fullchain.pem с сервера (взять его и распечатать в PEM):
$ showcert google.com —chain -o pem > fullchain.pem
У меня после этого дампа (не с гугла, а со своего другого сервера) — даже md5 файлов сошелся!
Так же можно посмотреть или проверить один или несколько локальных файлов сертификатов (fullchain.pem или cert.pem).
Можно добавить —chain чтобы увидеть всю цепочку. И ключ -w тоже работает.
Формат вывода сертификатов
По умолчанию ( -o brief ) выводится краткая информация (все, что обычно важно, минимум лишнего). -o full дает полный дамп (как openssl), -o pem даст сертификат в PEM формате (удобно сделать редирект в файл и получить его на диске).
Еще есть удобный формат -o names — просто распечатывает все имена из сертификата, и его вариация -o dnames , о ней ниже.
Сахар для LetsEncrypt
Мы много используем LetsEncrypt, поэтому showcert удобен для этого. На сервере могут быть десятки (а то и сотни) сайтов, у каждого сертификат. Да, certbot renew в теории должен обновлять их, но сайты живые, постоянно разрабатываются, причем разными людьми и с ними иногда происходят разные чудеса. То поменяется DocumentRoot, то появятся правила rewrite/redirect, которые блокируют проверку, то доменное имя куда-то уедет. В общем, обновления иногда фейлятся и сертификаты протухают. А когда сайтов много, что-то проблемное случается регулярно.
Мы используем okerr (статья про okerr на хабре) для мониторинга. Наш собственный open source гибридный мониторинг. Раньше мы использовали скрипт, создавал индикатор типа sslcert для каждого сайта (это тоже не очень удобно, так как сайты ведь иногда и умирают или переезжают на другой сервер). Но с showcert стало еще проще:
Простой приятный способ проверить, что все LetsEncrypt сертификаты еще свежи:
# showcert :le -qw
/etc/letsencrypt/live/example.com/fullchain.pem expires in 19 days
/etc/letsencrypt/live/example.net/fullchain.pem expires in 19 days
# echo $?
2
Команда выше — синоним showcert /etc/letsencrypt/live/*/fullchain.pem -qw , а код :le запомнить проще, чем путь к сертификатам. Ну и код завершения удобен, чтобы использовать его в мониторинге, собственных скриптах. У нас showcert вызывается из okerrupdate/okerrmod, в окерр внешние скрипты проверки цепляются одной строчкой, но если у вас другой мониторинг — тоже сможете легко подцепить showcert.
Если не используете никакой мониторинг, то showcert :le -qw в cron раз в сутки — оповестит заранее о сертификатах, которые своевременно не смогли обновиться, и у вас будет время починить.
Еще одна опция: -o dnames печатает имена через -d, это удобно чтобы скармливать их certbot:
$ showcert -o dnames habr.ru
-d habr.ru -d www.habr.ru
Для двух имен, как у хабра — это не имеет особого смысла, но если у сертификата имен много, и вам нужно пересоздать его — вручную печатать их можно и ошибиться. Проще через showcert получить часть команды и просто использовать ее (или даже использовать сам showcert в команде:
certbot certonly —webroot /var/www/habr `showcert -o dnames habr.ru`
Попробуйте, например, showcert -o dnames google.com .
Заключение
Утилита простая, синтаксис очевидный и простой, не требует запоминания и для большинства частых админских операций — работает замечательно! Пригодна для отслеживания протухающих сертификатов (через openssl это сложнее). Без нее можно обойтись, но с ней проще.
Understanding SSL Certificate PEM File and SSH PEM File with Examples
PEM (originally “Privacy Enhanced Mail”) file was initially invented to make e-mail secure. Now it is an Internet security standard. PEM file is the most common format for X.509 certificates, CSRs, and cryptographic keys.
What is a PEM file
A PEM file is a text file containing one or more items in Base64 ASCII encoding, each with plain-text headers and footers (e.g. —–BEGIN CERTIFICATE—– and —–END CERTIFICATE—–).
PEM is defined in RFC 1422 (part of a series from 1421 through 1424). It is a container format that may include just the public certificate or may include an entire certificate chain including public key, private key, and root certificates.
It can have a variety of extensions (.pem, .key, .cer, .cert, more). The typical PEM files are:
- key.pem contains the private encryption key
- cert.pem contains certificate information
PEM format
PEM file has the characteristics of containing a header, the body (which consists mainly of code) and footer.
The header and footer are what identify the type of file, however, be aware that not all PEM files necessarily need them.
—–BEGIN CERTIFICATE REQUEST—– and —–END CERTIFICATE REQUEST—– show a CSR in PEM format.
—–BEGIN RSA PRIVATE KEY—– and —–END RSA PRIVATE KEY—– show a private key in PEM format.
—–BEGIN CERTIFICATE—– and —–END CERTIFICATE—– show a certificate file in PEM format.
If the PEM file includes the SSL certificate chain, the format would look like this.
Example of PEM file
The following example is a private key pem file.
—–BEGIN PRIVATE KEY—–
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBj08sp5++4anG
cmQxJjAkBgNVBAoTHVByb2dyZXNzIFNvZnR3YXJlIENvcnBvcmF0aW9uMSAwHgYD
VQQDDBcqLmF3cy10ZXN0LnByb2dyZXNzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD
…
bml6YXRpb252YWxzaGEyZzIuY3JsMIGgBggrBgEFBQcBAQSBkzCBkDBNBggrBgEF
BQcwAoZBaHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9jYWNlcnQvZ3Nvcmdh
z3P668YfhUbKdRF6S42Cg6zn
—–END PRIVATE KEY—–
This is an example of a root certificate pem file.
# Trust chain root certificate
—–BEGIN CERTIFICATE—–
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
…
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
—–END CERTIFICATE—–
Check PEM certificate file with OpenSSL Command
OpenSSL is an open-source command-line tool that is commonly used to generate private keys, create CSRs, install our SSL/TLS certificate, and identify certificate information. openssl x509 -text -in server.pem -noout
openssl x509 -in hydssl.cer -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
40:01:6e:fb:0a:20:5c:fa:eb:e1:8f:71:d7:3a:bb:78
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=IdenTrust, CN=IdenTrust Commercial Root CA
Validity
Not Before: Dec 12 16:56:15 2019 GMT
Not After : Dec 12 16:56:15 2029 GMT
Subject: C=US, O=IdenTrust, OU=HydrantID Trusted Certificate Service, CN=HydrantID Server CA O1
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ea:1b:99:6c:35:56:30:68:fb:5d:b1:59:41:69:
PEM Files with SSH
PEM files are also used for SSH. If we have ever run ssh-keygen to use ssh without a password,
/.ssh/id_rsa is a PEM file, just without the extension. Most notably, Amazon Web Services gives us a PEM file containing a private key whenever we create a new instance, and we must use this key to be able to SSH into new EC2 instances.
we can use the -i flag with ssh to specify that we want to use this new key instead of id_rsa: ssh -i keyfile.pem root@host
Convert to PEM format
The default format of the certificate differs depending on its provider or the way it was created. Most of the time, the certificate is a PEM file that can be used easily.
There will be cases where the certificate will be a file with a different format, such as P7B-PKCS#7, PFX-PKCS#12, or DER.
In these cases, we need to convert the certificate into a PEM file. To do this, there are two options:
- To convert the file using an online tool, like SSL Converter from SSL Shopper
- To convert the certificate using OpenSSL commands
For the first path, we need to upload the file and let the website convert it automatically, while the second path needs special commands to be performed. Here are the commands to convert DER, P7B, and PFX files to PEM.
PEM, DER, CRT и CER: кодировки и преобразования X.509
Возможно, вы видели файлы цифровых сертификатов с различными расширениями имен файлов, такими как .crt , .cer , .pem или .der . Эти расширения обычно соответствуют двум основным схемам кодирования сертификатов и ключей X.509: PEM (Base64 ASCII) и DER (двоичный). Однако есть некоторые совпадения и используются другие расширения, поэтому вы не всегда можете определить, с каким файлом вы работаете, просто взглянув на имя файла; вам может потребоваться открыть его в текстовом редакторе и посмотреть сами.
Работая с цифровыми сертификатами, вы можете столкнуться с необходимостью конвертировать файлы PEM и DER, просматривать их содержимое в виде удобочитаемого текста или объединять их в общие форматы контейнеров, такие как PKCS # 12 или PKCS # 7. В этом руководстве указываются основные различия между файлами PEM и DER и расширениями распространенных имен файлов, связанными с ними. Он также предоставляет наглядные примеры каждой кодировки и иллюстрирует некоторые общие преобразования форматов файлов с OpenSSL.
Что такое OpenSSL?
OpenSSL — очень полезный набор инструментов командной строки с открытым исходным кодом для работы с X.509 сертификаты, запросы на подпись сертификатов (CSRs) и криптографические ключи. Если вы используете вариант UNIX, такой как Linux или macOS, OpenSSL, вероятно, уже установлен на вашем компьютере. Если вы хотите использовать OpenSSL в Windows, вы можете включить Подсистема Linux в Windows 10 или установить Cygwin.
PEM (первоначально «Privacy Eулучшенный Mail ») — наиболее распространенный формат для X.509 сертификаты, CSRи криптографические ключи. Файл PEM представляет собой текстовый файл, содержащий один или несколько элементов в кодировке Base64 ASCII, каждый из которых содержит простые и нижние колонтитулы (например, ——BEGIN CERTIFICATE—— и ——END CERTIFICATE—— ). Один файл PEM может содержать сертификат конечного объекта, закрытый ключ или несколько сертификатов, образующих полную цепочку доверия. Большинство файлов сертификатов, загружаемых с SSL.com, будут в формате PEM.
Расширения имени файла PEM
PEM файлы обычно видны с расширениями .crt , .pem , .cer .key (для закрытых ключей), но вы также можете видеть их с разными расширениями. Например, файл пакета SSL.com CA, доступный в таблице загрузок в порядке сертификата, имеет расширение .ca-bundle .
Как выглядит сертификат PEM?
SSL /TLS сертификат для www.ssl.com ниже показан в формате PEM (нажмите для просмотра):
Общие преобразования PEM
В приведенных ниже командах OpenSSL замените имена файлов ВСЕМИ ЗАГЛАВНЫМИ буквами фактическими путями и именами файлов, с которыми вы работаете.
Просмотр содержимого файла сертификата PEM
Конвертировать сертификат PEM в DER
Преобразовать сертификат PEM с цепочкой доверия в PKCS # 7
PKCS # 7 (также известный как P7B) — это контейнерный формат для цифровых сертификатов, который чаще всего встречается в контексте серверов Windows и Java и обычно имеет расширение .p7b , Файлы PKCS # 7 не используются для хранения закрытых ключей. В приведенном ниже примере -certfile MORE.pem представляет файл со связанными промежуточными и корневыми сертификатами (такими как .ca-bundle файл, скачанный с SSL.com).
Преобразовать сертификат PEM с цепочкой доверия и секретным ключом в PKCS # 12
PKCS # 12 (также известный как PKCS12 или PFX) является распространенным двоичным форматом для хранения цепочки сертификатов и закрытого ключа в одном зашифрованном файле и обычно имеет расширения имени файла. .p12 or .pfx , В приведенном ниже примере -certfile MORE.pem добавляет файл со связанными промежуточными и корневыми сертификатами (такими как .ca-bundle файл, загруженный с SSL.com), и -inkey PRIVATEKEY.key добавляет закрытый ключ для CERTIFICATE.crt (сертификат конечного объекта). Посмотри пожалуйста это как для более подробного объяснения показанной команды.
После выполнения указанной выше команды вам будет предложено создать пароль для защиты файла PKCS # 12. Запомните этот пароль. Он понадобится вам для доступа к любым сертификатам и ключам, хранящимся в файле.
DER (отличительные правила кодирования) это двоичная кодировка для X.509 сертификаты и закрытые ключи. В отличие от PEM, файлы в кодировке DER не содержат текстовых операторов, таких как ——BEGIN CERTIFICATE—— , Файлы DER чаще всего встречаются в контексте Java.
Расширения имени файла DER
DER-кодированные файлы обычно находятся с расширениями .der и .cer .
Как выглядит DER-кодированный сертификат?
SSL в кодировке DER /TLS сертификат для www.ssl.com показано ниже (нажмите для просмотра):
Общие преобразования DER
В приведенных ниже командах OpenSSL замените имена файлов ВСЕМИ ЗАГЛАВНЫМИ буквами фактическими путями и именами файлов, с которыми вы работаете.
Просмотр содержимого файла сертификата в кодировке DER
Конвертировать DER-кодированный сертификат в PEM
Преобразовать сертификат в кодировке DER с цепочкой доверия и закрытым ключом в PKCS # 12
Чтобы преобразовать сертификат DER в PKCS # 12, его следует сначала преобразовать в PEM, а затем объединить с любыми дополнительными сертификатами и / или закрытым ключом, как показано выше. Для более подробного описания преобразования DER в PKCS # 12, пожалуйста, смотрите это как.
Просмотреть SSL сертификат
В браузере просмотреть сертификат можно если он используется для сайта, находящегося в сети.
1.
Достаточны выбрать символ замка и посмотреть что за сертификат используется, каким сертификационным центром он выпущен и когда истекает срок действия.
2. 
Как просмотреть SSL сертификат используя openssl
Рассмотрим как просмотреть SSL сертификат в консоли Linux сервера — этот способ универсален, поскольку далеко не все сертификаты сразу устанавливаются на Apache или Nginx.
Достаточно выполнить одну команду указав в ней имя файла
openssl x509 -in example.crt -text -noout
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
df:d0:88:c4:0e:cd:bb:e9
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=RU, ST=State, L=City, O=CompanyName, OU=IT, CN=example.com/emailAddress=[email protected]
Validity
Not Before: Dec 24 08:16:50 2017 GMT
Not After : Dec 24 08:16:50 2018 GMT
Subject: C=RU, ST=State, L=City, O=CompanyName, OU=IT, CN=example.com/emailAddress=[email protected]
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (1024 bit)
Modulus:
00:ce:14:1e:b9:63:c8:d3:80:bc:de:bc:0b:af:c4:
…
a1:b4:97:06:28:11:ac:1f:69
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
…
9e:75:e5:41:2b:b9:c4:36:79:08:4b:06:4e:f8:50:4b:86:aa:
cd:04
Чаще всего на практике возникает необходимость выяснить для какого имени выпущен сертификат — в данном случае это example.com, что явно видно из вывода.
Для демонстрации использовался самоподписанный сертификат, сгенерированный на сервере
Таким же образом можно посмотреть содержимое запроса на выпуск сертификата (.pem или .csr файла)