このトピックでは、クラスターでSSLを有効にした後、pgAdmin、psql、およびJava Database Connectivity (JDBC) を使用してSSL経由でクラスターに接続する方法について説明します。
前提条件
クラスターに対してSSLが有効になっています。 クラスターのSSLを有効にする方法については、「クラウド証明書を使用したSSLの設定」または「カスタム証明書の設定」をご参照ください。
次のファイルが取得されます。
(オプション) クライアント証明書 (client.crt) とクライアント証明書の秘密鍵 (client.key) 。 これらのファイルは、クラスターがクライアントを認証する必要がある場合に必要です。 これらのファイルの取得方法については、「クライアントCA証明書の設定」をご参照ください。
クラスターCA証明書。 この証明書の取得方法については、「CA証明書のダウンロード」または「カスタム証明書の作成」をご参照ください。
手順
pgAdminを使用してSSL経由でクラスターに接続
pgAdminは、PostgreSQLデータベースへの接続に使用できる推奨クライアントです。 PostgreSQL公式WebサイトからPostgreSQLソフトウェアパッケージをダウンロードしてPostgreSQLをインストールすると、pgAdmin 4が自動的にダウンロードされてインストールされます。 次のセクションでは、pgAdmin 4 V6.2.0
を使用して PolarDB for PostgreSQL (Compatible with Oracle) クラスターに接続する方法について説明します。
PostgreSQLをインストールしない場合は、pgAdminを別途ダウンロードできます。
pgAdmin 4を起動します。
説明新しいバージョンのpgAdminに初めてログオンするときは、マスターパスワードを指定して、保存したパスワードやその他の資格情報を保護する必要があります。
[サーバー] を右クリックし、[登録] > [サーバー...] を選択します。
[登録-サーバー] ダイアログボックスの [全般] タブで、pgAdminがインストールされているサーバーの名前を入力します。
[接続] タブをクリックし、接続するクラスターに関する情報を入力します。 下表に、各パラメーターを説明します。
パラメーター
説明
ホスト名 /アドレス
PolarDB for PostgreSQL (Compatible with Oracle) クラスターのエンドポイントとポート番号。
内部ネットワーク経由でクラスターに接続する場合は、クラスターの内部エンドポイントと内部ポートを入力します。
インターネット経由でクラスターに接続する場合は、クラスターのパブリックエンドポイントとパブリックポートを入力します。
ポート
ユーザー名
PolarDB for PostgreSQL (Compatible with Oracle) クラスターのアカウントとパスワード。
Password
[パラメーター] タブで、SSLモードと証明書のパラメーターを設定します。 下表に、各パラメーターを説明します。
パラメーター
説明
SSLモード
PolarDB for PostgreSQL (Compatible with Oracle) クラスターはSSLを介したクライアント接続を許可します。 pgAdminからクラスターに接続するときは、特定のシナリオに基づいてSSL modeパラメーターを設定します。
クラスターにクライアントアクセス制御設定が設定されていません。
SSL経由でクラスターに接続する場合は、SSL modeパラメーターを [Require] 、[Verify-CA] 、または [Verify-Full] に設定します。
SSL経由でクラスターに接続しない場合は、SSL modeパラメーターを無効に設定します。
クライアントアクセス制御設定がクラスターに設定されています。 この場合、クライアントはSSL経由でクラスターに接続する必要があります。 SSL modeパラメーターを [Require] 、[Verify-CA] 、または [Verify-Full] に設定します。
Require: データ接続を暗号化し、クラスターを認証しません。
Verify-CA: データ接続を暗号化し、クラスターを認証します。
Verify-Full: データ接続を暗号化し、クラスターを認証し、クラスターCA証明書のCommon Name (CN) またはDomain Name System (DNS) がHost name/addressパラメーターの値と同じかどうかを確認します。
クライアント証明書
クライアント証明書のパス (client.crt) を入力します。 クラスターのクライアントCA証明書を設定した場合は、このパラメーターを設定する必要があります。 詳細については、「」「クライアントCA証明書の設定」をご参照ください。
クライアント証明書キー
クライアント証明書の秘密鍵のパス (client.key) を入力します。 クラスターのクライアントCA証明書を設定した場合は、このパラメーターを設定する必要があります。 詳細については、「」「クライアントCA証明書の設定」をご参照ください。
ルート証明書
クラスターCA証明書のパスを入力します。 SSL modeパラメーターをVerify-CAまたはVerify-Fullに設定した場合、このパラメーターを設定する必要があります。
説明クライアント証明書、クライアント証明書秘密鍵、およびクラスターCA証明書の実際のパスを入力する必要があります。
この例では、カスタム証明書が設定されています。 クラウド証明書を設定することもできます。 たとえば、
ca1.crt
をApsaraDB-CA-Chain.pem
に置き換えて、クラウド証明書を設定できます。[保存] をクリックします。 入力した情報が正しい場合は、次の図のようなページが表示され、クラスターへの接続が成功したことが示されます。
psqlを使用してSSL経由でクラスターに接続
このメソッドは、PostgreSQLクライアントに組み込まれているpsqlを使用して、SSL経由でクラスターに接続します。 PostgreSQLクライアントがコンピューターにインストールされていることを確認します。 詳細については、「PostgreSQLドキュメント」をご参照ください。
var/lib/pgsqlディレクトリに、. postgresqlという名前のフォルダを作成します。
mkdir /var/lib/pgsql/.postgresql
次のファイルをにコピーします。postgresqlフォルダ:
(オプション) クライアント証明書 (Client. crt) およびクライアント証明書秘密鍵 (client.key)
クラスターCA証明書
cp client.crt client.key ca1.crt /var/lib/pgsql/.postgresql/
クライアント証明書、クライアント証明書秘密鍵、およびクラスターCA証明書の実際のパスを入力する必要があります。
この例では、カスタム証明書が設定されています。 クラウド証明書を設定することもできます。 たとえば、ca1.crt
をApsaraDB-CA-Chain.pem
に置き換えて、クラウド証明書を設定できます。
の権限を変更します。postgresqlフォルダー。
chown postgres:postgres /var/lib/pgsql/.postgresql/* chmod 600 /var/lib/pgsql/.postgresql/*
次のコマンドを実行して、環境変数を含むファイルを開きます。
vim /var/lib/pgsql/.bash_profile
i
を入力して挿入モードに入ります。 次に、次のコンテンツをファイルに追加します。export PGSSLCERT="/var/lib/pgsql/.postgresql/client.crt" export PGSSLKEY="/var/lib/pgsql/.postgresql/client.key" export PGSSLROOTCERT="/var/lib/pgsql/.postgresql/ca1.crt"
Esc
キーを押して挿入モードを終了します。 次に、:wq
と入力してファイルを保存して閉じます。環境変数をリロードします。
ソース bash_profile
クライアントがクラスターの認証に使用する方法を指定します。
エクスポートPGSSLMODE="verify-full"
クラスターのSSLを有効にすると、クラスターはSSL経由でクライアントからの接続を許可します。 psqlからクラスターに接続するときは、ビジネス要件に基づいてPGSSLMODEパラメーターを設定します。
クライアントアクセス制御設定済み
SSL接続が必要
PGSSLMODE値
継続しない
継続する
require、verify-ca、またはverify-full
継続しない
disable
継続する
はい。 クライアントはSSL経由でクラスターに接続する必要があります。
require、verify-ca、またはverify-full
説明PGSSLMODEパラメーターの有効な値: require、verify-ca、およびverify-full
require: データ接続を暗号化しますが、クラスターは認証しません。
verify-ca: データ接続を暗号化し、クラスターを認証します。
verify-full: データ接続を暗号化し、クラスターを認証し、クラスターCA証明書のCNまたはDNSが設定されたクラスター接続アドレスと一致するかどうかを確認します。
クラスターに接続します。
psql -h <Endpoint> -U <Username> -p <Port number> -d <Database name>
JDBCを使用してSSL経由でクラスターに接続
次のファイルをコンピュータにダウンロードします。
(オプション) クライアント証明書 (Client. crt) およびクライアント証明書秘密鍵 (client.key)
クラスターCA証明書
クライアント証明書の秘密鍵 (client.key) をPK8形式に変換します。
openssl pkcs8 -topk8 -inform PEM -in client.key -outform der -out client.pk8 -v1 PBE-MD5-DES # Enter the password, which is required when the client connects to the cluster. Enter Encryption Password: Verifying - Enter Encryption Password:
client.keyファイルをPK8形式に変換するには、アプリケーションがデプロイされているホストでopensslコマンドを実行する必要があります。 それ以外の場合、次のエラーメッセージが表示されます。
org.postgresql.util.PSQLException: SSLキーファイルC:/Users/XXX/XXX/client.pk8
org.postgresql.util.PSQLException: SSLエラー: 受信した致命的なアラート: 予期しない_メッセージ
この例では、クライアントはMavenを実行します。 この場合、PostgreSQLのMaven依存関係をpom.xmlファイルにインポートします。
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.10</version> </dependency>
コードスニペットをコンパイルして、 PolarDB for PostgreSQL (Compatible with Oracle) クラスターへのJDBCベースのSSL接続を確立します。
説明この例では、カスタム証明書が設定されています。 クラウド証明書を設定することもできます。 たとえば、
ca1.crt
をApsaraDB-CA-Chain.pem
に置き換えて、クラウド証明書を設定できます。// Specify the endpoint of the PolarDB for PostgreSQL cluster. String hostname = "pe-bpxxxxx.pg.rds.aliyuncs.com"; // Specify the port number of the PolarDB for PostgreSQL cluster. String port = "5432"; // Specify the name of the database to which you want to connect. String dbname = "postgres"; String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbname+"?binaryTransfer=true"; Properties properties = new Properties(); // Specify the username that is used to access the specified database. properties.setProperty("user", "username"); // Specify the password of the username that is used to access the specified database. properties.setProperty("password", "*****"); // Specify the path in which the certificates are stored. String path= "D:\\ssl\\"; // Enable SSL. properties.setProperty("ssl", "true"); // Specify the public key of the CA. properties.setProperty("sslrootcert", path + "/" + "ca1.crt"); // Specify the private key of the client certificate. properties.setProperty("sslkey", path + "/" + "client.pk8"); // Specify the client certificate. properties.setProperty("sslcert", path + "/" + "client.crt"); // Enter the password that you specified when you converted the client.key file to the PK8 format. properties.setProperty("sslpassword", "*****"); // Specify the SSL mode. Valid values: require, verify-ca, and verify-full. properties.setProperty("sslmode", "verify-ca"); try { Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(jdbcUrl, properties); // In this example, the database named postgres contains a table named example, and data is queried from the table. PreparedStatement preparedStatement = connection.prepareStatement("select * from " + "example"); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { ResultSetMetaData rsmd = resultSet.getMetaData(); int columnCount = rsmd.getColumnCount(); Map map = new HashMap(); for (int i = 0; i < columnCount; i++) { map.put(rsmd.getColumnName(i + 1).toLowerCase(), resultSet.getObject(i + 1)); } System.out.println(map); } } catch (Exception exception) { exception.printStackTrace(); }