Vertica TLS 服务器认证最佳实践¶
概述¶
TLS(Transport Layer Security)服务器认证确保客户端与 Vertica 数据库之间的通信经过加密。服务器认证模式下,服务器向客户端展示由证书颁发机构(CA)签名的数字证书,客户端验证该证书以确认服务器身份。
建立 TLS 服务器加密连接需要以下两个文件:
- server.key:服务器的私钥文件,必须妥善保管
- server.crt:由 CA 签名的服务器证书文件
创建自签名证书¶
Vertica 10.0.1+(数据库内部加密密钥管理)¶
Vertica 10.0.1 及更高版本支持使用数据库内部的加密密钥管理功能创建证书,无需依赖外部 OpenSSL 工具。
步骤 1:创建密钥¶
步骤 2:创建 CA 证书¶
CREATE CA CERTIFICATE tls_ca_cert
SUBJECT '/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/CN=MyCompany TLS CA'
VALID FOR 3650
EXTENSIONS '{
"basicConstraints" : "critical, CA:TRUE",
"keyUsage" : "critical, keyCertSign, cRLSign"
}'
KEY tls_key_owner;
步骤 3:创建服务器证书¶
CREATE CERTIFICATE tls_server_cert
SUBJECT '/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/CN=vertika.example.com'
SIGNED BY tls_ca_cert
VALID FOR 365
EXTENSIONS '{
"extendedKeyUsage" : "serverAuth",
"subjectAltName" : "DNS:vertika.example.com, DNS:*.example.com, IP:192.168.1.100"
}'
KEY tls_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=vertika.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:vertika.example.com,DNS:*.example.com,IP:192.168.1.100\nextendedKeyUsage=serverAuth")
验证密钥和证书¶
执行以下步骤验证密钥和证书的合法性。
验证 1:检查私钥完整性¶
预期输出:RSA key ok
验证 2:检查证书有效期¶
检查 notBefore 和 notAfter 时间,确保证书未过期且在有效期内。
验证 3:检查证书主题¶
确认证书的 Common Name(CN)与服务器主机名匹配。
验证 4:检查证书签发者¶
确认证书由预期的 CA 签发。
验证 5:验证证书链¶
预期输出:server.crt: OK
验证 6:验证私钥与证书是否匹配¶
openssl x509 -in server.crt -pubkey -noout | openssl md5
openssl pkey -in server.key -pubout -outform DER | openssl md5
两个命令的 MD5 哈希值必须完全一致。
验证 7:检查证书扩展字段¶
确认包含 TLS Web Server Authentication 扩展用途和正确的 subjectAltName。
配置 TLS 服务器加密¶
Vertica 11.0+(ALTER TLS CONFIGURATION)¶
-- 创建 TLS 配置
ALTER TLS CONFIGURATION server_encryption
CERTIFICATE tls_server_cert
CA CERTIFICATE tls_ca_cert;
-- 启用 TLS
ALTER TLS CONFIGURATION server_encryption ENABLE TLS;
-- 设置 TLS 最低版本
ALTER TLS CONFIGURATION server_encryption
MINIMUM VERSION TLSv1.2;
-- 设置密码套件
ALTER TLS CONFIGURATION server_encryption
CIPHER SUITES 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256';
Vertica 10.1 及更早版本(admintools / vsql 参数)¶
通过 admintools 配置 SSL 参数:
# 设置 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 设置数据库参数:
-- 设置 SSL 证书目录
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';
测试 TLS 连接¶
使用 vsql 测试 TLS 连接:
# 基本 TLS 连接
vsql -h vertika.example.com -p 5433 \
-U dbadmin \
--ssl-mode=require
# 验证服务器证书(verify-full 模式)
vsql -h vertika.example.com -p 5433 \
-U dbadmin \
--ssl-mode=verify-full \
--ssl-ca=/path/to/ca.crt
# 检查连接加密信息
vsql -h vertika.example.com -p 5433 \
-U dbadmin \
--ssl-mode=require \
-c "SELECT node_name, ssl_used, ssl_version, ssl_cipher, ssl_compression \
FROM sessions WHERE session_id = current_session();"
确认输出中 ssl_used 为 t(true),并检查 ssl_version 和 ssl_cipher 是否符合安全性要求。