跳转至

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:创建密钥

CREATE KEY key_owner
TYPE 'RSA'
LENGTH 2048;

步骤 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:检查私钥完整性

openssl rsa -in server.key -check -noout

预期输出:RSA key ok

验证 2:检查证书有效期

openssl x509 -in server.crt -dates -noout

验证 3:检查证书主题

openssl x509 -in server.crt -subject -noout

验证 4:检查证书签发者

openssl x509 -in server.crt -issuer -noout

验证 5:验证证书链

openssl verify -CAfile ca.crt server.crt

预期输出:server.crt: OK

验证 6:验证私钥与证书是否匹配

openssl x509 -in server.crt -pubkey -noout | openssl md5
openssl pkey -in server.key -pubout -outform DER | openssl md5

两个命令的输出必须一致。

验证 7:检查证书扩展字段

openssl x509 -in server.crt -text -noout | grep -A 10 "X509v3 extensions"

配置 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();"

扩展阅读