ApsaraDB RDS for PostgreSQL は、Alibaba Cloud が管理する証明書とカスタム証明書の両方を使用した SSL 暗号化をサポートしています。認証局 (CA) を制御する必要がある場合や、サブジェクト代替名 (SAN) を使用して複数のエンドポイントを保護する必要がある場合は、カスタム証明書を使用します。
このトピックでは、OpenSSL を使用してカスタム証明書を生成し、ご利用の RDS インスタンスに設定する方法について説明します。
前提条件
開始する前に、次の要件が満たされていることを確認してください。
-
PostgreSQL 10 以降を実行し、クラウドディスクを使用する RDS インスタンス。サーバーレス RDS インスタンスはサポートされていません。
-
OpenSSL がインストールされていること。Linux には OpenSSL がデフォルトで含まれています。Windows の場合は、Win32/Win64 OpenSSL ページからダウンロードしてインストールします。
注意事項
-
SSL 暗号化を有効にすると、CPU 使用率と読み書きのレイテンシーが増加します。
-
SSL 暗号化を有効にした後、変更を有効にするには、既存の接続を閉じて新しい接続を確立する必要があります。
-
以下の操作は RDS インスタンスの再起動をトリガーし、約 3 分かかります。オフピーク時間帯に実行してください。
-
カスタム証明書の設定
-
既存のカスタム証明書の変更
-
SSL 暗号化の無効化
-
ステップ 1: 証明書ファイルの生成
サーバー証明書または自己署名証明書の秘密鍵を作成する際に、パスワードによる暗号化を有効にしないでください。パスワードで暗号化された秘密鍵では、SSL 暗号化を有効にできません。
以下のコマンドは CentOS を例としています。Windows では、同じ openssl コマンドを実行しますが、cp と vim の代わりに copy コマンドとテキストエディターを使用します。
単一エンドポイント
以下の 3 つのコマンドを順番に実行します。
# 1. 自己署名 CA 証明書とその秘密鍵を作成
openssl req -new -x509 -days 365 -nodes -out server-ca.crt -keyout server-ca.key -subj "/CN=root-server-ca"
# 2. サーバー証明書の証明書署名要求 (CSR) と秘密鍵を作成
# CN の値を保護したいエンドポイントに置き換える
openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=pgm-bpxxxxx.pg.rds.aliyuncs.com"
# 3. CA で CSR に署名してサーバー証明書を生成
openssl x509 -req -in server.csr -text -days 365 -CA server-ca.crt -CAkey server-ca.key -CAcreateserial -out server.crt
CN 値で使用するエンドポイントを確認するには、「ApsaraDB RDS for PostgreSQL インスタンスのエンドポイントとポート番号の表示と変更」をご参照ください。
複数のエンドポイント (サブジェクト代替名)
複数のエンドポイントを保護するには、それらをサブジェクト代替名 (SAN) として証明書に含めます。
# 1. 自己署名 CA 証明書とその秘密鍵を作成
openssl req -new -x509 -days 365 -nodes -out server-ca.crt -keyout server-ca.key -subj "/CN=root-server-ca"
# 2. デフォルトの OpenSSL 設定を一時ファイルにコピー
cp /etc/pki/tls/openssl.cnf /tmp/openssl.cnf
Windows では、openssl.cnfファイルは OpenSSL のインストールフォルダー配下の\bin\cnfディレクトリにあります。任意のディレクトリにコピーしてください。
テキストエディターで /tmp/openssl.cnf を開き、以下の内容を追加します。
# [ req ] セクションの末尾に追加
req_extensions = v3_req
# 新しい [ v3_req ] セクションを追加
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
# 新しい [ alt_names ] セクションを追加 — 各エンドポイントを DNS エントリとしてリストアップ
[ alt_names ]
DNS.1 = pgm-bpxxxxx.pg.rds.aliyuncs.com
DNS.2 = pgm-bpyyyyy.pg.rds.aliyuncs.com
次に、CSR とサーバー証明書を生成します。
# 3. 更新された設定を使用して CSR とサーバーの秘密鍵を作成
openssl req -new -nodes -text -out server.csr -keyout server.key -config /tmp/openssl.cnf
# 4. SAN 拡張を含めて CA で CSR に署名
openssl x509 -req -in server.csr -text -days 365 -CA server-ca.crt -CAkey server-ca.key -CAcreateserial -out server.crt -extensions v3_req -extfile /tmp/openssl.cnf
ステップ 3 を実行すると、OpenSSL によって CSR パラメーターの入力を求められます。次の表に、各フィールドの説明を示します。
| パラメーター | 説明 | 例 |
|---|---|---|
| 国名 | 2 文字の ISO 3166 国別コード | CN |
| 都道府県名 | 都道府県 | ZheJiang |
| 市区町村名 | 市 | HangZhou |
| 組織名 | 会社名 | Alibaba |
| 部署名 | 部署名 | Aliyun |
| コモンネーム | 空白のままにします。ドメイン名は openssl.cnf |
— |
| メールアドレス | 空白のままにします | — |
| チャレンジパスワード | 空白のままにします | — |
| 任意の会社名 | 空白のままにします | — |
出力の確認
コマンドが完了したら、ls を実行して、必要なすべてのファイルが存在することを確認します。
server-ca.crt server-ca.key ca.srl server.crt server.csr server.key
次の表に、各ファイルとその SSL における役割を示します。
| ファイル | 内容 | 目的 |
|---|---|---|
server.crt |
サーバー証明書 | サーバーを識別するためにクライアントに送信されます |
server.key |
サーバー証明書の秘密鍵 | サーバーが証明書を所有していることを証明します |
server-ca.crt |
自己署名 CA 証明書 | クライアントがサーバー証明書を検証するために使用します |
server-ca.key |
CA 証明書の秘密鍵 | サーバー証明書に署名するために使用します |
ステップ 2: カスタム証明書による SSL 暗号化の有効化
カスタム証明書を設定すると、インスタンスステータスが 実行中 から SSL 変更中 に変わり、約 3 分後に再び 実行中 に戻ります。
-
インスタンス ページに移動します。上部のナビゲーションバーで、インスタンスが存在するリージョンを選択します。インスタンス ID をクリックします。
-
左側のナビゲーションウィンドウで、[データセキュリティ] をクリックします。表示されたページで、[SSL] タブをクリックします。
-
[証明書ソースの選択] を [カスタム証明書] に設定します。[データベース証明書の設定 (データベースのなりすまし防止)] の横にある [設定] をクリックします。
-
ダイアログボックスで、ファイルの内容を対応するフィールドに貼り付けます。ヘッダーとフッターの行を含め、各ファイルの全内容をコピーします。[OK] をクリックします。証明書が複数のエンドポイントをカバーしている場合、各エンドポイントは [保護されたホスト] に個別のレコードとして表示されます。
フィールド ファイル 内容の範囲 サーバー証明書 server.crt-----BEGIN CERTIFICATE-----から-----END CERTIFICATE-----サーバー証明書の秘密鍵 server.key-----BEGIN PRIVATE KEY-----から-----END PRIVATE KEY-----

