序章

OpenSSLは、公開鍵インフラストラクチャ(PKI)およびHTTPS(HTTP over TLS)に関連するさまざまなタスクに使用できる多用途のコマンドラインツールです。 このチートシートスタイルガイドは、一般的な日常のシナリオで役立つOpenSSLコマンドへのクイックリファレンスを提供します。 これには、秘密鍵、証明書署名要求、および証明書形式の変換を生成するためのOpenSSLの例が含まれます。 OpenSSLのすべての使用法を網羅しているわけではありません。

このガイドの使用方法:

  • 証明書署名要求(CSR)に精通していない場合は、最初のセクションをお読みください
  • 最初のセクションを除いて、このガイドはチートシート形式です。自己完結型のコマンドラインスニペットのリストです。
  • 実行しようとしているタスクに関連するセクションにジャンプします(ヒント:コンテンツメニューまたはブラウザの検索機能を使用してください)
  • ほとんどのコマンドは、わかりやすくするために(\記号を使用して)複数行に拡張されたワンライナーです。

証明書署名要求(CSR)について

商用認証局(CA)からSSL証明書を取得する場合は、証明書署名要求(CSR)を生成する必要があります。 CSRは、主にキーペアの公開キーといくつかの追加情報で構成されます。 これらのコンポーネントは両方とも、署名時に証明書に挿入されます。

CSRを生成するたびに、証明書に関する情報を提供するように求められます。 この情報は、識別名(DN)と呼ばれます。 DNの重要なフィールドは、共通名(CN)です。これは、証明書を使用する予定のホストの正確な完全修飾ドメイン名(FQDN)である必要があります。 コマンドラインまたはファイルから情報を渡すことにより、CSRを作成するときに対話型プロンプトをスキップすることもできます。

DNの他の項目は、ビジネスまたは組織に関する追加情報を提供します。 認証局からSSL証明書を購入する場合、「組織」などのこれらの追加フィールドが組織の詳細を正確に反映していることが必要になることがよくあります。

CSR情報プロンプトがどのように表示されるかの例を次に示します。

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

CSR情報プロンプトに非対話的に応答する場合は、CSR情報を要求するOpenSSLコマンドに-subjオプションを追加することで応答できます。 上記のコードブロックに表示されているのと同じ情報を使用したオプションの例を次に示します。

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

CSRを理解したので、このガイドのどのセクションでもOpenSSLのニーズをカバーしているところに自由にジャンプしてください。

CSRの生成

このセクションでは、CSR(およびまだ存在しない場合は秘密鍵)の生成に関連するOpenSSLコマンドについて説明します。 CSRを使用して、認証局にSSL証明書を要求できます。

前のセクションで説明した-subjオプションを使用して、CSR情報を非対話的に追加できることに注意してください。

秘密鍵とCSRを生成する

HTTPS(HTTP over TLS)を使用してApacheHTTPまたはNginxWebサーバーを保護し、認証局(CA)を使用してSSL証明書を発行する場合は、この方法を使用します。 生成されたCSRをCAに送信して、CA署名付きSSL証明書の発行を要求できます。 CAがSHA-2をサポートしている場合は、-sha256オプションを追加して、SHA-2でCSRに署名します。

このコマンドは、2048ビットの秘密鍵(domain.key)とCSR(domain.csr)を最初から作成します。

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -out domain.csr

CSR情報プロンプトに応答して、プロセスを完了します。

-newkey rsa:2048オプションは、RSAアルゴリズムを使用して生成されたキーが2048ビットであることを指定します。 -nodesオプションは、秘密鍵をパスフレーズで暗号化しないことを指定します-newオプションは、ここには含まれていませんが暗黙的に示され、CSRが生成されていることを示します。

既存の秘密鍵からCSRを生成する

CAからの証明書の要求に使用する秘密鍵がすでにある場合は、この方法を使用します。

このコマンドは、既存の秘密鍵(domain.key)に基づいて新しいCSR(domain.csr)を作成します。

  1. openssl req \
  2. -key domain.key \
  3. -new -out domain.csr

CSR情報プロンプトに応答して、プロセスを完了します。

-keyオプションは、新しいCSRの生成に使用される既存の秘密鍵(domain.key)を指定します。 -newオプションは、CSRが生成されていることを示します。

既存の証明書と秘密鍵からCSRを生成する

既存の証明書を更新したいが、何らかの理由であなたまたはあなたのCAが元のCSRを持っていない場合は、この方法を使用します。 基本的に、既存の証明書からCSR情報を抽出するため、CSR情報を再入力する手間が省けます。

このコマンドは、既存の証明書(domain.crt)と秘密鍵(domain.key)に基づいて新しいCSR(domain.csr)を作成します。

  1. openssl x509 \
  2. -in domain.crt \
  3. -signkey domain.key \
  4. -x509toreq -out domain.csr

