Vertica 双向 TLS 认证最佳实践¶
概述¶
双向 TLS(Mutual TLS / mTLS)认证要求客户端和服务器都提供有效的数字证书来验证身份。建立双向 TLS 连接需要以下三个文件:
- server.key:服务器的私钥文件
- server.crt:服务器的证书文件(由 CA 签名)
- root.crt:CA 根证书文件(用于验证客户端证书)
创建自签名证书¶
Vertica 10.0.1+(数据库内部加密密钥管理)¶
Vertica 10.0.1 及更高版本支持使用数据库内部的加密密钥管理功能创建证书,无需依赖外部 OpenSSL 工具。
步骤 1:创建密钥¶
步骤 2:创建 CA 证书¶
CREATE CA CERTIFICATE ca_certificate
SUBJECT '/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/CN=MyCompany Root CA'
VALID FOR 3650
EXTENSIONS '{
"basicConstraints" : "critical, CA:TRUE",
"keyUsage" : "critical, keyCertSign, cRLSign"
}'
KEY key_owner;
步骤 3:创建服务器证书¶
CREATE CERTIFICATE server_certificate
SUBJECT '/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/CN=server.example.com'
SIGNED BY ca_certificate
VALID FOR 365
EXTENSIONS '{
"extendedKeyUsage" : "serverAuth",
"subjectAltName" : "DNS:server.example.com, DNS:*.example.com, IP:192.168.1.100"
}'
KEY key_owner;
Vertica 10.0 及更早版本(OpenSSL 命令)¶
对于 Vertica 10.0 及更早版本,需要使用 OpenSSL 命令行工具创建证书。
步骤 1:生成 CA 根证书¶
# 生成 CA 私钥
openssl genrsa -out ca.key 2048
# 生成 CA 证书
openssl req -new -x509 -days 3650 \
-key ca.key \
-out ca.crt \
-subj "/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/CN=MyCompany Root CA"
步骤 2:生成服务器证书¶
# 生成服务器私钥
openssl genrsa -out server.key 2048
# 生成证书签名请求(CSR)
openssl req -new \
-key server.key \
-out server.csr \
-subj "/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/CN=server.example.com"
# 使用 CA 签名服务器证书
openssl x509 -req -days 365 \
-in server.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-out server.crt \
-extfile <(printf "subjectAltName=DNS:server.example.com,DNS:*.example.com,IP:192.168.1.100\nextendedKeyUsage=serverAuth")
验证私钥和证书¶
执行以下步骤验证密钥和证书的合法性。
验证 1:检查私钥完整性¶
预期输出:RSA key ok
验证 2:检查证书有效期¶
验证 3:检查证书主题¶
验证 4:检查证书签发者¶
验证 5:验证证书链¶
预期输出:server.crt: OK
验证 6:验证私钥与证书是否匹配¶
openssl x509 -in server.crt -pubkey -noout | openssl md5
openssl pkey -in server.key -pubout -outform DER | openssl md5
两个命令的输出必须一致。
验证 7:检查证书扩展字段¶
配置 Vertica 的 TLS¶
Vertica 11.0+(TLS CONFIGURATION 语法)¶
-- 创建 TLS 配置
ALTER TLS CONFIGURATION server_tls
CERTIFICATE server_certificate
CA CERTIFICATE ca_certificate
ADD CA CERTIFICATE ca_certificate;
-- 启用 TLS 配置
ALTER TLS CONFIGURATION server_tls ENABLE TLS;
Vertica 10.1 及更早版本(SSL 参数)¶
通过 admintools 或设置数据库参数启用 TLS:
# 使用 admintools 配置 SSL
admintools -t set_ssl_params \
--ssl-key-file=/path/to/server.key \
--ssl-cert-file=/path/to/server.crt \
--ssl-ca-file=/path/to/ca.crt
# 重启数据库使配置生效
admintools -t restart_db -d database_name
或通过 vsql 设置:
ALTER DATABASE DEFAULT SET SSLServerCertificateDir = '/path/to/certs/';
ALTER DATABASE DEFAULT SET SSLServerCertificate = 'server.crt';
ALTER DATABASE DEFAULT SET SSLPrivateKey = 'server.key';
ALTER DATABASE DEFAULT SET SSLCA = 'ca.crt';
创建用户证书¶
Vertica 10.0.1+(数据库内部密钥管理)¶
CREATE CERTIFICATE user_cert
SUBJECT '/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/CN=dbuser'
SIGNED BY ca_certificate
VALID FOR 365
EXTENSIONS '{
"extendedKeyUsage" : "clientAuth"
}'
KEY key_owner;
导出用户证书:
-- 导出用户证书和私钥(加密导出)
EXPORT CERTIFICATE user_cert TO '/path/to/user.crt' ENCRYPTED 'password';
EXPORT KEY key_owner TO '/path/to/user.key' ENCRYPTED 'password';
Vertica <= 10.0(OpenSSL 命令)¶
# 生成用户私钥
openssl genrsa -out user.key 2048
# 生成 CSR
openssl req -new \
-key user.key \
-out user.csr \
-subj "/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/CN=dbuser"
# 使用 CA 签名用户证书
openssl x509 -req -days 365 \
-in user.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-out user.crt \
-extfile <(printf "extendedKeyUsage=clientAuth")
验证用户证书¶
# 验证用户证书是否由同一 CA 签发
openssl verify -CAfile ca.crt user.crt
# 检查证书用途
openssl x509 -in user.crt -text -noout | grep -A 2 "X509v3 Extended Key Usage"
配置双向认证模式¶
步骤 1:放置证书文件¶
将证书文件放置在所有节点的相同目录,例如 /opt/vertica/config/ssl/:
/opt/vertica/config/ssl/
├── server.key # 服务器私钥(权限 600,属主 dbadmin)
├── server.crt # 服务器证书
└── ca.crt # CA 根证书
步骤 2:创建 TLS 认证方法¶
-- 创建 TLS 认证方法
CREATE AUTHENTICATION mutual_tls METHOD tls
HOST TLS '0.0.0.0/0';
-- 设置双向认证
ALTER AUTHENTICATION mutual_tls
CERTIFICATE server_certificate
CA CERTIFICATE ca_certificate;
-- 将认证方法授权给用户
GRANT AUTHENTICATION mutual_tls TO dbuser;
步骤 3:配置 vsql 使用双向认证¶
# 使用客户端证书连接
vsql -h server.example.com -p 5433 \
-U dbuser \
--ssl-cert=/path/to/user.crt \
--ssl-key=/path/to/user.key \
--ssl-ca=/path/to/ca.crt
步骤 4:验证 mTLS 连接¶
# 测试连接时检查 TLS 版本和密码套件
vsql -h server.example.com -p 5433 \
-U dbuser \
--ssl-cert=/path/to/user.crt \
--ssl-key=/path/to/user.key \
-c "SELECT ssl_used, ssl_version, ssl_cipher FROM sessions WHERE session_id = current_session();"