適用対象: Azure Database for PostgreSQL - フレキシブル サーバー
証明書のピン留めシナリオ用に、クライアント上の Java キー ストアにルート CA 証明書をインポートする
カスタム記述 Java アプリケーションは、信頼された証明機関 (CA) 証明書を含む cacerts
と呼ばれる既定のキーストアを使用します。 また、多くの場合、Java 信頼ストアとも呼ばれます。
cacerts
という名前の証明書ファイルは、java.home\lib\security というセキュリティ プロパティ ディレクトリに存在します。java.home はランタイム環境ディレクトリ (SDK 内の jre
ディレクトリ、または Java™ 2 ランタイム環境の最上位ディレクトリ) です。
PostgreSQL フレキシブル サーバーでクライアント証明書のピン留めシナリオ用にクライアント ルート CA 証明書を更新するには、次の手順に従います。
- java キーストア
cacerts
確認して、必要な証明書が既に含まれているかどうかを確認します。 次のコマンドを使用して、Java キーストア内の証明書を一覧表示できます。
keytool -list -v -keystore ..\lib\security\cacerts > outputfile.txt
必要な証明書がクライアントの Java キー ストアに存在しない場合は、出力で確認できるように、次の手順に進む必要があります。
カスタム キーストアのバックアップ コピーを作成します。
証明書をダウンロードし、参照できる場所にローカルに保存します。
必要なルート CA 証明書が含まれている結合された CA 証明書ストアを生成します。 次の例では、PostgreSQL JDBC ユーザーの DefaultJavaSSLFactory の使用を示しています。
keytool -importcert -alias PostgreSQLServerCACert -file D:\ DigiCertGlobalRootG2.crt.pem -keystore truststore -storepass password -noprompt keytool -importcert -alias PostgreSQLServerCACert2 -file "D:\ Microsoft ECC Root Certificate Authority 2017.crt.pem" -keystore truststore -storepass password -noprompt keytool -importcert -alias PostgreSQLServerCACert -file D:\ DigiCertGlobalRootCA.crt.pem -keystore truststore -storepass password -noprompt
元のキーストア ファイルを、新しく生成されたものに置き換えます。
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file"); System.setProperty("javax.net.ssl.trustStorePassword","password");
元のルート CA pem ファイルを、結合されたルート CA ファイルに置き換えて、アプリケーションやクライアントを再起動します。
PostgreSQL JDBC ドライバーを使用したクライアント証明書の構成の詳細については、こちらのドキュメントを参照してください。
注
証明書をクライアント証明書ストアにインポートするには、証明書の .crt ファイルを .pem 形式に変換する必要がある場合があります。 これらのファイル変換を行うために OpenSSL ユーティリティを使用できます。
Java キー ストアの信頼できる証明書の一覧をプログラムで取得する
既定では、信頼された証明書は、クライアントの Java インストール フォルダー内にある cacerts
という名前の特別なファイルに格納されます。
次の例では、最初に cacerts
を読み取り、 KeyStore オブジェクトに読み込みます。
private KeyStore loadKeyStore() {
String relativeCacertsPath = "/lib/security/cacerts".replace("/", File.separator);
String filename = System.getProperty("java.home") + relativeCacertsPath;
FileInputStream is = new FileInputStream(filename);
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
String password = "changeit";
keystore.load(is, password.toCharArray());
return keystore;
}
cacerts
の既定のパスワードはchangeit
ですが、実際のクライアントでは異なる必要があります。管理者は Java のインストール直後にパスワードを変更することをお勧めします。
KeyStore オブジェクトを読み込んだら、PKIXParameters クラスを使用して存在する証明書を読み取ることができます。
public void whenLoadingCacertsKeyStore_thenCertificatesArePresent() {
KeyStore keyStore = loadKeyStore();
PKIXParameters params = new PKIXParameters(keyStore);
Set<TrustAnchor> trustAnchors = params.getTrustAnchors();
List<Certificate> certificates = trustAnchors.stream()
.map(TrustAnchor::getTrustedCert)
.collect(Collectors.toList());
assertFalse(certificates.isEmpty());
}
証明書のピン留めシナリオで Azure App Services でクライアントを使用する場合にルート CA 証明書を更新する
Azure App Services の場合、Azure Database for PostgreSQL フレキシブル サーバーに接続する場合、クライアント証明書の更新に関して 2 つのシナリオが考えられます。これは、Azure App Services にデプロイされたアプリケーションで SSL を使用する方法によって異なります。
- Azure Database for PostgreSQL フレキシブル サーバーで変更が行われる前に、新しい証明書がプラットフォーム レベルで App Service に追加されます。 アプリケーションの App Service プラットフォームに含まれている SSL 証明書を使用している場合、何もする必要はありません。 詳細については、 Azure App Service ドキュメントの「Azure App Service での TLS/SSL 証明書の追加と管理」を参照してください。
- SSL 証明書ファイルへのパスをコードに明示的に含める場合は、新しい証明書をダウンロードし、それを使用するようにコードを更新する必要があります。 このシナリオの良い例は、「チュートリアル: Azure App Service のカスタム コンテナー用にサイドカー コンテナーを構成する」の説明に従って、 Azure App Service のドキュメントで App Service でカスタム コンテナーを使用する場合です。
証明書のピン留めシナリオで Azure Kubernetes Service (AKS) のクライアントを使用する場合にルート CA 証明書を更新する
Azure Kubernetes Services (AKS) でホストされているアプリケーションを使用して Azure Database for PostgreSQL に接続し、証明書をピン留めしようとしている場合は、専用のお客様のホスト環境からのアクセスに似ています。 こちらの手順を参照してください。
Windows 上の .NET (Npgsql) ユーザーのルート CA 証明書を更新し、証明書のピン留めシナリオに対応する
Windows 上の .NET (Npgsql) ユーザーが Azure Database for PostgreSQL フレキシブル サーバーに接続している場合は、 3 つの Microsoft RSA ルート証明機関 2017、DigiCert Global Root G2、Digicert Global Root CA がすべて Windows 証明書ストア、信頼されたルート証明機関に存在することを確認します。 いずれかの証明書が存在しない場合は、不足している証明書をインポートします。
証明書のピン留めシナリオ用に、他のクライアントのルート CA 証明書を更新する
他の PostgreSQL クライアント ユーザーの場合は、次の形式を使用して 2 つの CA 証明書ファイルをマージできます。
-----BEGIN CERTIFICATE-----
(Root CA1: DigiCertGlobalRootCA.crt.pem)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Root CA2: Microsoft ECC Root Certificate Authority 2017.crt.pem)
-----END CERTIFICATE-----