すべてのプロダクト
Search
ドキュメントセンター

PolarDB:SSL経由で PolarDB for PostgreSQL (Oracle互換) クラスターに接続する

最終更新日:Sep 26, 2024

このトピックでは、クラスターでSSLを有効にした後、pgAdmin、psql、およびJava Database Connectivity (JDBC) を使用してSSL経由でクラスターに接続する方法について説明します。

前提条件

手順

pgAdminを使用してSSL経由でクラスターに接続

pgAdminは、PostgreSQLデータベースへの接続に使用できる推奨クライアントです。 PostgreSQL公式WebサイトからPostgreSQLソフトウェアパッケージをダウンロードしてPostgreSQLをインストールすると、pgAdmin 4が自動的にダウンロードされてインストールされます。 次のセクションでは、pgAdmin 4 V6.2.0を使用して PolarDB for PostgreSQL (Compatible with Oracle) クラスターに接続する方法について説明します。

説明

PostgreSQLをインストールしない場合は、pgAdminを別途ダウンロードできます。

  1. pgAdmin 4を起動します。

    説明

    新しいバージョンのpgAdminに初めてログオンするときは、マスターパスワードを指定して、保存したパスワードやその他の資格情報を保護する必要があります。

  2. [サーバー] を右クリックし、[登録] > [サーバー...] を選択します。

    image.png

  3. [登録-サーバー] ダイアログボックスの [全般] タブで、pgAdminがインストールされているサーバーの名前を入力します。

    image.png

  4. [接続] タブをクリックし、接続するクラスターに関する情報を入力します。 下表に、各パラメーターを説明します。

    image.png

    パラメーター

    説明

    ホスト名 /アドレス

    PolarDB for PostgreSQL (Compatible with Oracle) クラスターのエンドポイントとポート番号。

    • 内部ネットワーク経由でクラスターに接続する場合は、クラスターの内部エンドポイントと内部ポートを入力します。

    • インターネット経由でクラスターに接続する場合は、クラスターのパブリックエンドポイントとパブリックポートを入力します。

    ポート

    ユーザー名

    PolarDB for PostgreSQL (Compatible with Oracle) クラスターのアカウントとパスワード。

    Password

  5. [パラメーター] タブで、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.crtApsaraDB-CA-Chain.pemに置き換えて、クラウド証明書を設定できます。

  6. [保存] をクリックします。 入力した情報が正しい場合は、次の図のようなページが表示され、クラスターへの接続が成功したことが示されます。

    image.png

psqlを使用してSSL経由でクラスターに接続

説明

このメソッドは、PostgreSQLクライアントに組み込まれているpsqlを使用して、SSL経由でクラスターに接続します。 PostgreSQLクライアントがコンピューターにインストールされていることを確認します。 詳細については、「PostgreSQLドキュメント」をご参照ください。

  1. var/lib/pgsqlディレクトリに、. postgresqlという名前のフォルダを作成します。

    mkdir /var/lib/pgsql/.postgresql
  2. 次のファイルをにコピーします。postgresqlフォルダ:

    • (オプション) クライアント証明書 (Client. crt) およびクライアント証明書秘密鍵 (client.key)

    • クラスターCA証明書

    cp client.crt client.key ca1.crt /var/lib/pgsql/.postgresql/
    説明

    クライアント証明書、クライアント証明書秘密鍵、およびクラスターCA証明書の実際のパスを入力する必要があります。

    この例では、カスタム証明書が設定されています。 クラウド証明書を設定することもできます。 たとえば、ca1.crtApsaraDB-CA-Chain.pemに置き換えて、クラウド証明書を設定できます。

  1. の権限を変更します。postgresqlフォルダー。

    chown postgres:postgres /var/lib/pgsql/.postgresql/*
    chmod 600 /var/lib/pgsql/.postgresql/* 
  2. 次のコマンドを実行して、環境変数を含むファイルを開きます。

    vim /var/lib/pgsql/.bash_profile
  3. 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" 
  4. Escキーを押して挿入モードを終了します。 次に、:wqと入力してファイルを保存して閉じます。

  5. 環境変数をリロードします。

    ソース bash_profile
  6. クライアントがクラスターの認証に使用する方法を指定します。

    エクスポート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が設定されたクラスター接続アドレスと一致するかどうかを確認します。

  7. クラスターに接続します。

    psql -h <Endpoint> -U <Username> -p <Port number> -d <Database name>

JDBCを使用してSSL経由でクラスターに接続

  1. 次のファイルをコンピュータにダウンロードします。

    • (オプション) クライアント証明書 (Client. crt) およびクライアント証明書秘密鍵 (client.key)

    • クラスターCA証明書

  2. クライアント証明書の秘密鍵 (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エラー: 受信した致命的なアラート: 予期しない_メッセージ

  1. この例では、クライアントはMavenを実行します。 この場合、PostgreSQLのMaven依存関係をpom.xmlファイルにインポートします。

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.10</version>
      </dependency> 
  2. コードスニペットをコンパイルして、 PolarDB for PostgreSQL (Compatible with Oracle) クラスターへのJDBCベースのSSL接続を確立します。

    説明

    この例では、カスタム証明書が設定されています。 クラウド証明書を設定することもできます。 たとえば、ca1.crtApsaraDB-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();
      }