pgAdmin、psql、または JDBC を使用して、暗号化された SSL 接続経由で ApsaraDB RDS for PostgreSQL インスタンスに接続します。
前提条件
開始する前に、以下が準備されていることを確認してください:
-
RDS インスタンスで SSL 暗号化が有効になっていること。有効になっていない場合は、「クラウド証明書を設定して SSL 暗号化を有効にする」または「カスタム証明書を設定して SSL 暗号化を有効にする」をご参照ください。
-
サーバー CA 証明書ファイル。このファイルを取得するには、「ApsaraDB RDS for PostgreSQL インスタンスの SSL 暗号化を設定する」または「ApsaraDB RDS for PostgreSQL インスタンスでカスタム証明書を設定する」をご参照ください。
-
(クライアント CA 証明書を設定した場合にのみ必須)
client.crtおよびclient.keyファイル。「ApsaraDB RDS for PostgreSQL インスタンスでクライアント CA 証明書を設定する」をご参照ください。
接続メソッドの選択
| ツール | 最適な用途 |
|---|---|
| pgAdmin | GUI ベースのデータベース管理とインタラクティブなクエリ |
| psql | スクリプト、自動化、およびコマンドラインワークフロー |
| JDBC | データベースにプログラムで接続する Java アプリケーション |
SSL モードのリファレンス
3つの接続メソッドはすべて同じ SSL モード値を使用します。セキュリティ要件に基づいて選択してください:
| SSL モード | 動作 | 使用するケース |
|---|---|---|
require |
接続を暗号化しますが、サーバー証明書の検証は行いません | 証明書検証なしの基本的な暗号化 |
verify-ca |
接続を暗号化し、サーバー CA 証明書を検証します | ほとんどの本番環境での使用に推奨されます |
verify-full |
接続を暗号化し、サーバー CA 証明書を検証し、サーバー証明書の CN または DNS が接続エンドポイントと一致することを確認します | 最高のセキュリティ。中間者攻撃から保護します |
disable |
SSL 暗号化なし。インスタンスにアクセス制御リスト (ACL) が設定されていない場合にのみ利用可能です | 信頼できるネットワークでの開発またはテストのみ |
RDS インスタンスに ACL が設定されている場合、インスタンスは SSL 接続のみを受け入れます。SSL モードをrequire、verify-ca、またはverify-fullに設定してください。
pgAdmin を使用した接続
pgAdmin 4 は、PostgreSQL 公式ウェブサイトから PostgreSQL をインストールする際に含まれています。PostgreSQL をインストールせずに pgAdmin を使用するには、pgAdmin から別途ダウンロードしてください。
以下の手順では、pgAdmin 4 V6.2.0 を例として使用します。
-
pgAdmin 4 を起動します。
初回ログイン時、pgAdmin は保存されたパスワードと認証情報を保護するためのマスターパスワードの設定を求めます。
-
Servers を右クリックし、Register > Server を選択します。

-
General タブで、サーバーの名前を入力します。