-x509toreqオプションは、CSRを作成するためにX509証明書を使用していることを指定します。

SSL証明書の生成

SSL証明書を使用してサービスを保護したいが、CA署名付き証明書は必要ない場合、有効な(そして無料の)解決策は、独自の証明書に署名することです。

自分で発行できる証明書の一般的なタイプは、自己署名証明書です。 自己署名証明書は、独自の秘密鍵で署名された証明書です。 自己署名証明書は、CA署名証明書と同様にデータの暗号化に使用できますが、ユーザーには、証明書がコンピューターまたはブラウザーによって信頼されていないことを示す警告が表示されます。 したがって、自己署名証明書は、サービスのIDをユーザーに証明する必要がない場合にのみ使用する必要があります(例: 非本番サーバーまたは非公開サーバー)。

このセクションでは、自己署名証明書の生成に関連するOpenSSLコマンドについて説明します。

自己署名証明書を生成する

HTTPS(HTTP over TLS)を使用してApacheHTTPまたはNginxWebサーバーを保護し、証明書がCAによって署名されている必要がない場合は、この方法を使用します。

このコマンドは、2048ビットの秘密鍵(domain.key)と自己署名証明書(domain.crt)を最初から作成します。

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -x509 -days 365 -out domain.crt

CSR情報プロンプトに応答して、プロセスを完了します。

-x509オプションは、reqに自己署名証明書を作成するように指示します。 -days 365オプションは、証明書が365日間有効であることを指定します。 証明書に関連付ける情報を収集するために、一時的なCSRが生成されます。

既存の秘密鍵から自己署名証明書を生成する

自己署名証明書を生成する秘密鍵がすでにある場合は、この方法を使用します。

このコマンドは、既存の秘密鍵(domain.key)から自己署名証明書(domain.crt)を作成します。

  1. openssl req \
  2. -key domain.key \
  3. -new \
  4. -x509 -days 365 -out domain.crt

CSR情報プロンプトに応答して、プロセスを完了します。

-x509オプションは、reqに自己署名証明書を作成するように指示します。 -days 365オプションは、証明書が365日間有効であることを指定します。 -newオプションは、CSR情報プロンプトを有効にします。

既存の秘密鍵とCSRから自己署名証明書を生成する

すでに秘密鍵とCSRがあり、それらを使用して自己署名証明書を生成する場合は、この方法を使用します。

このコマンドは、既存の秘密鍵(domain.key)および(domain.csr)から自己署名証明書(domain.crt)を作成します。

  1. openssl x509 \
  2. -signkey domain.key \
  3. -in domain.csr \
  4. -req -days 365 -out domain.crt

-days 365オプションは、証明書が365日間有効であることを指定します。

証明書を表示する

証明書ファイルとCSRファイルはPEM形式でエンコードされているため、人間が簡単に読み取ることはできません。

このセクションでは、PEMでエンコードされたファイルの実際のエントリを出力するOpenSSLコマンドについて説明します。

CSRエントリを表示する

このコマンドを使用すると、CSR(domain.csr)の内容をプレーンテキストで表示および確認できます。

  1. openssl req -text -noout -verify -in domain.csr

証明書エントリの表示

このコマンドを使用すると、証明書(domain.crt)の内容をプレーンテキストで表示できます。

  1. openssl x509 -text -noout -in domain.crt

証明書がCAによって署名されたことを確認します

このコマンドを使用して、証明書(domain.crt)が特定のCA証明書(ca.crt)によって署名されていることを確認します。

  1. openssl verify -verbose -CAFile ca.crt domain.crt

秘密鍵

このセクションでは、秘密鍵の作成と検証に固有のOpenSSLコマンドについて説明します。

秘密鍵を作成する

このコマンドを使用して、パスワードで保護された2048ビットの秘密鍵(domain.key)を作成します。

  1. openssl genrsa -des3 -out domain.key 2048

プロセスを完了するように求められたら、パスワードを入力します。

秘密鍵を確認する

このコマンドを使用して、秘密鍵(domain.key)が有効な鍵であることを確認します。

  1. openssl rsa -check -in domain.key

秘密鍵が暗号化されている場合は、パスフレーズの入力を求められます。 成功すると、暗号化されていないキーが端末に出力されます。

秘密鍵が証明書とCSRに一致することを確認する

次のコマンドを使用して、秘密鍵(domain.key)が証明書(domain.crt)およびCSR(domain.csr)と一致するかどうかを確認します。

  1. openssl rsa -noout -modulus -in domain.key | openssl md5
  2. openssl x509 -noout -modulus -in domain.crt | openssl md5
  3. openssl req -noout -modulus -in domain.csr | openssl md5

各コマンドの出力が同一である場合、秘密鍵、証明書、およびCSRが関連している可能性が非常に高くなります。

秘密鍵を暗号化する

