SSL証明書、プライベートキー、およびCSRの操作のOpenSSL Essentials

はじめに

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

このガイドの使用方法:

  • 証明書署名要求(CSR)に馴染みがない場合は、最初のセクションを読んでください。
  • 最初のセクションを除いて、このガイドはチートシート形式です:自己完結型のコマンドラインスニペットのリストです。
  • 完了しようとしているタスクに関連する任意のセクションに移動します(ヒント:目次メニューを使用するか、ブラウザの検索機能を使用します)。コンテンツメニューまたは検索機能)
  • ほとんどのコマンドは、明確さのために複数の行に展開された1行のコマンドです(\記号を使用)

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

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

CSRを生成するたびに、証明書に関する情報を提供するように求められます。この情報は、識別名(DN)として知られています。 DNの重要なフィールドは、Common Name(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情報プロンプトに答えることができます。これは、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 を生成する

Apache HTTP または Nginx ウェブサーバーをセキュリティで保護するために HTTPS(TLS over HTTP)を使用し、SSL 証明書を発行するために証明書機関(CA)を使用したい場合にこの方法を使用します。生成された CSR は、CA に送信して CA 署名の SSL 証明書の発行を要求できます。CA が SHA-2 をサポートしている場合は、CSR に SHA-2 を使用して署名するために -sha256 オプションを追加してください。

このコマンドは、ゼロから 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情報を再入力する手間が省けます。

このコマンドは、既存の証明書(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によって署名された証明書は必要ない場合、有効な(無料の)解決策は自己署名の証明書を作成することです。

A common type of certificate that you can issue yourself is a self-signed certificate. A self-signed certificate is a certificate that is signed with its own private key. Self-signed certificates can be used to encrypt data just as well as CA-signed certificates, but your users will be displayed a warning that says that the certificate is not trusted by their computer or browser. Therefore, self-signed certificates should only be used if you do not need to prove your service’s identity to its users (e.g. non-production or non-public servers).

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

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

この方法は、Apache HTTPまたはNginxウェブサーバーを保護するためにHTTPS(TLS上のHTTP)を使用し、証明書が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によって署名された証明書を確認

このコマンドを使用して、特定のCA証明書(ca.crt)によって証明書(domain.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

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

証明書の形式変換

これまでに扱ってきたすべての証明書は、ASCII PEMエンコードされたX.509証明書です。他の証明書のエンコーディングやコンテナの種類にはさまざまなものがあります。一部のアプリケーションは、他の形式を好む場合があります。また、これらの形式の多くは、1つのファイルにプライベートキー、証明書、CA証明書などの複数のアイテムを含めることができます。

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

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

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

PKCS12ファイル、またはPFXファイルとしても知られており、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

結論

これで、ほとんどの人がSSL証明書を扱うためにOpenSSLを使用する方法がカバーされるはずです。ここでカバーされていない多くの他の用途がありますので、コメントで他の用途をお知らせいただくか、提案してください。

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

Source:
https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs