OpenSSLコマンドのチートシート

最も一般的なOpenSSLコマンドとユースケース

キー、CSR、証明書の生成、ダイジェストの計算、TLS接続のデバッグ、およびPKIとHTTPSに関連するその他のタスクなど、セキュリティ関連のタスクに関しては、OpenSSLツールを使用することになります。

OpenSSLには、幅広いユースケースをカバーする多数の機能が含まれており、それらすべての構文を覚えるのは難しく、迷子になりがちです。manここではページがあまり役に立たないため、Googleで「opensslの方法[ここでの使用例]」を検索するか、コマンドの使用法を思い出して例を確認するための「opensslチートシート」を探すことがよくあります。

この投稿は、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レスポンダーからの証明書失効ステータスを手動で確認する

確かに、これは完全なリストではありませんが、最も一般的なユースケースをカバーし、私が取り組んできたものも含まれています。たとえば、暗号化と復号化をスキップしたり、CA管理に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 CBC256暗号化に基づくパスフレーズで暗号化します。

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:に置き換えられるprime256v1secp384r1secp521r1、または他の任意のサポートされている楕円曲線。

openssl ecparam -genkey -name [curve] | openssl ec -out example.ec.key

ECDSAキーのテキスト表現を印刷します。

openssl ec -in example.ec.key -text -noout

OpenSSLライブラリがサポートする利用可能なEC曲線を一覧表示します。

openssl ecparam -list_curves

指定された長さのDHパラメータを生成します。

openssl dhparam -out dhparams.pem [bits]

証明書署名要求(CSR)を作成する

以下のコマンドでは、交換してください[digest]:サポートされているハッシュ関数の名前でmd5sha1sha224sha256sha384またはsha512、などそれは次のように弱いの機能を回避するために、より良いだmd5sha1、スティックにsha256して上記の。

既存の秘密鍵からCSRを作成します。

openssl req -new -key example.key -out example.csr -[digest]

1つのコマンドでパスフレーズなしで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

openssl構成ファイルを指定して、マルチドメインSAN証明書のCSRを生成します。

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エンコーディングを計算する

計算md5sha1sha256sha384sha512ダイジェスト:

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