跳转至

使用SSL

使用SSL

本章节重点介绍如何在应用中装载驱动并初始化。

配置服务端

如何在SeaboxSQL服务中配置SSL在其文档中有所阐述,这里不再进行说明。在通过Java访问已经开启SSL的服务端之前,首先确认能够通过ssql获得源码certdir下的一些指令。如果已经建立好SSL连接,你将获得类似下面的输出:

$ ./bin/ssql -h localhost -U seabox
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

seabox=#

配置客户端

与配置客户端SSL连接相关的参数,请参考SSL连接参数部分。

最简单的方式是使用ssl=true,将改参数传递给驱动会引发SSL证书和hostname的双项验证(与verify-full相同)。注意,这不同于对libpq采用非认证SSL连接的默认配置。

在该模式下,建立连接的时候JDBC驱动会认证服务器的身份,来防止“中间人”攻击。他通过检查服务器的证书是否为可信任的授权签发,要联机的服务器是否与证书中记载的服务器相同来进行鉴别。

如果你需要加密并期望在不能加密时连接失败,那么可以设定sslmode=require,这会确保服务端被设定为接受该主机(IP)的SSL连接,并对客户端证书进行验证。换句话说如果服务端不能接受SSL连接,或客户端的证书不能验证,则连接失败。注意,这种模式下将会接受所有的服务端证书。

如果sslmode = verify-ca,则通过检查证书链直到存储在客户端上的根证书来验证服务器。

如果sslmode = verify-full,将验证服务器主机名以确保它与存储在服务器证书中的名称匹配。

如果无法验证服务器证书,则SSL连接将失败。建议在大多数对安全性敏感的环境中使用“verify-full”。

默认的SSL套接字工厂为LibPQFactory。如果证书验证失败可以尝试sslcert =,此时LibPQFactory不会发送客户端证书。如果服务器未配置使用证书进行身份验证,则应该建立连接。

客户端证书、密钥和根证书的位置可以用sslcert,sslkey和sslrootcert进行设置。它们默认分别为/defaultdir/seaboxsql.crt,/defaultdir/seaboxsql.pk8和/defaultdir/root.crt。相应的其中在* nix系统中defaultdir为$ {user.home} /.seaboxsql /,在Windows中对应%appdata%/seaboxsql/。

从42.2.9版开始支持PKCS12。在这种存档格式中,密钥,证书和根证书都位于一个文件中,默认为/defaultdir/seaboxsql.p12

可以使用sslmode连接参数来实现对SSL连接更精确的控制。此参数与libpq sslmode参数相同,当前的SSL实现以下功能

sslmode 窃听保护 中间人保护
disable No No 不在乎安全性,也不想承担加密工作
allow Maybe No 不在乎安全性,但是如果服务器坚持要求,将承担加密的工作
prefer Maybe No 不在乎加密,但是如果服务器支持,将承担加密工作
require Yes No 希望对数据进行加密,并且承担开销,相信网络将确保始终连接到正确的服务器。
verify-ca Yes 取决于证书认证策略 希望对数据进行加密,并且承担开销,希望确保连接到所信任的服务器
verify-full Yes Yes 希望对数据进行加密,并且承担开销。 希望连接到信任的服务器,并且就是所指定的服务器

注意: 如果使用Java的默认机制(不是LibPQFactory)创建SSL连接,则需要使服务器证书对Java可用,首先是将其转换为Java可以理解的形式。

openssl x509 -in server.crt -out server.crt.der -outform der

从这里开始,最简单的操作是将此证书导入Java的系统信任库中。

keytool -keystore $ JAVA_HOME / lib / security / cacerts -alias seaboxsql -import -file server.crt.der

证书密钥库的默认密码为changeit。 seaboxsql的别名并不重要,您可以选择所需的任何名称。

如果您无权访问系统证书信任库,则可以创建自己的。

keytool -keystore mystore -alias seaboxsql -import -file server.crt.der

启动Java应用程序时,必须指定此密钥库和密码。

java -Djavax.net.ssl.trustStore=mystore -Djavax.net.ssl.trustStorePassword=mypassword com.mycompany.MyApp

如果出现问题,可以通过在命令行中添加-Djavax.net.debug=ssl获得更多调试信息。

使用没有证书验证的SSL

在某些情况下,可能无法配置Java环境以使服务器证书可用,例如在applet中。对于大规模部署,最好的方式是从由公认的证书颁发机构获得签名的证书,但这并不总是一个可选项。 JDBC驱动程序提供了一个无需进行任何验证即可建立SSL连接的选项,但在启用前请了解所涉及的风险。

非验证连接是通过驱动程序提供的自定义SSLSocketFactory类建立连接。设置连接URL参数sslfactory = com.seaboxsql.ssl.NonValidatingFactory将关闭所有SSL验证。

自定义SSLSocketFactory

SeaboxSQL™为开发人员提供了一种自定义建立SSL连接的方式。允许开发人员通过创建自己的SSLContext实例,实现自定义证书源或其他扩展。连接URL参数sslfactory允许用户指定使用哪个自定义类来创建SSLSocketFactory。 sslfactory指定的类名称必须扩展javax.net.ssl.SSLSocketFactory,并且对于驱动程序类加载器是可用的。

此类必须具有零个参数构造函数或单个参数构造函数,并且优先采用Properties参数。 提供了一个简单的com.seaboxsql.ssl.DefaultJavaSSLFactory,它使用默认的Java SSLFactory。

有关如何实际实现这个类的信息超出了本文范围。 请参考JSSE Reference Guide以及JDBC驱动程序提供的NonValidatingFactory源码。