
# 以SSL方式连接
用户通过JDBC连接GaussDB服务器时，可以通过开启SSL加密客户端和服务器之间的通讯，为敏感数据在Internet上的传输提供一种安全保障手段。以SSL方式连接数据库有使用NonValidatingFactory通道、使用证书认证2种方式。其中使用证书认证的连接方式，客户端和服务端双方会互相验证身份。本小节中，连接数据库采用的是接口三：DriverManager.getConnection(String url, Properties info)。
#### 方式一：使用NonValidatingFactory通道
前置条件：用户已经获取服务端所需要的证书和私钥文件，并完成服务端配置。
![](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
关于证书生成和获取，请联系管理员。服务端配置证书的具体操作，请联系管理员。
以下以opengaussjdbc.jar为例，使用NonValidatingFactory通道的方式连接数据库的步骤如下：
1. 导入java.sql.Connection、java.sql.DriverManager、java.util.Properties。 
   此外，用户需要根据实际的应用场景，再导入其他的接口和类，详见[JDBC接口参考](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0081.html#ZH-CN_TOPIC_0000002235338741)。
   ```
   import java.sql.Connection;
   import java.sql.DriverManager;
   import java.util.Properties;
   ```
   
   
2. 指定数据库sourceURL（$ip、$port、database需要用户自行修改）、用户名和密码。 
   用户名和密码直接写到代码中有很大的安全风险，建议在环境变量中存放。
   ```
   String sourceURL = "jdbc:opengauss://$ip:$port/database";
   Properties urlProps = new Properties();
   urlProps.setProperty("user", System.getenv("EXAMPLE_USERNAME_ENV"));
   urlProps.setProperty("password", System.getenv("EXAMPLE_PASSWORD_ENV"));
   ```
   
   
3. 设置ssl属性为true，使用NonValidatingFactory通道。 
   ```
   urlProps.setProperty("ssl", "true");
   urlProps.setProperty("sslfactory","com.huawei.opengauss.jdbc.ssl.NonValidatingFactory");
   ```
   
   
4. 加载驱动。 
   1. 在代码运行工具（如IDE）中添加opengaussjdbc.jar包。
   
   2. 执行以下命令加载数据库驱动程序"com.huawei.opengauss.jdbc.Driver"。
   
   
   ```
   Class.forName("com.huawei.opengauss.jdbc.Driver");
   ```
   
   
5. 创建数据库连接。 
   调用DriverManager.getConnection(String url, Properties info)，进行数据库连接。
   ```
   Connection conn = DriverManager.getConnection(sourceURL,urlProps);
   ```
   
   
#### 方式二：使用证书认证
前置条件：用户已经获取服务端所需要的证书和私钥文件，并完成服务端配置；同时已经获取客户端所需要的client.crt客户端证书、cacert.pem根证书、client.key.pk8客户端私钥文件，以下[步骤3]介绍如何将证书和私钥文件配置在客户端。
![](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
关于证书生成和获取，请联系管理员。服务端配置证书的具体操作，请联系管理员。
以下以opengaussjdbc.jar为例，使用客户端配置证书的方式连接数据库的步骤如下：
1. 导入java.sql.Connection、java.sql.DriverManager、java.util.Properties。 
   此外，用户需要根据实际的应用场景，再导入其他的接口和类，详见[JDBC接口参考](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-0081.html#ZH-CN_TOPIC_0000002235338741)。
   ```
   import java.sql.Connection;
   import java.sql.DriverManager;
   import java.util.Properties;
   ```
   
   
2. 指定数据库sourceURL（$ip、$port、database需要用户自行修改）、用户名和密码。 
   用户名和密码直接写到代码中有很大的安全风险，建议在环境变量中存放。
   ```
   String sourceURL = "jdbc:opengauss://$ip:$port/database";
   Properties urlProps = new Properties();
   urlProps.setProperty("user", System.getenv("EXAMPLE_USERNAME_ENV"));
   urlProps.setProperty("password", System.getenv("EXAMPLE_PASSWORD_ENV"));
   ```
   
   
3. 设置ssl属性为true，在客户端配置client.crt客户端证书、cacert.pem根证书、client.key.pk8客户端私钥。
   
   ```
   urlProps.setProperty("ssl", "true");
   urlProps.setProperty("sslcert", "client.crt");
   urlProps.setProperty("sslrootcert", "cacert.pem");
   urlProps.setProperty("sslkey", "client.key.pk8");
   ```
   ![](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
   客户端私钥文件使用前，需要将client.key转化为client.key.pk8格式：
   ```
   * 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和bcprov-ext-jdk15on.jar包，版本建议：1.65以上。
   ```
   
   
4. 配置sslmode。 
   sslmode设置值：require、verify-ca、verify-full，参数介绍详见[sslmode](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-42-1509.html#ZH-CN_TOPIC_0000002235338725__zh-cn_topic_0000002235101449_p1631910611469)。客户根据应用场景选择一种即可。
   ```
   /* 设置sslmode为require */
   urlProps.setProperty("sslmode", "require");
   /* 设置sslmode为verify-ca */
   urlProps.setProperty("sslmode", "verify-ca");
   /* 设置sslmode为verify-full（Linux下验证） */
   urlProps.setProperty("sslmode", "verify-full");
   ```
   
   
5. 加载驱动。 
   1. 在代码运行工具（如IDE）中添加opengaussjdbc.jar包。
   
   2. 执行以下命令加载数据库驱动程序"com.huawei.opengauss.jdbc.Driver"。
   
   
   ```
   Class.forName("com.huawei.opengauss.jdbc.Driver");
   ```
   
   
6. 创建数据库连接。 
   调用DriverManager.getConnection(String url, Properties info)，进行数据库连接。
   ```
   Connection conn = DriverManager.getConnection(sourceURL,urlProps);
   ```
   
   
 
