Примеры использования OpenSSL в Unix/Linux
При работе с SSL, нужно уметь работать с утилитой OpenSSL чтобы создавать, конвертировать, управляют SSL-сертификатами. В этой статье «Примеры использования OpenSSL в Unix/Linux» я буду говорить о примерах использования OpenSSL.
Некоторые из сокращений, связанных с сертификатами:
- SSL – Secure Socket Layer (Безопасный уровень сокета).
- CSR – Certificate Signing Request (Запрос на подпись сертификата).
- TLS – Transport Layer Security (Транспортный уровень безопастности).
- PEM – Privacy Enhanced Mail
- DER – Distinguished Encoding Rules
- SHA – Secure Hash Algorithm (Безопасный hash алгорит).
- PKCS – Public-Key Cryptography Standards (Стандарты шифрования публичных ключей).
Создание нового приватного ключа (Private Key) и Certificate Signing Request (CSR).
Выполняем команду:
# openssl req -out linux-notes.org.csr -newkey rsa:2048 -nodes -keyout linux-notes.org.key
Команда выше будет генерировать CSR и 2048-битный RSA ключ. Если вы собираетесь использовать этот сертификат в Apache или Nginx, то вам необходимо отправить этот CSR файл в службу сертификации и они дадут вам подписанный сертификат в «der» или «pem» формате. После чего вы настроите его на веб-сервере Apache или Nginx.
Так же, можно использовать такой вариант:
$ openssl req -new -newkey rsa:2048 -nodes -out linux-notes.org.csr -keyout linux-notes.org.key -subj "/C=US/ST=Wisconsin/L=Waukesha/O=IT Dept/OU=Linux Notes/CN=linux-notes.org"
Создание самоподписанного сертификата (Self-Signed Certificate).
Выполняем команду:
# openssl req -x509 -sha256 -nodes -newkey rsa:2048 -keyout LN-selfsigned.key -out LN-cert.pem
Команда выше будет генерировать самоподписанный сертификат (self-signed) и 2048-битный RSA ключ. Я также использую алгорит шифрования — SHA256. Так как он считается наиболее безопасным в данный момент.
Замечание: По умолчанию, будет сгенерирован ключ толкьо на 1 месяц, если нужно создать на более длительное время — используйте опцию «–days», пример использования ниже.
Пример: Чтобы создать self-signed сертификат на 2 год, используйте:
# openssl req -x509 -sha256 -nodes -days 730 -newkey rsa:2048 -keyout LN-selfsigned.key -out LN-cert.pem
Проверка CSR файла.
Выполням проверку:
# openssl req -noout -text -in linux-notes.org.csr
и вы получите информацию.
Проверка подписи (signature):
$ openssl req -in linux-notes.org.csr -noout -verify
Кем(кому) был выдан сертификат:
$ openssl req -inlinux-notes.org.csr -noout -subject
Показать открытый ключ (public key):
$ openssl req -inlinux-notes.org.csr -noout -pubkey
Создать приватный RSA ключ (Private Key).
Чтобы это сделать, выполните:
# openssl genrsa -out my_private_rsa.key 2048
Если вам просто нужно генерировать RSA закрытый ключ, вы можете использовать команду что выше. Я включил 2048 шифрование, для безопастности.
Удалить ключевую фразу (Passphrase) с ключа.
# openssl rsa -in linux-notes.org.key -check -out nopassphrase.key
Если вы установили ключевую фразу для ключа, то при каждом старте веб-сервера (Apache/Nginx) вы должны будите вводить пароль. Если это вас злит, вы можете с легкостью удалить passphrase с RSA ключа.
Проверка приватного ключа (Private Key)
# openssl rsa -in my_private.key -check
Если вы сомневаетесь в ключевом файле, вы можете использовать команду что выше для проверки.
Проверка сертификата (Certificate).
Если вы хотите проверить данные сертификата( CN, OU, и т.д.), то вы можете использовать команду, которая даст вам сведения о сертификате:
# openssl x509 -in certfile.pem -text –noout
Команда довольна простая в использовании.
Проверка подписанного сертификата (Certificate Signer Authority).
# openssl x509 -in some_cert.pem -noout -issuer -issuer_hash
Можно узнать много полезного.
Создать тестовый SSL сервер.
Команда OpenSSL s_server реализует общий SSL/TLS-сервер. Она должна использоваться только для целей тестирования. В приведенном ниже примере данный сервер прослушивает соединения на порту 8080 и возвращает отформатированную HTML страницу статуса, который включает много информации о ciphers:
$ openssl s_server -key key.pem -cert cert.pem -accept 8080 -www
Проверить хеш вашего сертификата.
# openssl x509 -noout -hash -in my_cert.pem
Конвертирование сертификатов с DER в PEM формат.
# openssl x509 -inform der -in LN.der -out LN.pem
Как правило, при покупке SSL сертификатов, его отдают вам в формате .der и если вам нужно использовать его в веб-сервере или .pem формате, вы можете использовать команду выше, чтобы преобразовать такие сертификаты.
Конвертирование сертификатов с PEM в DER формат.
В случае, если вам необходимо изменить .pem формат в .der:
# openssl x509 -outform der -in linux-notes.pem -out linux-notes.der
Конвертирование CSR c DER в PEM формат.
$ openssl req -in csr.der -inform DER -out csr.pem -outform PEM
Конвертирование сертификата и приватного ключа в PKCS#12 фотмат.
# openssl pkcs12 –export –out sslcert.pfx –inkey key.pem –in sslcert.pem
Если вам необходимо использовать сертификат с приложением Java или с любым другим, кто принимает формат PKCS# 12.
Совет: Вы можете включить «chain certificate» используя «-chain» опцию:
# openssl pkcs12 -export -out my_cert.pfx -inkey my_key.pem -in your_cert.pem -chain the_cert.pem
Создание CSR используя приватный ключ (private key).
# openssl req -out some_cert.csr -key exists.key -new
Если вы не хотите создать новый секретный ключ, а хотите используя вместо существующего, вы можете с предыдущей командой.
Проверьте содержимое сертификата в PKCS12 формате.
# openssl pkcs12 -info -nodes -in my_certificate.p12
PKCS12 — это двоичный формат, так что вы не сможете просматривать содержимое в блокноте или другом редакторе. Таким образом, вы должны использовать команду что выше, для просмотра содержимого файла формата PKCS12.
Конвертирование PKCS12 формата в PEM сертификат.
# openssl pkcs12 -in my_certificat.p12 -out the_certificat.pem
Получить SHA-1 отпечаток сертификата или CSR
Чтобы получить отпечаток SHA1 сертификата с использованием OpenSSL, используйте команду, приведенную ниже:
$ openssl dgst -sha1 my_cert.der
Чтобы получить SHA1 отпечаток пальца CSR с использованием OpenSSL, используйте команду, приведенную ниже:
$ openssl dgst -sha1 the_csr.der
Получить MD5 отпечаток сертификата или CSR
Чтобы получить отпечаток MD5 сертификата с использованием OpenSSL, используйте команду, приведенную ниже:
$ openssl dgst -md5 cert.der
Чтобы получить MD5 отпечаток пальца CSR с использованием OpenSSL, используйте команду, приведенную ниже:
$ openssl dgst -md5 my_csr.der
Тестирование SSL сертификата по URL.
# openssl s_client -connect linux-notes.org:443 -showcerts
Я использую это довольно часто для проверки SSL-сертификатов по URL с сервера. Это очень удобно для проверки некоторых деталей протокола, шифров и CERT.
Узнать версию OpenSSL
# openssl version
Поверка PEM сертификата на завершение (Expiration Date).
# openssl x509 -noout -in cert.pem -dates
Пример:
# openssl x509 -noout -in bestflare.pem -dates notBefore=Jul 4 14:02:45 2015 GMT notAfter=Aug 4 09:46:42 2015 GMT
Проверка завершения SSL сертификата (Expiration Date) по URL.
# openssl s_client -connect linux-notes.org:443 2>/dev/null | openssl x509 -noout -enddate
Проверить поддержку SSL версии V2/V3 по URL.
Проверка SSL версии V2:
# openssl s_client -connect linux-notes.org:443 -ssl2
Проверка SSL версии V3:
# openssl s_client -connect linux-notes.org:443 -ssl3
Проверка TLS 1.0:
# openssl s_client -connect linux-notes.org:443 -tls1
Проверка TLS 1.1:
# openssl s_client -connect linux-notes.org:443 -tls1_1
Проверка TLS 1.2:
# openssl s_client -connect linux-notes.org:443 -tls1_2
Проверка поддержки cipher для сайта по URL.
# openssl s_client -cipher 'ECDHE-ECDSA-AES256-SHA' -connect linux-notes.org:443
Какой алгоритм используется в сертификате (проверка).
$ openssl req -noout -text -in mycert.csr | grep 'Signature Algorithm'
Или, используя URL:
openssl s_client -connect linux-notes.org:443 < /dev/null 2>/dev/null | openssl x509 -text -in /dev/stdin | grep "Signature Algorithm"
Получить сертификат по URL
Команда что ниже, сохранит сертификат в файл прямо по URL сайта:
$ echo -n | openssl s_client -connect linux-notes.org:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > pem.cert
Если веб-сервер имеет несколько сертификатов на один IP-адрес, то вам нужно будет сообщить OpenSSL, какой сертификат будет использоваться, пример ниже:
$ echo -n | openssl s_client -connect linux-notes.org:443 -servername linux-notes.org | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > pem.cert
Вот и все, много полезностей и все в одной статье «Примеры использования OpenSSL в Unix/Linux».