跳转至

Vertica TLS 服务器认证最佳实践

概述

TLS(Transport Layer Security)服务器认证确保客户端与 Vertica 数据库之间的通信经过加密。服务器认证模式下,服务器向客户端展示由证书颁发机构(CA)签名的数字证书,客户端验证该证书以确认服务器身份。

建立 TLS 服务器加密连接需要以下两个文件:

  • server.key:服务器的私钥文件,必须妥善保管
  • server.crt:由 CA 签名的服务器证书文件

创建自签名证书

Vertica 10.0.1+(数据库内部加密密钥管理)

Vertica 10.0.1 及更高版本支持使用数据库内部的加密密钥管理功能创建证书,无需依赖外部 OpenSSL 工具。

步骤 1:创建密钥

CREATE KEY tls_key_owner
TYPE 'RSA'
LENGTH 2048;

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

openssl rsa -in server.key -check -noout

预期输出:RSA key ok

验证 2:检查证书有效期

openssl x509 -in server.crt -dates -noout

检查 notBeforenotAfter 时间,确保证书未过期且在有效期内。

验证 3:检查证书主题

openssl x509 -in server.crt -subject -noout

确认证书的 Common Name(CN)与服务器主机名匹配。

验证 4:检查证书签发者

openssl x509 -in server.crt -issuer -noout

确认证书由预期的 CA 签发。

验证 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

两个命令的 MD5 哈希值必须完全一致。

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

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

确认包含 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_usedt(true),并检查 ssl_versionssl_cipher 是否符合安全性要求。

扩展阅读