この Topic では、非対称暗号化における公開鍵と秘密鍵のコアコンセプトと、それらがどのように機能するかについて説明します。また、OpenSSL と Keytool のコマンドラインインターフェイス (CLI) を使用して、Alibaba Cloud Certificate Management Service の要件を満たす RSA 秘密鍵と、証明書申請のために提出する証明書署名要求 (CSR) ファイルを作成する方法も示します。
公開鍵と秘密鍵の定義
公開鍵と秘密鍵は、非対称暗号化アルゴリズムによって生成されるキーペアです。このキーペアには、以下のコア属性があります。
一意のペアリング
公開鍵と秘密鍵は、不可分なペアとして生成されます。
公開鍵で暗号化されたデータは、対応する秘密鍵でのみ復号できます。
秘密鍵で署名されたデータは、対応する公開鍵でのみ検証できます。
明確な責務
公開鍵: データを暗号化し、署名を検証するために公開されます。
秘密鍵: データを復号し、署名を作成するために厳重に機密保持されます。
SSL/TLS でのアプリケーション
キー交換: 対称暗号化で使用されるセッションキーを安全に送信します。
ID 検証: サーバーが証明書に対応する秘密鍵を所有していることを証明します。
デジタル署名: データの整合性を確保し、ソースを認証します。
秘密鍵はセキュリティシステムのコアです。秘密鍵が漏洩すると、すべての暗号化された通信は安全ではなくなります。秘密鍵がどのように保護されるかの詳細については、「Certificate Management Service は秘密鍵をどのように保護しますか?」をご参照ください。
公開鍵、秘密鍵、SSL 証明書が連携する仕組み
安全な SSL/TLS 通信チャネルは、5 つのステップで確立されます。
証明書の提示
サーバーは SSL 証明書をクライアントに送信します。証明書には以下が含まれます。
サーバーの公開鍵
ドメイン名などの ID 情報
CA のデジタル署名
証明書の有効期間
証明書の検証 (クライアント側)
クライアントは、証明書が信頼された認証局 (CA) によって発行されたかどうかを確認します。
説明この検証プロセスは、クライアントのオペレーティングシステムまたはブラウザにプリインストールされている信頼されたルート証明書ストアに依存します。クライアントは、サーバー証明書、中間証明書、ルート証明書の順に証明書チェーンを検証します。チェーンがローカルストア内の信頼されたルート証明書まで遡ることができれば、サーバー証明書は信頼されます。
クライアントは、証明書が有効期間内であるかどうかを確認します。
クライアントは、証明書のドメイン名がアクセスしているエンドポイントと一致するかどうかを確認します。
秘密鍵の証明
サーバーは、以下のいずれかの方法で秘密鍵を所有していることを証明します。
RSA キー交換: サーバーは秘密鍵を使用して、クライアントから送信されたプリマスターシークレットを復号します。
DH/ECDH キー交換: サーバーは秘密鍵を使用して、ServerKeyExchange メッセージに署名します。
TLS 1.3: サーバーは秘密鍵を使用して、CertificateVerify メッセージに署名します。
セッションキーのネゴシエーション
両者は交換された情報を使用して、対称暗号化のための同一のセッションキーを生成します。
暗号化通信
以降のすべてのデータは、対称暗号化のためのセッションキーを使用して暗号化されます。これにより、効率とセキュリティの両方が確保されます。
秘密鍵の作成
Alibaba Cloud SSL Certificate Service では、秘密鍵が以下の条件を満たす必要があります。
暗号化アルゴリズム: RSA
キー長: 2048 ビット以上
必要に応じて、以下のいずれかの方法で秘密鍵を作成できます。
Alibaba Cloud Certificate Management Service から証明書を購入する場合、証明書の購入、作成、または申請時に Csr生成方法 を システム生成 に設定します。この場合、秘密鍵や CSR ファイルを作成する必要はありません。
新しい秘密鍵の生成
この方法は、Nginx や Apache などのほとんどの非 Java 環境、またはキーをゼロから生成する必要がある場合に最適です。
OpenSSL ツールを入手してインストールします。
OpenSSL の Web サイトからインストールパッケージを入手します。
説明OpenSSL の公式にサポートされている安定版 (1.1.1 や 3.x など) を使用していることを確認してください。古いバージョンには既知のセキュリティ脆弱性が含まれている可能性があります。現在のバージョンは、ターミナルで
openssl versionコマンドを実行することで確認できます。秘密鍵ファイルを生成します。
以下のコマンドは、RSA アルゴリズムと指定されたキー長を使用する
myprivate.pemという名前の PEM 形式の秘密鍵ファイルを作成します。セキュリティ要件に基づいて秘密鍵を生成するには、以下のコマンドのいずれか 1 つだけを実行してください。# 2048 ビットのキーを生成 openssl genrsa -out myprivate.pem 2048 # より安全な 4096 ビットのキーを生成 openssl genrsa -out myprivate.pem 4096 # パスワードで保護された秘密鍵を生成 (高セキュリティシナリオで推奨) openssl genrsa -aes256 -out myprivate.pem 4096
既存の Java Keystore (JKS) から秘密鍵を抽出する
この方法は、keytool を使用して Java Keystore (.jks ファイル) にキーペアを保存しており、秘密鍵を PEM 形式でエクスポートする必要がある場合に使用します。たとえば、Nginx、Apache、CDN などの非 Java 環境を構成するためにこれを行う必要がある場合があります。以下のいずれかの方法を使用してキーをエクスポートできます。
Alibaba Cloud 証明書形式変換ツールを使用する
Alibaba Cloud Certificate Management Service は、JKS キーストアを PEM 形式の秘密鍵と証明書ファイルにワンステップで変換する無料のオンラインツールを提供しています。詳細については、「証明書の形式を変換する」をご参照ください。
OpenSSL コマンドラインインターフェイスを使用する
JKS 形式を PKCS12 形式に変換します。
keytoolCLI は秘密鍵を直接 PEM 形式にエクスポートできません。ただし、まずより汎用的な PKCS12 (.p12) 形式に変換できます。次のコマンドを実行します。ソース JKS キーストアのパスワードと、宛先 PKCS12 ファイルの新しいパスワードを入力するよう求められます。# -srckeystore mydomain.jks : ソースの Java Keystore (JKS) ファイル名を指定します。 # -destkeystore mydomain.p12 : 生成される宛先の PKCS12 ファイルの名前を指定します。 # -srcalias mydomain : JKS キーストア内の秘密鍵エントリの元のエイリアスを指定します。mydomain を実際のエイリアスに置き換えてください。 # -destalias mydomain : 新しい P12 ファイル内のキーエントリの宛先エイリアスを指定します。これは通常、ソースエイリアスと同じです。 keytool -importkeystore -srckeystore mydomain.jks -destkeystore mydomain.p12 -deststoretype PKCS12 -srcalias mydomain -destalias mydomainPKCS12 ファイルから PEM 形式の秘密鍵を抽出します。
OpenSSL がインストールされていない場合は、OpenSSL の Web サイトからインストールパッケージを入手してインストールします。
説明OpenSSL の公式にサポートされている安定版 (1.1.1 や 3.x など) を使用していることを確認してください。古いバージョンには既知のセキュリティ脆弱性が含まれている可能性があります。現在のバージョンは、ターミナルで
openssl versionコマンドを実行することで確認できます。opensslCLI を使用して、前のステップで作成した.p12ファイルから暗号化されていない PEM 形式の秘密鍵を抽出します。次のコマンドを実行します。前のステップで設定した PKCS12 ファイルのパスワードを入力するよう求められます。# myprivate.pem ファイルは、必要な最終的な秘密鍵ファイルです。 # -nodes: 出力される秘密鍵を暗号化しません。 # -nocerts: 証明書を出力せず、秘密鍵のみを出力します。 # OpenSSL 3.0 以降では、下位互換性の問題が発生した場合に -legacy パラメーターを追加します。 openssl pkcs12 -in mydomain.p12 -nodes -nocerts -out myprivate.pem # OpenSSL 3.x で「サポートされていないアルゴリズム」エラーが発生した場合や復号に失敗した場合は、-legacy を追加してみてください。注意: これにより、非推奨の暗号化アルゴリズムが有効になります。 openssl pkcs12 -in mydomain.p12 -nodes -nocerts -out myprivate.pem -legacy
エクスポートされた秘密鍵ファイルは、Privacy-Enhanced Mail (PEM) でエンコードされたテキストファイルです。その内容は通常、以下の 2 つの形式のいずれかで表されます。
PKCS#1 形式
PKCS#1 形式は RSA 暗号化標準の一部であり、RSA 公開鍵と秘密鍵の構文を定義します。秘密鍵ファイルのヘッダーは -----BEGIN RSA PRIVATE KEY----- です。
-----BEGIN RSA PRIVATE KEY-----
(Base64-encoded key content)
-----END RSA PRIVATE KEY-----PKCS#8 形式
PKCS#8 は、秘密鍵情報のためのより一般的な構文標準であり、RSA や ECC などのさまざまなアルゴリズムの秘密鍵を含むことができます。秘密鍵ファイルのヘッダーは -----BEGIN PRIVATE KEY----- です。
-----BEGIN PRIVATE KEY-----
(Base64-encoded key content)
-----END PRIVATE KEY-----生成方法に関係なく、秘密鍵ファイルは常に安全に保管してください。秘密鍵が紛失または漏洩した場合、対応する公開鍵で暗号化されたデータは復号されるリスクにさらされ、関連するデジタル証明書は使用できなくなります。
証明書署名要求 (CSR) の作成
Certificate Management Service で証明書を購入、作成、または申請する際に自己作成の秘密鍵を使用するには、次の手順に従います。
CSR ファイルを作成します。
秘密鍵を使用して、証明書署名要求 (CSR) ファイルを作成します。次のコマンドを実行します。このコマンドでは、国、州または都道府県、市、組織、コモンネームなどの必要な情報を入力するよう求められます。このコマンドは、
mydomain.csrという名前の CSR ファイルを生成します。説明コモンネームは、証明書を申請するドメイン名 (
www.aliyun.comなど) と完全に一致する必要があります。# -key myprivate.pem: 前のステップで生成した秘密鍵ファイルを指定します。 # -out mydomain.csr: 生成される CSR ファイルの名前を指定します。 openssl req -new -key myprivate.pem -out mydomain.csr前のステップで作成した CSR ファイルを使用します。
証明書を購入、作成、または申請する際に、Csr生成方法 を 手動で入力する に設定し、CSR ファイルの内容を貼り付けます。詳細については、「商用証明書の購入」、「SSL 証明書の作成」、および「CA への申請の提出」をご参照ください。