-
Connection タブで、接続詳細を入力します。
パラメーター 説明 ホスト名/アドレス RDS インスタンスのエンドポイントです。 VPC 接続には内部エンドポイントを、インターネット接続にはパブリックエンドポイントを使用します。 この情報は [データベース接続] ページで確認できます。 詳細については、「ApsaraDB RDS for PostgreSQL インスタンスのエンドポイントとポート番号の表示と変更」をご参照ください。 ポート 接続に使用するポート番号です。 この情報は [データベース接続] ページで確認できます。 ユーザー名 データベースアカウントのユーザー名です。 詳細については、「データベースとアカウントの作成」をご参照ください。 パスワード データベースアカウントのパスワードです。 
-
Parameters タブで、SSL 設定を構成します。
カスタム証明書 (
server-ca.crt) またはクラウド証明書 (ApsaraDB-CA-Chain.pem) をルート証明書として使用できます。ご利用のシステム上の実際のファイルパスを使用してください。パラメーター 説明 SSL mode SSL モード。利用可能な値とそれぞれの使用ケースについては、「SSL モードのリファレンス」をご参照ください。 Client certificate client.crtへのパス。クライアント CA 証明書を設定した場合にのみ必須です。Client certificate key client.keyへのパス。クライアント CA 証明書を設定した場合にのみ必須です。Root certificate サーバー CA 証明書ファイルへのパス。SSL mode が Verify-CA または Verify-Full に設定されている場合に必須です。 -
Save をクリックします。接続が成功すると、pgAdmin パネルにデータベースツリーが展開されます。
重要postgresデータベースはデフォルトのシステムデータベースです。このデータベースに対して操作を実行しないでください。
ステップ 4: RDS インスタンスに接続する
ご利用のマシンに PostgreSQL クライアントがインストールされている必要があります。詳細については、「PostgreSQL ドキュメント」をご参照ください。
-
/var/lib/pgsqlディレクトリに、.postgresqlという名前のフォルダを作成します。mkdir /var/lib/pgsql/.postgresql -
証明書ファイルを
.postgresqlフォルダにコピーします。client.crtとclient.keyは、クライアント CA 証明書を設定した場合にのみ必須です。- カスタム証明書 (
server-ca.crt) またはクラウド証明書 (ApsaraDB-CA-Chain.pem) のいずれかを使用できます。コマンドを実行する際は、実際のファイルパスを使用してください。
cp client.crt client.key server-ca.crt /var/lib/pgsql/.postgresql/ -
.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と入力して保存し終了します。 -
環境変数を再読み込みします。
source .bash_profile -
SSL モードを設定します。
export PGSSLMODE="verify-full" -
RDS インスタンスに接続します。
プレースホルダー 説明 確認場所 <Endpoint>RDS インスタンスの SSL 保護されたエンドポイント SSL 暗号化 タブにある 保護されたホスト <Username>データベースアカウントのユーザー名 アカウント ページ <Port number>ポート番号 (デフォルト: 5432)データベース接続 ページ <Database name>接続するデータベースの名前 データベース接続 ページ psql -h <Endpoint> -U <Username> -p <Port number> -d <Database name>プレースホルダーを実際の値に置き換えてください:
postgres データベースはデフォルトのシステムデータベースです。このデータベースに対して操作を実行しないでください。
JDBC を使用した接続
ステップ 1:証明書ファイルの取得
Java アプリケーションが実行されるホストに、以下のファイルをダウンロードします:
-
server-ca.crt:サーバー CA 証明書。取得方法については、前提条件のセクションをご参照ください。 -
client.crtとclient.key:クライアント CA 証明書を設定した場合にのみ必須です。
ステップ 2:クライアント秘密鍵を PKCS8 (PK8) フォーマットに変換
JDBC はクライアント秘密鍵を PKCS8 (PK8) フォーマットで要求します。アプリケーションが実行されるホストで以下のコマンドを実行してください:
openssl pkcs8 -topk8 -inform PEM -in client.key -outform der -out client.pk8 -v1 PBE-MD5-DES
# プロンプトが表示されたら暗号化パスワードを入力します。このパスワードはコード内で使用します。
Enter Encryption Password:
Verifying - Enter Encryption Password:
このコマンドは、アプリケーションが実行される同じホストで実行してください。別のホストで実行してファイルをコピーすると、以下のエラーが発生する可能性があります:
-
org.postgresql.util.PSQLException: Could not decrypt SSL key file C:/Users/XXX/XXX/client.pk8 -
org.postgresql.util.PSQLException: SSL error: Received fatal alert: unexpected_message
ステップ 3:PostgreSQL JDBC ドライバーの依存関係を追加
以下の依存関係を pom.xml に追加します:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.10</version>
</dependency>
ステップ 4:RDS インスタンスへの接続
以下の例では、カスタム証明書 (server-ca.crt) を使用します。クラウド証明書を使用するには、server-ca.crtをApsaraDB-CA-Chain.pemに置き換えてください。
public class PgSslDemo {
public static void main(String[] args) {
// RDS インスタンスのエンドポイント
String hostname = "pgm-bp1gclw58u36s6****.pg.rds.aliyuncs.com";
// ポート番号 (デフォルト: 5432)
String port = "5432";
// データベース名
String dbname = "postgres";
String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbname + "?binaryTransfer=true";
Properties properties = new Properties();
// データベースアカウントのユーザー名
properties.setProperty("user", "test_user");
// データベースアカウントのパスワード
properties.setProperty("password", "test_pwd");
// 証明書ファイルが保存されているディレクトリ
String path = "D:\\ssl\\";
// SSL を有効にする
properties.setProperty("ssl", "true");
// サーバー CA 証明書へのパス
properties.setProperty("sslrootcert", path + "/" + "server-ca.crt");
// クライアント秘密鍵へのパス (PKCS8 フォーマット)
properties.setProperty("sslkey", path + "/" + "client.pk8");
// クライアント証明書へのパス
properties.setProperty("sslcert", path + "/" + "client.crt");
// client.key を PKCS8 フォーマットに変換する際に設定した暗号化パスワード
properties.setProperty("sslpassword", "test_ssl_pwd");
// SSL モード: require、verify-ca、または verify-full
properties.setProperty("sslmode", "verify-ca");
try {
Class.forName("org.postgresql.Driver");
Connection connection = DriverManager.getConnection(jdbcUrl, properties);
// 例: students01 テーブルからすべての行をクエリする
PreparedStatement preparedStatement = connection.prepareStatement("select * from students01");
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();
}
}
}