
# 以国密TLS方式连接
用户通过JDBC连接GaussDB服务器时，可以通过开启国密TLS加密客户端和服务器之间的通讯，为敏感数据在Internet上的传输提供高强度的安全保障手段。以国密TLS方式连接数据库有2种方式：国密TLS单向认证、国密TLS双向认证。单向认证只需客户端验证服务端身份，而双向认证则需要客户端和服务端双方互相验证身份。
#### 方式一：国密TLS单向认证
前置条件：用户已经获取服务端所需要的国密TLS证书和私钥文件，并完成服务端配置；同时已经获取客户端所需要的cacert.pem根证书，以下[步骤4]介绍如何将根证书配置在客户端。
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
关于证书生成和获取，请联系管理员。服务端配置证书的具体操作，请联系管理员。
使用国密TLS单向认证的方式连接数据库的步骤如下：
1. 导入java.sql.Connection、java.sql.DriverManager、java.util.Properties。 
   此外，用户需要根据实际的应用场景，再导入其他的接口和类，详见[JDBC接口参考](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0070.html#ZH-CN_TOPIC_0000002559105491)。
   ```
   import java.sql.Connection;
   import java.sql.DriverManager;
   import java.util.Properties;
   ```
   
   
2. 指定数据库urls（$ip、$port、database需要用户自行修改）、用户名和密码。 
   从环境变量EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV获取的用户名和密码设置为Properties对象的属性值。
   ```
   String urls = "jdbc:gaussdb://$ip:$port/database";
   String userName = System.getenv("EXAMPLE_USERNAME_ENV");
   String password = System.getenv("EXAMPLE_PASSWORD_ENV");
   Properties urlProps = new Properties();
   urlProps.setProperty("user", userName);
   urlProps.setProperty("password", password);
   ```
   
   
3. 设置SSL属性为true，设置sslmode为verify-ca。 
   ```
   urlProps.setProperty("ssl", "true");
   urlProps.setProperty("sslmode", "verify-ca");
   ```
   
   
4. 在客户端配置cacert.pem根证书，sslgmcipher仅允许配置为ECC_SM4_SM3。
   
   sslrootcert和sslgmcipher参数的具体说明，详见[sslrootcert](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-1820.html#ZH-CN_TOPIC_0000002527825774__zh-cn_topic_0000002558216641_p11319966467)和[sslgmcipher](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-1820.html#ZH-CN_TOPIC_0000002527825774__zh-cn_topic_0000002558216641_p38211946105612)。
   ```
   urlProps.setProperty("sslrootcert", "cacert.pem");
   urlProps.setProperty("sslgmcipher", "ECC_SM4_SM3");
   ```
   
   
5. 加载驱动。 
   1. 在代码运行工具（如IDE）中添加gaussdbjdbc.jar包。
   
   2. 执行以下命令加载数据库驱动程序"com.huawei.gaussdb.jdbc.Driver"。
   
   
   ```
   Class.forName("com.huawei.gaussdb.jdbc.Driver");
   ```
   
   
6. 创建数据库连接。 
   调用DriverManager.getConnection(String url, Properties info)，进行数据库连接。
   ```
   Connection conn = DriverManager.getConnection(urls,urlProps);
   ```
   
   
 
#### 方式二：国密TLS双向认证
前置条件：用户已经获取服务端所需要的国密TLS证书和私钥文件，并完成服务端配置；同时已经获取客户端所需要的client.key.pk8、client_enc.key.pk8、client.crt、client_enc.crt、cacert.pem证书与私钥文件，以下[步骤4]介绍如何将证书配置在客户端。
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
关于证书生成和获取，请联系管理员。服务端配置证书的具体操作，请联系管理员。
使用国密TLS双向认证的方式连接数据库的步骤如下：
1. 导入java.sql.Connection、java.sql.DriverManager、java.util.Properties。 
   此外，用户需要根据实际的应用场景，再导入其他的接口和类，详见[JDBC接口参考](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0070.html#ZH-CN_TOPIC_0000002559105491)。
   ```
   import java.sql.Connection;
   import java.sql.DriverManager;
   import java.util.Properties;
   ```
   
   
2. 指定数据库urls（$ip、$port、database需要用户自行修改）、用户名和密码。 
   从环境变量EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV获取的用户名和密码设置为Properties对象的属性值。
   ```
   String urls = "jdbc:gaussdb://$ip:$port/database";
   String userName = System.getenv("EXAMPLE_USERNAME_ENV");
   String password = System.getenv("EXAMPLE_PASSWORD_ENV");
   Properties urlProps = new Properties();
   urlProps.setProperty("user", userName);
   urlProps.setProperty("password", password);
   ```
   
   
3. 设置SSL属性为true，设置sslmode为verify-ca。 
   ```
   urlProps.setProperty("ssl", "true");
   urlProps.setProperty("sslmode", "verify-ca");
   ```
   
   
4. 在客户端配置client.key.pk8、client_enc.key.pk8、client.crt、client_enc.crt、cacert.pem证书。sslgmcipher参数可以配置为ECC_SM4_SM3或者ECDHE_SM4_SM3，具体的参数说明详见[sslgmcipher](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-1820.html#ZH-CN_TOPIC_0000002527825774__zh-cn_topic_0000002558216641_p38211946105612)。
   
   ```
   urlProps.setProperty("sslrootcert", "cacert.pem");
   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");
   ```
   
   
5. 加载驱动。 
   1. 在代码运行工具（如IDE）中添加gaussdbjdbc.jar包。
   
   2. 执行以下命令加载数据库驱动程序"com.huawei.gaussdb.jdbc.Driver"。
   
   
   ```
   Class.forName("com.huawei.gaussdb.jdbc.Driver");
   ```
   
   
6. 创建数据库连接。 
   调用DriverManager.getConnection(String url, Properties info)，进行数据库连接。
   ```
   Connection conn = DriverManager.getConnection(urls,urlProps);
   ```
   
   
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 使用JDBC客户端国密TLS能力，需要依赖于1.1或以上版本的BGMProvider开源软件（bgmprovider-1.X.X-jar-with-dependencies.jar）。
- 使用JDBC客户端国密TLS能力，JDK要求为8u302及以上版本。
- 由于国密系列算法本身存在原理严密、计算复杂、安全强度高的特点，因此配置国密TLS加密传输后，相比于国际TLS会有明显的性能劣化。
 
