4.2 配置客户端

    与psql和其他基于程序的libpq不同,JDBC是默认证书生效的。这意味着建立一个SSL连接JDBC的时候,通过核对服务器证书是否有可信任的权威签名,使服务器防止"里面的人"攻击的认证生效。假如你拥有的是本地的签名认证(CA)就不用继续操作了,因为Java拥有大部分通用CA的认证的副本。不过如果你正在删除了一个自我签名认证,那你需要让它对Java客户端有效以使得服务器的认证生效。

 
Note
    只有JDBC3才支持SSL,JDK1.4是第一个绑定SSL支持的版本。先前的JDK版本可以借助额外的J2EE库使用SSL,但是它不支持PostgreSQL™ JDBC驱动利用的全部特征。

为了使服务器证书在java中有效,第一步是把它转变成java可以认识的。     openssl x509 -in server.crt -out server.crt.der -outform der

     然后要做的事情就是把它的证书引进Java系统的truststor。
    keytool -keystore $JAVA_HOME/lib/security/cacerts -alias postgresql -import -file server.crt.der

    默认的cacerts keystore密码改变了,postgresql的别名不重要,你可以根据需要随便定。如果你不能访问到系统cacert truststore,你可以创建自己的truststore。
    keytool -keystore mystore -alias postgresql -import -file server.crt.der

开始运行Java应用的时候应该指定其要用到的keystore和密码。
    java -Djavax.net.ssl.trustStore=mystore -Djavax.net.ssl.trustStorePassword =mypassword com.mycompany.MyApp

    如果有问题,可以通过在命令行中增加-D javax.net.debug=ssl显示特别的调试信息。
    为了指示JDBC驱动去尝试建立一个SSL连接,必须加上连接的URL参数ssl=true。

  4.2.1 使用不带证书的SSL

    在某些情况,可能不能配置Java环境使得服务器的证书生效,例如在一个applet中。在很大程度上,最好是获得一个官方确认的签名认证(a certificate signed by recognized certificate authority),但是有时候不这样。JDBC驱动提供一种不需要任何确认的建立SSL连接的选择,但是做出这个选择之前请搞清楚其涉及的风险。

    一个不带证书的连接是通过驱动提供的类SSLSocketFactory建立的。设置连接URL参数sslfactory=org.postgresql.ssl.NonValidatingFactory会关闭所有的可行SSL。