開発者ドキュメント

OpenSSLEssentials:SSL証明書、秘密鍵、およびCSRの操作

序章

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

このガイドの使用方法:

証明書署名要求(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情報のプロンプトに非対話的に回答したい場合は、 -subj CSR情報を要求するOpenSSLコマンドのオプション。 上記のコードブロックに表示されているのと同じ情報を使用したオプションの例を次に示します。

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

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

CSRの生成

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

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

秘密鍵と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情報プロンプトに応答して、プロセスを完了します。

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

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

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

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

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

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

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

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

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

このコマンドは新しいCSRを作成します(domain.csr)既存の証明書に基づく(domain.crt)および秘密鍵(domain.key):

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

The -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情報プロンプトに応答して、プロセスを完了します。

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

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

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

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

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

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

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

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

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

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

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

The -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.crtca-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

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

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バージョン

The 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バージョンの出力を含めてください)。

モバイルバージョンを終了