OpenSSL Essentials:SSL証明書、秘密鍵、およびCSRの使用

前書き

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

このガイドの使用方法:

  • 証明書署名要求(CSR)に精通していない場合は、最初のセクションをお読みください

  • 最初のセクションは別として、このガイドはシンプルなチートシート形式で、自己完結型のコマンドラインスニペットです。

  • 完了しようとしているタスクに関連するセクションにジャンプします(ヒント:左下の_Contents_メニューまたはブラウザの_Find_機能を使用します)

  • ほとんどのコマンドは、明確にするために( `+ \ +`記号を使用して)複数行に展開されたワンライナーです。

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

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

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

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

CSR情報プロンプトの表示例を次に示します。

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

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

-subj "/C=/ST=/L=/O=/CN="

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

CSRの生成

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

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

秘密鍵とCSRを生成する

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

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

openssl req \
      -newkey rsa:2048 -nodes -keyout  \
      -out

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

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

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

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

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

openssl req \
      -key  \
      -new -out

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

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

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

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

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

openssl x509 \
      -in  \
      -signkey  \
      -x509toreq -out

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

SSL証明書の生成

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

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

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

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

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

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

openssl req \
      -newkey rsa:2048 -nodes -keyout  \
      -x509 -days 365 -out

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

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

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

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

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

openssl req \
      -key  \
      -new \
      -x509 -days 365 -out

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

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

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

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

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

openssl x509 \
      -signkey  \
      -in  \
      -req -days 365 -out

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

証明書を見る

証明書とCSRファイルはPEM形式でエンコードされますが、人間がすぐに読むことはできません。

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

CSRエントリを表示

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

openssl req -text -noout -verify -in

証明書エントリを表示する

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

openssl x509 -text -noout -in

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

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

openssl verify -verbose -CAFile

秘密鍵

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

秘密鍵を作成する

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

openssl genrsa -des3 -out  2048

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

秘密鍵を検証する

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

openssl rsa -check -in

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

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

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

openssl rsa -noout -modulus -in  | openssl md5
openssl x509 -noout -modulus -in  | openssl md5
openssl req -noout -modulus -in  | openssl md5

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

秘密鍵を暗号化する

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

openssl rsa -des3 \
      -in  \
      -out

秘密鍵を暗号化するためのパスフレーズを入力します。

秘密鍵を解読する

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

openssl rsa \
      -in  \
      -out

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

証明書の形式を変換する

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

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

PEMからDERに変換

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

openssl x509 \
      -in  \
      -outform der -out

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

DERからPEMに換算

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

openssl x509 \
      -inform der -in  \
      -out

PEMからPKCS7への変換

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

openssl crl2pkcs7 -nocrl \
      -certfile  \
      -certfile  \
      -out domain.p7b

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

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

PKCS7からPEMに変換

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

openssl pkcs7 \
      -in  \
      -print_certs -out

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

PEMからPKCS12への変換

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

openssl pkcs12 \
      -inkey  \
      -in  \
      -export -out

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

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

PKCS12からPEMに変換

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

openssl pkcs12 \
      -in  \
      -nodes -out

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

OpenSSLバージョン

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

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

openssl version -a

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

OpenSSL 1.0.1f 6 Jan 2014
built on: Mon Apr  7 21:22:23 UTC 2014
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/usr/lib/ssl"

結論

それは、ほとんどの人がOpenSSLを使用してSSL証明書を処理する方法をカバーするはずです! ここには記載されていない他の多くの用途があるので、コメントで他の用途を尋ねたり提案したりしてください。

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