与psql和其他基于程序的libpq不同,JDBC是默认证书生效的。这意味着建立一个SSL连接JDBC的时候,通过核对服务器证书是否有可信任的权威签名,使服务器防止"里面的人"攻击的认证生效。假如你拥有的是本地的签名认证(CA)就不用继续操作了,因为Java拥有大部分通用CA的认证的副本。不过如果你正在删除了一个自我签名认证,那你需要让它对Java客户端有效以使得服务器的认证生效。
|
||
为了使服务器证书在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。
  在某些情况,可能不能配置Java环境使得服务器的证书生效,例如在一个applet中。在很大程度上,最好是获得一个官方确认的签名认证(a certificate signed by recognized certificate authority),但是有时候不这样。JDBC驱动提供一种不需要任何确认的建立SSL连接的选择,但是做出这个选择之前请搞清楚其涉及的风险。
  一个不带证书的连接是通过驱动提供的类SSLSocketFactory建立的。设置连接URL参数sslfactory=org.postgresql.ssl.NonValidatingFactory会关闭所有的可行SSL。