
# 以SSL方式连接
通过psycopg2连接GaussDB数据库时，可以通过开启SSL加密客户端和服务端之间的通讯，为敏感数据传输提供一种安全保障手段。
#### 前置条件
登录GaussDB管理控制台，在"实例管理"页面，单击实例名称进入"基本信息"页面，单击"SSL"处的![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002590360890.png)，下载根证书或捆绑包，将根证书ca.pem放置在客户端。
#### 操作步骤
1. 导入psycopg2、ssl和os模块。 
   ```
   import psycopg2
   import ssl
   import os
   ```
   
   
2. 指定用户名和密码。建议在环境变量中存放用户名和密码，因为直接写到代码中有安全风险。 
   ```
   userName = os.getenv('EXAMPLE_USERNAME_ENV')
   passWord = os.getenv('EXAMPLE_PASSWORD_ENV')
   ```
   
   
3. 指定host和port。建议在环境变量中存放host和port。 
   ```
   host = os.getenv('EXAMPLE_HOST_ENV')
   port = os.getenv('EXAMPLE_PORT_ENV')
   ```
   
   
4. sslmode设置为require、verify-ca、verify-full，就会启用SSL加密，客户根据应用场景选择一种即可。具体介绍请参见[表1]。
   
   ```
   # 设置sslmode为require。
   sslmode = "require"
   # 设置sslmode为verify-ca。
   sslmode = "verify-ca"
   # 设置sslmode为verify-full。
   sslmode = "verify-full"
   ```
    表1sslmode的可选项及其描述 
   | sslmode     | 是否会启用SSL加密 | 描述                                                      |
   |:---|:---|:---|
   | disable     | 否          | 只尝试非SSL连接。                                              |
   | allow       | 可能         | 首先尝试非SSL连接，如果连接失败，再尝试SSL连接。                             |
   | prefer      | 可能         | 首先尝试SSL连接，如果连接失败，将尝试非SSL连接。                             |
   | require     | 是          | 只尝试SSL连接。如果存在CA文件，则按设置成verify-ca的方式验证。                  |
   | verify-ca   | 是          | 只尝试SSL连接，并且验证服务器是否具有由可信任的证书机构签发的证书。                     |
   | verify-full | 是          | 只尝试SSL连接，并且验证服务器是否具有由可信任的证书机构签发的证书，以及验证服务器主机名是否与证书中的一致。 |
      
   
   
5. 以SSL方式创建数据库连接。 
   - 非透明多写特性下，调用psycopg2.connect(\*\*kwargs)，用户需要指定数据库名称、服务器地址、端口号，同时配置ca.pem根证书。
     ```
     conn = psycopg2.connect(dbname="database", user=userName, password=passWord, host=host, port=port, sslmode=sslmode, sslrootcert="ca.pem")
     ```
     
   
   
   
   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
- 以SSL方式连接数据库，建议使用python解释器通过生成动态链接库（.so）文件的方式编译，可通过如下步骤确认python解释器的编译方式。
  1. 在python解释器命令行中输入import ssl，导入SSL。
  
  2. 执行ps ux查询python解释器运行的pid（假设pid为\*\*\*\*\*\*）。
  
  3. 在shell命令行中执行pmap -p \*\*\*\*\*\* \| grep ssl，查看返回结果中是否包含libssl.so的相关路径。如果有，则python解释器为动态链接方式编译。
   

- 若python解释器不是通过生成动态链接库（.so）文件的方式编译，则需要获取GaussDB-Kernel_数据库版本号_操作系统信息_64bit_Libpq_Static.tar.gz，解压后拷贝lib目录里的libpq.so.5，替换Python的lib目录里的libpq.so.5。
 
