连接数据库(以国密TLS方式)
用户通过JDBC连接GaussDB服务器时,可以通过开启国密TLS加密客户端和服务器之间的通讯,为敏感数据在Internet上的传输提供高强度的安全保障手段。
本节主要介绍应用程序通过JDBC如何采用国密TLS的方式对客户端进行配置(服务端配置请联系管理员)。
在使用本节所描述的方法前,默认用户已经获取了服务端和客户端所需要的国密TLS全部证书和私钥文件。关于证书等文件的获取请参考Openssl相关文档和命令。
客户端配置
获取client.key.pk8、client_enc.key.pk8、client.crt、client_enc.crt、cacert.pem证书与私钥文件,并于客户端相应连接参数中配置路径。
示例
// 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)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:$port/database"; String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); urlProps.setProperty("user", userName); urlProps.setProperty("password", password); urlProps.setProperty("ssl", "true"); urlProps.setProperty("sslmode", "verify-ca"); /** * ================== 示例1 国密TLS单向认证 */ urlProps.setProperty("sslrootcert", "cacert.pem"); /* sslgmcipher仅允许配置为ECC_SM4_SM3 */ urlProps.setProperty("sslgmcipher", "ECC_SM4_SM3"); /** * ================== 示例2 国密TLS双向认证 */ urlProps.setProperty("sslrootcert", "cacert.pem"); /* sslgmcipher配置为ECC_SM4_SM3、ECDHE_SM4_SM3均可 */ urlProps.setProperty("sslgmcipher", "ECDHE_SM4_SM3"); urlProps.setProperty("sslcert", "client.crt"); urlProps.setProperty("sslkey", "client.key.pk8"); urlProps.setProperty("sslenccert", "client_enc.crt"); urlProps.setProperty("sslenckey", "client_enc.key.pk8"); // 创建数据库连接。 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(); } } }
- 将客户端密钥转化为PKCS8二进制格式需要通过Openssl命令行方式,具体命令请参考将客户端密钥转化为PKCS8二进制格式。
- 使用JDBC客户端国密TLS能力,需要依赖1.1或以上版本的BGMProvider开源软件(bgmprovider-1.X.X-jar-with-dependencies.jar)。
- 使用JDBC客户端国密TLS能力,JDK要求为8u302及以上版本。
- 由于国密系列算法本身存在原理严密、计算复杂、安全强度高的特点,因此配置国密TLS加密传输后,相比于国际TLS会有明显的性能劣化。