金仓数据库(KingbaseES)配置 SSL 加密连接,核心是修改服务端的 kingbase.conf 与 sys_hba.conf 两个文件,并准备好证书。整个过程主要围绕"开启开关、指定证书、强制加密"三步展开。
服务端配置步骤
1. 准备 SSL 证书
需要准备服务器私钥(server.key)、服务器证书(server.crt)以及根证书(root.crt)。如果是测试环境,可以用 OpenSSL 生成自签名证书;生产环境建议使用权威 CA 签发的证书。
关键注意点 :私钥文件的权限必须严格限制(如 chmod 600 server.key不允许全局或组用户的任何访问 ),否则数据库出于安全考虑会拒绝启动 SSL 服务。
补充:如果生产环境如果没有权威 CA 签发的证书,可和客户沟通使用OpenSSL 生成自签名证书。
扩展:使用 openssl工具生成证书
为root CA服务器生成私钥、自签名证书
生成根证书私钥
生成2048长度的rsa加密格式的非对称加密算法密钥。
su - kingbase
openssl genrsa 2048 > rootca.key
ls -l rootca.key

使用根服务器的私钥生成自签名根证书
使用根服务器的私钥生成自签名根证书(编者注:证书是为公钥加上了数字签名)。
openssl req -new -x509 -nodes -days 3600 -key rootca.key -out rootca.crt
ls -l rootca.crt
注: 执行命令时,所有选项默认回车即可。

为KES服务器生成私钥、证书请求文件、服务器证书
为KES服务器生成私钥、证书请求文件。
openssl req -newkey rsa:2048 -nodes -keyout kesserver.key -out kesserver.csr
ls -l kesserver.*
注: 如果客户端 sslmode验证等级为verify-full,则会验证[common name】,这里填写服务器的名字或者也可以用 * 号代替表示不限制。


使用root CA的证书和根证书私钥来将KES服务器的证书请求文件,签署为KES服务器证书。
编者注: root CA的证书(自签名根证书),即带数字签名的root CA公钥。
openssl x509 -req -in kesserver.csr -days 3600 -CA rootca.crt -CAkey rootca.key -set_serial 01 -out kesserver.crt
ls -l kesserver.crt

为KES客户端生成私钥、证书请求文件、客户端证书
生成客户端证书请求文件和私钥。
openssl req -newkey rsa:2048 -nodes -keyout kingbase.key -out kingbase.csr
ls -l kingbase.*
注: 当服务器端验证clientcert=verify-full等级,则会验证[comnon name 】,这里可以填写可以使用此证书的用户名,例如数据库默认的system用户,或者也可以用*号表示不限制。


使用根证书和根证书私钥来签署客户端证书
openssl x509 -req -in kingbase.csr -days 3600 -CA rootca.crt -CAkey rootca.key -set_serial 02 -out kingbase.crt
ls -l kingbase.crt


生成PKCS8格式的客户端私钥文件
生成PKCS8格式的客户端私钥文件,("数据库对象管理工具"不支持默认格式,需转为pk8格式)。
openssl pkcs8 -topk8 -outform DER -in kingbase.key -out kingbase.pk8 -nocrypt
ls -l kingbase.pk8

2. 数据库端配置
让KES 服务端支持 SSL/TLS。
将生成的相关证书拷贝到数据库 data目录
将以下生成的相关证书拷贝到数据库 data目录,并对证书私钥重新授权(一定要600权限,否则数据库无法启动)
-
根证书 rootca.crt
-
KES服务器证书 kesserver.crt
-
KES服务器私钥 kesserver.key
cp rootca.crt sqlserver/sqlserver/
cp kesserver.crt sqlserver/sqlserver/
cp kesserver.key sqlserver/sqlserver/
chmod 600 sqlserver/sqlserver/kesserver.key
ls -l sqlserver/sqlserver/kesserver.key

数据库kingbase.conf开启SSL相关参数配置
ssl = on #开启ssl功能
ssl_ca_file = 'rootca.crt' #指定根证书
ssl_cert_file = 'kesserver.crt' #指定服务器证书
ssl_key_file = 'kesserver.key' #指定服务器私钥
#ssl_crl_file = 'server.key' #指定吊销证书,这里暂时不指定:需要重启数据库生效
数据库sys_hba.conf添加SSL访问路径
hostssl all all 0.0.0.0/0 scram-sha-256 clientcert=verify-ca 或 verify-full
注: 1. 将原有的ipv4的默认访问条目注释掉。
- clientcert 指定 ssl的验证等级。


重启数据库
sys_ctl restart
客户端连接验证
使用"ksql"以SSL方式连接到KES
复制客户端证书文件
-
在当前用户家目录创建.kingbase的隐藏文件夹。
-
将 rootca. crt、kingbase. crt、kingbase. key 拷贝/home/kingbase/.kingbase 的文件夹。
-
证书私钥重新授权**(一定要600权限,否则无法使用此密钥链接数据库)**。
mkdir .kingbase
cp rootca.crt /home/kingbase/.kingbase/
cp kingbase.crt /home/kingbase/.kingbase/
cp kingbase.key /home/kingbase/.kingbase/
ls -l .kingbase
客户端连接测试
ksql -h 127.0.0.1 -p 54321 -U system -d test

使用"数据库对象管理工具"以SSL方式连接到KES
选择客户端证书文件
选择根证书,客户端证书,客户端私钥,注意java连接数据库使用kingbase.pk8私钥文件。

连接测试
客户端工具ssl方式登录图标显示会有个小箭头,登录后也可以在数据库中通过sys_stat_ssl视图查
询到ssl连接的相关信息。


其它应用软件如何配置SSL连接
说明:程序不需要修改,改URL连接串就行。开启SSL加密会有3%左右性能损耗,其他没有什么影响
1、下载客户端证书文件到相应的服务器上。
(1)根证书rootca.crt
(2)客户端证书kingbase.crt
(3)服务器私钥kingbase.pk8
2、应用j连接串配置。
-
jdbc连接串配置
#将root.crt、kingbase.crt和kingbase.pk8 提供给应用工程师,调整URL配置
jdbc:kingbase8://vip:54321/databasename?sslmode=verify-ca&sslrootcert=/xxx/xxx/root.crt&sslcert=/xxx/xxx/kingbase.crt&sslkey=/xxx/xxx/kingbase.pk8 -
Kdbndp驱动连接串配置
SSL Mode SslMode Prefer SSL 模式:Disable/Allow/Prefer/Require/VerifyCA/VerifyFull
SSL Certificate string --- 客户端证书路径
SSL Key string --- 客户端证书私钥路径
SSL Password string --- 客户端证书私钥密码测试环境可以使用:
Server=127.0.0.1;Port=54321;Database=testdb;User Id=SYSTEM;Password=Kingbase123;
SSL Mode=Require;Trust Server Certificate=true;生产环境:
Server=kb-prod;Port=54321;Database=bizdb;User Id=produser;Password=xxx;
SSL Mode=Require;Trust Server Certificate=false;Check Certificate Revocation=false;优先 SSL,服务器不支持 SSL 则降级明文:
Server=192.168.1.100;Port=54321;Database=mydb;User Id=user1;Password=pwd1;
SSL Mode=Prefer;Trust Server Certificate=true;Host=127.0.0.1;Port=5432;Database=mydb;Username=system;Password=xxx;
SSL Mode=VerifyCA;
Root Certificate=/opt/cert/ca.crt;
SSL Certificate=/opt/cert/client.crt;
SSL Key=/opt/cert/client.key;
SSL Password=your_private_key_password