连接数据库(以SSL方式)

用户通过JDBC连接openGauss服务器时,可以通过开启SSL加密客户端和服务器之间的通讯,为敏感数据在Internet上的传输提供了一种安全保障手段。本小节主要介绍应用程序通过JDBC如何采用SSL的方式连接openGauss。在使用本小节所描述的方法前,默认用户已经获取了服务端和客户端所需要的证书和私钥文件,关于证书等文件的获取请参考Openssl相关文档和命令。

服务端配置

当开启SSL模式后,必须提供根证书、服务器证书和私钥。

配置步骤(假设用户的证书文件放在数据目录/gaussdb/data/datanode下,且采用默认文件名):

  1. 以操作系统用户omm登录数据库主节点。

  2. 生成并配置证书。

    生成SSL证书,具体请参见证书生成。将生成出的文件server.crt,server.key,cacert.pem拷贝到服务端数据目录下。

    在Unix系统上,server.crt、server.key的权限设置必须禁止任何外部或组的访问,请执行如下命令实现这一点。

    1. chmod 0600 server.key
  3. 开启SSL认证模式。

    1. gs_guc set -D /gaussdb/data/datanode -c "ssl=on"
  4. 配置客户端接入认证参数,IP为所要连接的主机IP。

    1. gs_guc reload -D /gaussdb/data/datanode -h "hostssl all all 127.0.0.1/32 cert"
    2. gs_guc reload -D /gaussdb/data/datanode -h "hostssl all all IP/32 cert"

    表示允许127.0.0.1/32网段的客户端以ssl认证方式连接到openGauss服务器。

    连接数据库(以SSL方式) - 图1 须知:

    • 如果服务端pg_hba.conf文件中METHOD配置为cert,则只有客户端使用证书(client.crt)中所设置的用户名(common name)才能够成功连接数据库。如果设置为md5、sm3或sha256则对连接数据库的用户没有限制。
    • MD5加密算法安全性低,存在安全风险,建议使用更安全的加密算法。
  5. 配置SSL认证相关的数字证书参数。

    各命令后所附为设置成功的回显。

    1. gs_guc set -D /gaussdb/data/datanode -c "ssl_cert_file='server.crt'"
    2. gs_guc set: ssl_cert_file='server.crt'
    1. gs_guc set -D /gaussdb/data/datanode -c "ssl_key_file='server.key'"
    2. gs_guc set: ssl_key_file='server.key'
    1. gs_guc set -D /gaussdb/data/datanode -c "ssl_ca_file='cacert.pem'"
    2. gs_guc set: ssl_ca_file='cacert.pem'
  6. 重启数据库。

    1. gs_ctl restart -D /gaussdb/data/datanode

客户端配置

配置步骤如下:

上传证书文件,将在服务端配置章节生成出的文件client.key.pk8,client.crt,cacert.pem放置在客户端。

示例

注:示例1和示例2选择其一。

  1. public class SSL{
  2. public static void main(String[] args) {
  3. Properties urlProps = new Properties();
  4. String urls = "jdbc:postgresql://10.29.37.136:8000/postgres";
  5. /**
  6. * ================== 示例1 使用NonValidatingFactory通道
  7. */
  8. urlProps.setProperty("sslfactory","org.postgresql.ssl.NonValidatingFactory");
  9. urlProps.setProperty("user", "world");
  10. urlProps.setProperty("password", "test@123");
  11. urlProps.setProperty("ssl", "true");
  12. /**
  13. * ================== 示例2 使用证书
  14. */
  15. urlProps.setProperty("sslcert", "client.crt");
  16. urlProps.setProperty("sslkey", "client.key.pk8");
  17. urlProps.setProperty("sslrootcert", "cacert.pem");
  18. urlProps.setProperty("user", "world");
  19. urlProps.setProperty("ssl", "true");
  20. /* sslmode可配置为:require、verify-ca、verify-full,以下三个示例选择其一*/
  21. /* ================== 示例2.1 设置sslmode为require,使用证书 */
  22. urlProps.setProperty("sslmode", "require");
  23. /* ================== 示例2.2 设置sslmode为verify-ca,使用证书 */
  24. urlProps.setProperty("sslmode", "verify-ca");
  25. /* ================== 示例2.3 设置sslmode为verify-full,使用证书(Linux下验证) */
  26. urls = "jdbc:postgresql://world:8000/postgres";
  27. urlProps.setProperty("sslmode", "verify-full");
  28. try {
  29. Class.forName("org.postgresql.Driver").newInstance();
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }
  33. try {
  34. Connection conn;
  35. conn = DriverManager.getConnection(urls,urlProps);
  36. conn.close();
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }
  42. /**
  43. * 注:将客户端密钥转化为DER格式:
  44. * openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt
  45. * openssl pkcs8 -topk8 -inform PEM -in client.key -outform DER -out client.key.der -v1 PBE-MD5-DES
  46. * openssl pkcs8 -topk8 -inform PEM -in client.key -outform DER -out client.key.der -v1 PBE-SHA1-3DES
  47. * 以上算法由于安全级别较低,不推荐使用。
  48. * 如果客户需要采用更高级别的私钥加密算法,启用bouncycastle或者其他第三方私钥解密密码包后可以使用的私钥加密算法如下:
  49. * openssl pkcs8 -in client.key -topk8 -outform DER -out client.key.der -v2 AES128
  50. * openssl pkcs8 -in client.key -topk8 -outform DER -out client.key.der -v2 aes-256-cbc -iter 1000000
  51. * openssl pkcs8 -in client.key -topk8 -out client.key.der -outform Der -v2 aes-256-cbc -v2prf hmacWithSHA512
  52. * 启用bouncycastle:使用jdbc的项目引入依赖:bcpkix-jdk15on.jar包,版本建议:1.65以上。
  53. */