Най-често срещаните команди и случаи на употреба на OpenSSL

Що се отнася до задачи, свързани със сигурността, като генериране на ключове, CSR, сертификати, изчисляване на дайджести, отстраняване на грешки в TLS връзки и други задачи, свързани с PKI и HTTPS, най-вероятно ще използвате инструмента OpenSSL.
OpenSSL включва тонове функции, обхващащи широк спектър от случаи на употреба и е трудно да се запомни синтаксисът за всички тях и е доста лесно да се загубите. man
страниците не са толкова полезни тук, така че често просто гугнем „openssl как да [използвам случая тук]“ или търсим някакъв вид „openssl cheatsheet“, за да си припомним използването на команда и да видим примери.
Тази публикация е моята лична колекция от openssl
командни фрагменти и примери, групирани по случай на употреба.
Случаи на употреба
Ето списък на случаите на употреба, които ще разгледам:
- Работа с RSA и ECDSA ключове
- Създаване на заявки за подписване на сертификати (CSR)
- Създайте сертификати X.509
- Проверете CSR или сертификати
- Изчислете дайджести на съобщения и base64 кодиране
- TLS клиент за свързване с отдалечен сървър
- Измерете TLS връзката и времето за ръкостискане
- Преобразуване между кодиране (PEM, DER) и формати на контейнери (PKCS12, PKCS7)
- Избройте апартаменти с шифри
- Проверете ръчно състоянието на отмяна на сертификат от респондента на OCSP
Със сигурност това не е пълен списък, но обхваща най-често срещаните случаи на употреба и включва тези, с които съм работил. Например пропускам криптирането и декриптирането или използвам openssl за управление на CA. openssl
е като вселена. Никога не се знае къде свършва. ?
Работа с RSA и ECDSA ключове
В командите по-долу заменете [bits]
с размера на ключа (например 2048, 4096, 8192).
Генерирайте RSA ключ:
openssl genrsa -out example.key [bits]
Отпечатайте само публичен ключ или модул:
openssl rsa -in example.key -pubout
openssl rsa -in example.key -noout -modulus
Печат на текстово представяне на RSA ключ:
openssl rsa -in example.key -text -noout
Генерирайте нов RSA ключ и шифровайте с парола, базирана на AES CBC 256 криптиране:
openssl genrsa -aes256 -out example.key [bits]
Проверете личния си ключ. Ако ключът има парола, ще бъдете подканени за нея:
openssl rsa -check -in example.key
Премахнете паролата от ключа:
openssl rsa -in example.key -out example.key
Шифровайте съществуващия частен ключ с пропуск:
openssl rsa -des3 -in example.key -out example_with_pass.key
Генерирайте ECDSA ключ. curve
е да се замени с: prime256v1
, secp384r1
, secp521r1
, или друг поддържан елиптична крива:
openssl ecparam -genkey -name [curve] | openssl ec -out example.ec.key
Печат на ECDSA ключово текстово представяне:
openssl ec -in example.ec.key -text -noout
Избройте наличните EC криви, които OpenSSL библиотеката поддържа:
openssl ecparam -list_curves
Генерирайте DH параметри с дадена дължина:
openssl dhparam -out dhparams.pem [bits]
Създаване на заявки за подписване на сертификати (CSR)
В командите по-долу, да замени [digest]
с името на поддържа хеш функцията: md5
, sha1
, sha224
, sha256
, sha384
или sha512
и т.н. По-добре е да се избегне слаби функции като md5
и sha1
, и се придържаме към sha256
по-нова.
Създайте CSR от съществуващ частен ключ.
openssl req -new -key example.key -out example.csr -[digest]
Създайте CSR и частен ключ без парола в една команда:
openssl req -nodes -newkey rsa:[bits] -keyout example.key -out example.csr
Предоставяйте информация за CSR тема в команден ред, а не чрез интерактивен ред.
openssl req -nodes -newkey rsa:[bits] -keyout example.key -out example.csr -subj "/C=UA/ST=Kharkov/L=Kharkov/O=Super Secure Company/OU=IT Department/CN=example.com"
Създайте CSR от съществуващ сертификат и частен ключ:
openssl x509 -x509toreq -in cert.pem -out example.csr -signkey example.key
Генерирайте CSR за многодоменен SAN сертификат, като предоставите конфигурационен файл openssl:
openssl req -new -key example.key -out example.csr -config req.conf
където req.conf
:
[req]prompt=nodefault_md = sha256distinguished_name = dnreq_extensions = req_ext
[dn]CN=example.com
[req_ext][email protected]_names
[alt_names]DNS.1=example.comDNS.2=www.example.comDNS.3=ftp.example.com
Създайте сертификати X.509
Създайте самоподписан сертификат и нов частен ключ от нулата:
openssl req -nodes -newkey rsa:2048 -keyout example.key -out example.crt -x509 -days 365
Създайте самоподписан сертификат, използвайки съществуващ CSR и частен ключ:
openssl x509 -req -in example.csr -signkey example.key -out example.crt -days 365
Подпишете детски сертификат, като използвате вашия собствен сертификат „CA“ и това е частен ключ. Ако сте CA компания, това показва много наивен пример за това как бихте могли да издавате нови сертификати.
openssl x509 -req -in child.csr -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -out child.crt
Отпечатайте текстово представяне на сертификата
openssl x509 -in example.crt -text -noout
Отпечатайте пръстовия отпечатък на сертификата като md5, sha1, sha256 дайджест:
openssl x509 -in cert.pem -fingerprint -sha256 -noout
Проверете CSR или сертификати
Проверете CSR подпис:
openssl req -in example.csr -verify
Проверете дали частният ключ съвпада със сертификат и CSR:
openssl rsa -noout -modulus -in example.key | openssl sha256
openssl x509 -noout -modulus -in example.crt | openssl sha256
openssl req -noout -modulus -in example.csr | openssl sha256
Проверете сертификата, при условие, че имате корен и всички незабавни сертификати, конфигурирани като доверени на вашата машина:
openssl verify example.crt
Проверете сертификата, когато имате междинна верига от сертификати. Основният сертификат не е част от пакета и трябва да бъде конфигуриран като доверен на вашата машина.
openssl verify -untrusted intermediate-ca-chain.pem example.crt
Проверете сертификата, когато имате междинна верига от сертификати и корен сертификат, който не е конфигуриран като доверен.
openssl verify -CAFile root.crt -untrusted intermediate-ca-chain.pem child.crt
Проверете дали сертификатът, обслужван от отдалечен сървър, покрива дадено име на хост. Полезно да проверите дали вашият сертификат за мултидомейн покрива правилно всички имена на хостове.
openssl s_client -verify_hostname www.example.com -connect example.com:443
Изчислете дайджести на съобщения и base64 кодиране
Изчисли md5
, sha1
, sha256
, sha384
, sha512
разградени продукти:
openssl dgst -[hash_function]
le
cat input.file | openssl [hash_functi
on]
Base64 encoding and decoding:
cat /dev/urandom | head -c 50 | openssl base64 | openssl base64 -d
TLS client to connect to a remote server
Connect to a server supporting TLS:
openssl s_client -connect example.com:443
openssl s_client -host example.com -port 443
Connect to a server and show full certificate chain:
openssl s_client -showcerts -host example.com -port 443 ull
Extract the certificate:
openssl s_client -connect example.com:443 2>&1 certif
icate.pem
Override SNI (Server Name Indication) extension with another server name. Useful for testing when multiple secure sites are hosted on same IP address:
openssl s_client -servername www.example.com -host example.com -port 443
Test TLS connection by forcibly using specific cipher suite, e.g.
ECDHE-RSA-AES128-GCM-SHA256
. Useful to check if a server can properly talk via different configured cipher suites, not one it prefers.
openssl s_client -host example.com -port 443 -cipher ECDHE-RSA-AES128-GCM-SHA256 2>&1 v/null
Measure TLS connection and handshake time
Measure TLS connection and handshake time
Measure SSL connection time without/with session reuse:
openssl s_time -connect example.com:443 -new
openssl s_time -connect example.com:443 -reuse
Roughly examine TCP and SSL handshake times using
curl
:
curl -kso /dev/null -w "tcp:%{time_connect}, ssldone:%{time_appconnect}\n" //example.com
Measure speed of various security algorithms:
openssl speed rsa2048
openssl speed ecdsap256
Convert between encoding and container formats
Convert between encoding and container formats
Convert certificate between DER and PEM formats:
openssl x509 -in example.pem -outform der -out example.der
openssl x509 -in example.der -inform der -out example.pem
Combine several certificates in PKCS7 (P7B) file:
openssl crl2pkcs7 -nocrl -certfile child.crt -certfile ca.crt -out example.p7b
Convert from PKCS7 back to PEM. If PKCS7 file has multiple certificates, the PEM file will contain all of the items in it.
openssl pkcs7 -in example.p7b -print_certs -out example.crt
Combine a PEM certificate file and a private key to PKCS#12 (.pfx .p12). Also, you can add a chain of certificates to PKCS12 file.
openssl pkcs12 -export -out certificate.pfx -inkey privkey.pem -in certificate.pem -certfile ca-chain.pem
Convert a PKCS#12 file (.pfx .p12) containing a private key and certificates back to PEM:
openssl pkcs12 -in keystore.pfx -out keystore.pem -nodes
List cipher suites
List cipher suites
List available TLS cipher suites, openssl client is capable of:
openssl ciphers -v
Enumerate all individual cipher suites, which are described by a short-hand OpenSSL cipher list string. This is useful when you’re configuring server (like Nginx), and you need to test your
ssl_ciphers
string.
openssl ciphers -v 'EECDH+ECDSA+AESGCM:EECDH+aRSA+SHA256:EECDH:DHE+AESGCM:DHE:!RSA!aNULL:!eNULL:!LOW:!RC4'
Manually check certificate revocation status from OCSP responder
Manually check certificate revocation status from OCSP responder
This is a multi-step process:
Retrieve the certificate from a remote server
Obtain the intermediate CA certificate chain
Read OCSP endpoint URI from the certificate
Request a remote OCSP responder for certificate revocation status
First, retrieve the certificate from a remote server:
openssl s_client -connect example.com:443 2>&1
cert.pem
You’d also need to obtain intermediate CA certificate chain. Use
-showcerts
flag to show full certificate chain, and manually save all intermediate certificates to chain.pem
file:
openssl s_client -showcerts -host example.com -port 443 ull
Read OCSP endpoint URI from the certificate:
openssl x509 -in cert.pem -noout -ocsp_uri
Request a remote OCSP responder for certificate revocation status using the URI from the above step (e.g. //ocsp.stg-int-x1.letsencrypt.org).
openssl ocsp -header "Host" "ocsp.stg-int-x1.letsencrypt.org" -issuer chain.pem -VAfile chain.pem -cert cert.pem -text -url //ocsp.stg-int-x1.letsencrypt.org
Resources
Resources
I’ve put together a few resources about OpenSSL that you may find useful.
OpenSSL Essentials: Working with SSL Certificates, Private Keys and CSRs | DigitalOcean — //www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs
The Most Common OpenSSL Commands — //www.sslshopper.com/article-most-common-openssl-commands.html
OpenSSL: Working with SSL Certificates, Private Keys and CSRs — //www.dynacont.net/documentation/linux/openssl/

Original text