クライアントの設定

psqlや他のlibpqベースのプログラムと異なり、JDBCドライバはサーバ証明の検証をデフォルトで行います。 これは、SSL接続を確立する時、JDBCドライバはサーバの身元を検証し、"man in the middle"攻撃を防止することを意味します。 サーバ証明が信頼できる機関により署名されているかどうかを検査することで、これは行われます。 世界的な認証局(CA)により署名された証明書があれば、Javaには一般的なCAのほとんどの証明書のコピーが含まれていますので、何も行うことはありません。 しかし、自己署名の証明書を使用している場合、Javaクライアントがそれを使用してサーバ証明を検証できるようにしなければなりません。

注意

JDBC 3ドライバのみがSSLをサポートします。 JDK 1.4がSSLサポートが含まれる最初のバージョンです。 以前のバージョンのJDKでSSLを使用したい場合は、更にJSSEライブラリを使用しなければなりませんでした。 しかし、これはPostgreSQL™ JDBCドライバで使用できる機能をすべてサポートしていません。

サーバ証明をJavaから利用できるようにするには、まずJavaが理解できる形式に変換します。

openssl x509 -in server.crt -out server.crt.der -outform der
ここでは、Javaのシステムトラストストアに証明書をインポートする最も簡単な方法を示します。
keytool -keystore $JAVA_HOME/lib/security/cacerts -alias postgresql -import -file server.crt.der
cacertsキーストアのデフォルトパスワードはchangeitです。 postgesqlという別名は重要ではありません。他の名前を付けて構いません。

システムのcacertsトラストストアにアクセスできない場合は、独自のトラストストアを作成することができます。

keytool -keystore mystore -alias postgresql -import -file server.crt.der 
Javaアプリケーションを起動する時に、このキーストアとそのパスワードを指定しなければなりません。
java -Djavax.net.ssl.trustStore=mystore -Djavax.net.ssl.trustStorePassword=mypassword com.mycompany.MyApp
問題が発生した時に、-Djavax.net.debug=sslをコマンドラインに付けることで更なるデバッグ用の情報を利用できるようになります。

JDBCドライバに対してSSL接続の試行、確立を指示するために、接続URLパラメータにssl=trueを追加する必要があります。

証明書の検証を行わないSSLの使用

特定の状況、例えばAppletでは、サーバ証明を利用できるようにJava環境を設定できないかもしれません。 規模が大きければ、認知されている認証局による証明書を取ることが最善ですが、常に選択できるわけではありません。 JDBCには、検証を行わずにSSL接続を確立するオプションが用意されています。 しかし、このオプションを有効にする前に、これがもたらす危険性について理解してください。

検証を行わない接続は、ドライバにより提供されるカスタムSSLSocketFactoryクラスを経由して確立します。 接続URLパラメータをsslfactory=org.postgresql.ssl.NonValidatingFactoryと設定することで、すべてのSSLの検証が無効になります。