ステップ 3: SSL 経由でのインスタンスへの接続
クライアントから SSL 経由で RDS インスタンスに接続できます。詳細については、「ApsaraDB RDS for PostgreSQL インスタンスへの SSL 経由での接続」をご参照ください。
ステップ 4: (オプション) カスタム証明書の更新
この操作は RDS インスタンスの再起動をトリガーします。注意して実行してください。
[SSL] タブで、[データベース証明書の設定 (データベースのなりすまし防止)] の横にある [変更] をクリックします。ダイアログボックスで、新しいサーバー証明書とその秘密鍵を入力します。
ステップ 5: (オプション) SSL 暗号化の無効化
この操作は RDS インスタンスの再起動をトリガーします。注意して実行してください。
[SSL] タブで、[SSL の無効化] をクリックします。
よくある質問
「証明書のアドレスにインスタンスの接続文字列が含まれていません」というエラーが表示されるのはなぜですか?
証明書の CN (コモンネーム) または SAN (サブジェクト代替名) に RDS インスタンスのエンドポイントが含まれていません。ワイルドカード証明書 (例:*.example.com) はサポートされていません。
この問題を解決するには、証明書を再生成し、CN 値または SAN エントリを完全な RDS インスタンスのエンドポイント (例:pgm-xxx.pg.rds.aliyuncs.com) に設定します。エンドポイントの表示方法については、「ApsaraDB RDS for PostgreSQL インスタンスのエンドポイントとポート番号の表示と変更」をご参照ください。
秘密鍵のエラーで SSL 設定が失敗するのはなぜですか?
秘密鍵がパスワード暗号化を使用して生成されました。パスワードで暗号化された秘密鍵はサポートされていません。
この問題を解決するには、パスワード暗号化なしで秘密鍵を再生成します。ステップ 1 で示したように、openssl req コマンドで -nodes フラグを使用します。秘密鍵ファイルは -----BEGIN PRIVATE KEY----- で始まる必要があります。
証明書のアップロード時に証明書フォーマットエラーが表示されるのはなぜですか?
証明書ファイルが PEM 形式でないか、余分な内容が含まれている可能性があります。
この問題を解決するには、PEM 形式の証明書ファイルをアップロードしていることを確認してください。内容は -----BEGIN CERTIFICATE----- で始まり、-----END CERTIFICATE----- で終わる必要があり、これらの行の外に余分なテキストがあってはなりません。