GaussDB-连接数据库(以SSL方式)

107 阅读3分钟

GaussDB-连接数据库(以SSL方式)

用户通过JDBC连接GaussDB服务器时,可以通过开启SSL加密客户端和服务器之间的通讯,为敏感数据在Internet上的传输提供了一种安全保障手段。

本节主要介绍应用程序通过JDBC如何采用SSL的方式对客户端进行配置(服务端配置请联系管理员)。

在使用本节所描述的方法前,默认用户已经获取了服务端和客户端所需要的证书和私钥文件,关于证书等文件的获取请参考Openssl相关文档和命令 。

客户端配置

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

示例

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

| ``` // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; public class SSL{ public static void main(String[] args) { Properties urlProps = new Properties(); String urls = "jdbc:gaussdb://ip:ip:port/database"; String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); /** * ================== 示例1 使用NonValidatingFactory通道 / urlProps.setProperty("sslfactory","com.huawei.gaussdb.jdbc.ssl.NonValidatingFactory"); urlProps.setProperty("user", userName); urlProps.setProperty("password", password); urlProps.setProperty("ssl", "true"); /* * ================== 示例2 使用证书 / urlProps.setProperty("sslcert", "client.crt"); urlProps.setProperty("sslkey", "client.key.pk8"); urlProps.setProperty("sslrootcert", "cacert.pem"); urlProps.setProperty("user", userName); urlProps.setProperty("password", password); urlProps.setProperty("ssl", "true"); / sslmode可配置为:require、verify-ca、verify-full,以下三个示例选择其一*/ /* ================== 示例2.1 设置sslmode为require,使用证书 / urlProps.setProperty("sslmode", "require"); / ================== 示例2.2 设置sslmode为verify-ca,使用证书 / urlProps.setProperty("sslmode", "verify-ca"); / ================== 示例2.3 设置sslmode为verify-full,使用证书(Linux下验证) / urls = "jdbc:gaussdb://world:8000/database"; urlProps.setProperty("sslmode", "verify-full"); try { Class.forName("com.huawei.gaussdb.jdbc.Driver").newInstance(); } catch (Exception e) { e.printStackTrace(); } try { Connection conn; conn = DriverManager.getConnection(urls,urlProps); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } /* * 注:将客户端密钥转化为DER格式: * openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt * openssl pkcs8 -topk8 -inform PEM -in client.key -outform DER -out client.key.der -v1 PBE-MD5-DES * openssl pkcs8 -topk8 -inform PEM -in client.key -outform DER -out client.key.der -v1 PBE-SHA1-3DES * 以上算法由于安全级别较低,不推荐使用。 * 如果客户需要采用更高级别的私钥加密算法,启用bouncycastle或者其他第三方私钥解密密码包后可以使用的私钥加密算法如下: * openssl pkcs8 -in client.key -topk8 -outform DER -out client.key.der -v2 AES128 * openssl pkcs8 -in client.key -topk8 -outform DER -out client.key.der -v2 aes-256-cbc -iter 1000000 * openssl pkcs8 -in client.key -topk8 -out client.key.der -outform Der -v2 aes-256-cbc -v2prf hmacWithSHA512 * 启用bouncycastle:使用jdbc的项目引入依赖:bcpkix-jdk15on.jar包,版本建议:1.65以上。 */

| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/51d62c1951244a5aa924daa12fa301bc~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1772174609&x-signature=frN8sta4U5n2aZhxNRH1vLglt%2BA%3D)NOTICE:

JDBC使用SSL方式建立连接时,会在客户端获取强随机数,建立连接过程中可能出现下图中的报错信息。

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/30b28e71061b410bb44e7f7009e3fa56~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1772174609&x-signature=w3vjiXQSgO2j2y%2FsTUza5nCXaRw%3D)

原因在于客户端环境随机数产生的速度太慢,无法满足产品要求,熵源不足,导致服务启动失败。当前已知在一些Linux环境中存在此问题。

建议处理方案:启动客户端环境中的haveged服务,增加系统熵池熵值以提高读取随机数的速度。启动命令为:

systemctl start haveged


更多详情请参考GaussDB 文档中心:<https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/productdesc/qlh_03_0001.html>