これは、暗号化されていない秘密鍵(unencrypted.key)を受け取り、その暗号化されたバージョン(encrypted.key)を出力します。

  1. openssl rsa -des3 \
  2. -in unencrypted.key \
  3. -out encrypted.key

秘密鍵を暗号化するには、目的のパスフレーズを入力します。

秘密鍵を復号化する

これは、暗号化された秘密鍵(encrypted.key)を受け取り、その復号化されたバージョン(decrypted.key)を出力します。

  1. openssl rsa \
  2. -in encrypted.key \
  3. -out decrypted.key

プロンプトが表示されたら、暗号化されたキーのパスフレーズを入力します。

証明書形式の変換

私たちが扱ってきた証明書はすべて、ASCIIPEMでエンコードされたX.509証明書です。 他にもさまざまな種類の証明書エンコーディングとコンテナがあります。 一部のアプリケーションは、特定の形式を他の形式よりも優先します。 また、これらの形式の多くは、秘密鍵、証明書、CA証明書などの複数の項目を1つのファイルに含めることができます。

OpenSSLを使用して、これらのさまざまな形式との間で証明書を変換できます。 このセクションでは、可能な変換のいくつかについて説明します。

PEMをDERに変換する

PEMでエンコードされた証明書(domain.crt)をバイナリ形式のDERでエンコードされた証明書(domain.der)に変換する場合は、このコマンドを使用します。

  1. openssl x509 \
  2. -in domain.crt \
  3. -outform der -out domain.der

DER形式は通常Javaで使用されます。

DERをPEMに変換する

DERでエンコードされた証明書(domain.der)をPEMでエンコードされた証明書(domain.crt)に変換する場合は、次のコマンドを使用します。

  1. openssl x509 \
  2. -inform der -in domain.der \
  3. -out domain.crt

PEMをPKCS7に変換する

PEM証明書(domain.crtおよびca-chain.crt)をPKCS7ファイル(domain.p7b)に追加する場合は、次のコマンドを使用します。

  1. openssl crl2pkcs7 -nocrl \
  2. -certfile domain.crt \
  3. -certfile ca-chain.crt \
  4. -out domain.p7b

1つ以上の-certfileオプションを使用して、PKCS7ファイルに追加する証明書を指定できることに注意してください。

P7Bとも呼ばれるPKCS7ファイルは、通常、JavaキーストアおよびMicrosoft IIS(Windows)で使用されます。 これらは、証明書とCA証明書を含むことができるASCIIファイルです。

PKCS7をPEMに変換する

PKCS7ファイル(domain.p7b)をPEMファイルに変換する場合は、次のコマンドを使用します。

  1. openssl pkcs7 \
  2. -in domain.p7b \
  3. -print_certs -out domain.crt

PKCS7ファイルに複数のアイテムが含まれている場合(例: 証明書とCA中間証明書)、作成されるPEMファイルには、その中のすべてのアイテムが含まれます。

PEMをPKCS12に変換する

秘密鍵(domain.key)と証明書(domain.crt)を取得し、それらをPKCS12ファイル(domain.pfx)に結合する場合は、このコマンドを使用します。

  1. openssl pkcs12 \
  2. -inkey domain.key \
  3. -in domain.crt \
  4. -export -out domain.pfx

エクスポートパスワードの入力を求められますが、空白のままにすることができます。 この場合、証明書を1つのPEMファイル(domain.crt)に連結することにより、証明書のチェーンをPKCS12ファイルに追加できることに注意してください。

PFXファイルとも呼ばれるPKCS12ファイルは、通常、Microsoft IIS(Windows)で証明書チェーンをインポートおよびエクスポートするために使用されます。

PKCS12をPEMに変換する

PKCS12ファイル(domain.pfx)を変換してPEM形式(domain.combined.crt)に変換する場合は、次のコマンドを使用します。

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

PKCS12ファイルに複数のアイテムが含まれている場合(例: 証明書と秘密鍵)、作成されるPEMファイルには、その中のすべてのアイテムが含まれます。

OpenSSLバージョン

openssl versionコマンドを使用して、実行しているバージョンを確認できます。 実行しているOpenSSLのバージョン、およびそれがコンパイルされたオプションは、使用可能な機能(および場合によってはコマンドラインオプション)に影響します。

次のコマンドは、実行しているOpenSSLバージョンと、それがコンパイルされたすべてのオプションを表示します。

openssl version -a

このガイドは、OpenSSLバイナリを使用して作成され、次の詳細(前のコマンドの出力)が含まれています。

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

結論

これは、ほとんどの人がOpenSSLを使用してSSL証明書を操作する方法をカバーしているはずです。 ここでは取り上げていない他の多くの用途がありますので、コメントで他の用途を質問または提案してください。

コマンドのいずれかに問題がある場合は、必ずコメントしてください(OpenSSLバージョンの出力を含めてください)。