Таблица за команди на OpenSSL

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

Що се отнася до задачи, свързани със сигурността, като генериране на ключове, CSR, сертификати, изчисляване на дайджести, отстраняване на грешки в TLS връзки и други задачи, свързани с PKI и HTTPS, най-вероятно ще използвате инструмента OpenSSL.

OpenSSL включва тонове функции, обхващащи широк спектър от случаи на употреба и е трудно да се запомни синтаксисът за всички тях и е доста лесно да се загубите. manстраниците не са толкова полезни тук, така че често просто гугнем „openssl как да [използвам случая тук]“ или търсим някакъв вид „openssl cheatsheet“, за да си припомним използването на команда и да видим примери.

Тази публикация е моята лична колекция от opensslкомандни фрагменти и примери, групирани по случай на употреба.

Случаи на употреба

Ето списък на случаите на употреба, които ще разгледам:

  1. Работа с RSA и ECDSA ключове
  2. Създаване на заявки за подписване на сертификати (CSR)
  3. Създайте сертификати X.509
  4. Проверете CSR или сертификати
  5. Изчислете дайджести на съобщения и base64 кодиране
  6. TLS клиент за свързване с отдалечен сървър
  7. Измерете TLS връзката и времето за ръкостискане
  8. Преобразуване между кодиране (PEM, DER) и формати на контейнери (PKCS12, PKCS7)
  9. Избройте апартаменти с шифри
  10. Проверете ръчно състоянието на отмяна на сертификат от респондента на 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] ile

cat input.file | openssl [hash_function]

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 certificate.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 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 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 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

This is a multi-step process:

  1. Retrieve the certificate from a remote server
  2. Obtain the intermediate CA certificate chain
  3. Read OCSP endpoint URI from the certificate
  4. 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

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