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

Найпоширеніші команди OpenSSL та випадки використання

Що стосується завдань, пов’язаних із безпекою, таких як генерація ключів, CSR, сертифікатів, обчислення дайджестів, налагодження з’єднань TLS та інших завдань, пов’язаних з PKI та HTTPS, ви, швидше за все, скористаєтесь інструментом OpenSSL.

OpenSSL включає безліч функцій, що охоплюють широкий спектр випадків використання, і важко запам'ятати його синтаксис для всіх них і досить легко загубитися. manсторінки тут не настільки корисні, тому ми часто просто Google “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 для управління ЦС. 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

Надайте інформацію про тему КСВ у командному рядку, а не за допомогою інтерактивного підказки.

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", і це приватний ключ. Якщо ви були компанією з ЦС, це показує дуже наївний приклад того, як ви можете видавати нові сертифікати.

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