一、SSL加密概述与重要性
1.1 为什么SQL Admin需要SSL加密
SQL Admin作为数据库管理工具,处理着大量敏感的数据库连接信息和查询数据。在未加密的HTTP环境下,这些数据以明文形式传输,极易被中间人攻击(Man-in-the-Middle, MITM)截获。一旦攻击者获取了SQL Admin的登录凭证或查询内容,可能导致数据泄露、数据库被恶意操作等严重后果。
配置SSL加密后,所有SQL Admin与客户端浏览器之间的通信都将被加密保护,即使数据被截获,攻击者也无法解读其内容。
SSL/TLS加密的核心价值:
| 安全需求 | 加密前 | 加密后 |
|---|---|---|
| 数据保密性 | 明文传输,可被截获 | 密文传输,无法解读 |
| 身份认证 | 无法验证服务器身份 | SSL证书验证服务器身份 |
| 数据完整性 | 数据可被篡改 | MAC验证确保数据未被修改 |
| 合规要求 | 不满足等保要求 | 满足安全合规要求 |
1.2 SSL/TLS协议原理
SSL(Secure Sockets Layer)及其继任者TLS(Transport Layer Security)是用于在两个通信应用程序之间提供保密性和数据完整性的协议。
TLS握手过程:
客户端 服务器
| |
|---------------- ClientHello -------------------->|
| (支持的TLS版本、加密套件、随机数) |
| |
|<--------------- ServerHello ---------------------|
| (协商的TLS版本、加密套件、随机数) |
| |
|<-------------- Certificate ----------------------|
| (服务器证书,包含公钥) |
| |
|<-------------- ServerHelloDone ------------------|
| |
|---------------- ClientKeyExchange --------------->|
| (预主密钥,用公钥加密) |
| |
|<============== ChangeCipherSpec ===============|
| (双方切换到加密模式) |
| |
|---------------- Finished ------------------------>|
| (加密的握手消息摘要) |
| |
|<--------------- Finished ------------------------|
| (加密的握手消息摘要) |
| |
|<============== 安全通信开始 ====================|
1.3 证书类型选择
为SQL Admin选择合适的SSL证书类型:
| 证书类型 | 适用场景 | 价格 | 验证级别 | 浏览器信任 |
|---|---|---|---|---|
| 自签名证书 | 开发测试环境 | 免费 | 无 | 需手动信任 |
| Let’s Encrypt | 个人网站、小型企业 | 免费 | DV | 自动信任 |
| 商业DV证书 | 企业网站 | ¥500-2000/年 | DV | 自动信任 |
| 商业OV证书 | 企业应用 | ¥2000-5000/年 | OV | 自动信任 |
| 商业EV证书 | 金融、电商等高安全场景 | ¥5000+/年 | EV | 绿色地址栏 |
二、环境准备
2.1 检查系统环境
在开始配置SSL之前,确认系统环境满足要求:
# 查看CentOS版本
cat /etc/centos-release
# 查看OpenSSL版本
openssl version
# 确认OpenSSL版本 >= 1.1.1(TLS 1.3需要)
# CentOS 7: 可能需要升级OpenSSL
# CentOS Stream 8/9: 自带新版OpenSSL
# 检查端口占用情况
netstat -tlnp | grep -E '8080|8443|443|80'
ss -tlnp | grep -E '8080|8443|443|80'
# 确认防火墙规则
sudo firewall-cmd --list-all
sudo firewall-cmd --list-ports
2.2 安装必要工具
# CentOS Stream 8/9
sudo dnf install -y \
curl \
wget \
git \
certbot \
python3-certbot-nginx \
mod_ssl \
openssl
# CentOS 7
sudo yum install -y \
curl \
wget \
git \
certbot \
python3-certbot-nginx \
mod_ssl \
openssl
# 验证安装
openssl version
certbot --version
2.3 DNS配置
确保域名已正确解析到服务器:
# 安装dig工具
sudo yum install -y bind-utils
# 检查DNS解析
dig sqladmin.example.com A
nslookup sqladmin.example.com
host sqladmin.example.com
# 验证反向解析(可选,商业证书可能需要)
dig -x SERVER_IP
三、获取SSL证书
3.1 方案一:Let’s Encrypt免费证书(推荐)
Let’s Encrypt提供免费的DV证书,有效期90天,自动续期配置后可持续使用:
安装Certbot:
# 安装Snapd(CentOS 8/9)
sudo dnf install -y epel-release
sudo dnf install -y snapd
sudo systemctl enable --now snapd.socket
sudo systemctl enable --now snapd.apparmor
sudo ln -s /var/lib/snapd/snap /snap
# 安装Certbot
sudo snap install core
sudo snap install certbot
# 创建符号链接
sudo ln -s /var/lib/snapd/snap/bin/certbot /usr/bin/certbot
# 验证
certbot --version
申请证书:
# 方法1:使用Nginx插件自动配置(推荐)
sudo certbot --nginx -d sqladmin.example.com
# 方法2:手动验证(仅获取证书,手动配置)
sudo certbot certonly --nginx \
-d sqladmin.example.com \
--preferred-challenges http-01 \
--register-unsafely-without-email \
--agree-tos
# 方法3:使用Webroot方式(Nginx已有配置文件)
sudo certbot certonly --webroot \
-w /usr/share/nginx/html \
-d sqladmin.example.com \
--register-unsafely-without-email \
--agree-tos
证书文件说明:
# 查看证书文件
sudo ls -la /etc/letsencrypt/live/sqladmin.example.com/
# 证书文件详解
# fullchain.pem - 完整证书链(公钥+中间证书)
# privkey.pem - 私钥(需保密)
# cert.pem - 服务器证书
# chain.pem - 中间证书
# 查看证书信息
sudo openssl x509 -in /etc/letsencrypt/live/sqladmin.example.com/cert.pem -text -noout
# 验证证书
sudo openssl verify -CAfile /etc/letsencrypt/live/sqladmin.example.com/fullchain.pem \
/etc/letsencrypt/live/sqladmin.example.com/cert.pem
3.2 方案二:自签名证书(仅用于测试)
自签名证书适合开发测试环境,但浏览器会显示不安全警告:
生成自签名证书:
# 创建证书目录
sudo mkdir -p /etc/pki/tls/private
sudo mkdir -p /etc/pki/tls/certs
# 生成私钥和证书
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/pki/tls/private/sqladmin-selfsigned.key \
-out /etc/pki/tls/certs/sqladmin-selfsigned.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=YourOrg/OU=IT/CN=sqladmin.example.com"
# 生成强DH参数(增强安全性)
sudo openssl dhparam -out /etc/pki/tls/certs/dhparam.pem 2048
# 设置权限
sudo chmod 600 /etc/pki/tls/private/sqladmin-selfsigned.key
sudo chmod 644 /etc/pki/tls/certs/sqladmin-selfsigned.crt
# 查看证书信息
openssl x509 -in /etc/pki/tls/certs/sqladmin-selfsigned.crt -text -noout | head -30
证书信息输出示例:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1234567890
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, ST=Beijing, L=Beijing, O=YourOrg, OU=IT, CN=sqladmin.example.com
Validity
Not Before: May 11 2026
Not After : May 10 2027
Subject: C=CN, ST=Beijing, L=Beijing, O=YourOrg, OU=IT, CN=sqladmin.example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
3.3 方案三:商业证书
从证书颁发机构购买商业证书:
# 1. 生成CSR(证书签名请求)
sudo openssl req -new -newkey rsa:4096 -nodes \
-keyout /etc/pki/tls/private/sqladmin.key \
-out /etc/pki/tls/private/sqladmin.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=YourCompany/OU=IT/CN=sqladmin.example.com"
# 2. 查看CSR内容
sudo cat /etc/pki/tls/private/sqladmin.csr
# 3. 将CSR提交给证书颁发机构
# 4. 下载颁发的证书文件(通常为 .crt 或 .pem)
# 5. 下载中间证书链
# 6. 合并证书链
sudo cat your_certificate.crt intermediate_ca.crt root_ca.crt \
> /etc/pki/tls/certs/sqladmin_chain.crt
四、Nginx配置SSL
4.1 修改Nginx配置文件
# 创建SSL配置文件
sudo cat > /etc/nginx/conf.d/sqladmin-ssl.conf << 'EOF'
# HTTP重定向到HTTPS
server {
listen 80;
server_name sqladmin.example.com;
# 重定向所有HTTP请求到HTTPS
return 301 https://$server_name$request_uri;
}
# HTTPS服务器
server {
listen 443 ssl http2;
server_name sqladmin.example.com;
# SSL证书配置
ssl_certificate /etc/letsencrypt/live/sqladmin.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sqladmin.example.com/privkey.pem;
# SSL协议和加密套件配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
# OCSP Stapling配置
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# SSL会话缓存
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# HSTS配置(严格传输安全)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 安全头配置
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# CSP头(内容安全策略)
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self';" always;
# 日志配置
access_log /var/log/nginx/sqladmin-ssl-access.log;
error_log /var/log/nginx/sqladmin-ssl-error.log;
# Gzip压缩
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml application/xml+rss text/javascript application/x-javascript application/x-font-ttf application/vnd.ms-fontobject font/opentype image/svg+xml image/x-icon;
# 代理配置
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_buffering off;
proxy_request_buffering off;
}
# 健康检查端点
location /health {
proxy_pass http://127.0.0.1:8080/health;
access_log off;
}
# 静态资源优化
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
proxy_pass http://127.0.0.1:8080;
expires 7d;
add_header Cache-Control "public, immutable";
access_log off;
}
}
EOF
4.2 自签名证书配置
如果使用自签名证书,修改配置如下:
sudo cat > /etc/nginx/conf.d/sqladmin-selfsigned-ssl.conf << 'EOF'
server {
listen 443 ssl http2;
server_name sqladmin.example.com;
# 自签名证书
ssl_certificate /etc/pki/tls/certs/sqladmin-selfsigned.crt;
ssl_certificate_key /etc/pki/tls/private/sqladmin-selfsigned.key;
# DH参数
ssl_dhparam /etc/pki/tls/certs/dhparam.pem;
# SSL配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF
4.3 测试并重载配置
# 测试Nginx配置语法
sudo nginx -t
# 预期输出:
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
# 重载Nginx配置
sudo systemctl reload nginx
# 查看SSL状态
sudo systemctl status nginx
sudo ss -tlnp | grep -E ':443|:80'
# 查看SSL证书信息
echo | openssl s_client -connect sqladmin.example.com:443 -servername sqladmin.example.com 2>/dev/null | openssl x509 -noout -text | head -25
五、SQL Admin HTTPS配置
5.1 Docker部署HTTPS配置
如果SQL Admin使用Docker部署,配置HTTPS:
# 创建SSL证书目录
mkdir -p /opt/sqladmin/ssl
# 复制证书(Let's Encrypt)
cp /etc/letsencrypt/live/sqladmin.example.com/fullchain.pem /opt/sqladmin/ssl/
cp /etc/letsencrypt/live/sqladmin.example.com/privkey.pem /opt/sqladmin/ssl/
# 设置权限
chmod 600 /opt/sqladmin/ssl/*.pem
# 创建SQL Admin配置文件
cat > /opt/sqladmin/config.yaml << 'EOF'
server:
port: 8080
ssl:
enabled: true
cert: /app/ssl/fullchain.pem
key: /app/ssl/privkey.pem
min_version: TLSv1.2
cipher_suites:
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
http_redirect: true
security:
hsts:
enabled: true
max_age: 31536000
include_subdomains: true
preload: true
cors:
enabled: true
allowed_origins:
- "https://sqladmin.example.com"
allowed_methods:
- GET
- POST
- PUT
- DELETE
allowed_headers:
- Content-Type
- Authorization
database:
type: sqlserver
host: ${DB_HOST}
port: ${DB_PORT}
database: master
encrypt: true
trust_server_certificate: false
EOF
# 更新Docker Compose配置
cat > /opt/sqladmin/docker-compose.yml << 'EOF'
version: '3.8'
services:
sqladmin:
image: sqladmin:3.2
container_name: sqladmin
restart: always
ports:
- "127.0.0.1:8080:8080"
environment:
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
volumes:
- ./config.yaml:/app/config.yaml:ro
- ./ssl:/app/ssl:ro
healthcheck:
test: ["CMD", "curl", "-kf", "https://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
networks:
- sqladmin-net
networks:
sqladmin-net:
driver: bridge
EOF
# 启动服务
cd /opt/sqladmin
docker-compose down
docker-compose up -d
# 查看日志
docker-compose logs -f sqladmin
5.2 直接部署HTTPS配置
# 创建SQL Admin配置文件
cat > /opt/sqladmin/conf/ssl.yaml << 'EOF'
# SSL/TLS配置
ssl:
enabled: true
port: 8443
# 证书配置
certificate:
path: /etc/letsencrypt/live/sqladmin.example.com/fullchain.pem
key_path: /etc/letsencrypt/live/sqladmin.example.com/privkey.pem
# 协议版本
min_tls_version: "1.2"
max_tls_version: "1.3"
# 加密套件
cipher_suites:
- "ECDHE-ECDSA-AES128-GCM-SHA256"
- "ECDHE-RSA-AES128-GCM-SHA256"
- "ECDHE-ECDSA-AES256-GCM-SHA384"
- "ECDHE-RSA-AES256-GCM-SHA384"
- "ECDHE-ECDSA-CHACHA20-POLY1305"
- "ECDHE-RSA-CHACHA20-POLY1305"
# 安全设置
prefer_server_ciphers: true
session_cache_enabled: true
session_cache_size: 1024
ocsp_stapling_enabled: true
# 重定向HTTP到HTTPS
http_to_https_redirect:
enabled: true
port: 8080
redirect_code: 301
# HSTS配置
hsts:
enabled: true
max_age: 31536000
include_subdomains: true
preload: true
EOF
# 重启SQL Admin服务
sudo systemctl restart sqladmin
sudo systemctl status sqladmin
六、强制HTTPS配置
6.1 全站强制HTTPS
确保所有访问都通过HTTPS:
方法一:Nginx重定向(已在前面配置)
# 所有HTTP请求重定向到HTTPS
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
方法二:SQL Admin应用内强制:
# config.py - SQL Admin配置
class SecurityConfig:
FORCE_HTTPS = True
SECURE_PROXY_SSL_HEADER = ('X-Forwarded-Proto', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = 'Lax'
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True
方法三:HSTS预加载列表提交:
# 1. 确保HSTS头已正确配置
# max-age至少31536000(1年)
# includeSubDomains
# preload
# 2. 访问 https://hstspreload.org
# 3. 提交域名到HSTS预加载列表
# 4. 等待审核(约2周)
6.2 浏览器安全警告处理
访问自签名证书站点时浏览器的警告处理:
Chrome浏览器:
1. 点击"高级"按钮
2. 点击"继续前往 sqladmin.example.com(不安全)"
3. 证书将被缓存,短期内不会再次警告
Firefox浏览器:
1. 点击"高级"按钮
2. 点击"接受风险并继续"
永久信任自签名证书(仅限内网环境):
# Linux系统导入CA证书
sudo cp /etc/pki/tls/certs/sqladmin-selfsigned.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
# Windows系统导入(PowerShell管理员)
Import-Certificate -FilePath "C:\sqladmin-selfsigned.crt" -CertStoreLocation Cert:\LocalMachine\Root
# macOS系统导入
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /path/to/certificate.crt
七、证书自动续期
7.1 Let’s Encrypt自动续期
Let’s Encrypt证书有效期90天,配置自动续期:
# 测试自动续期(dry-run)
sudo certbot renew --dry-run
# 配置cron任务
sudo crontab -e
# 添加以下行(每天凌晨2点检查续期)
0 2 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"
续期钩子脚本:
# 创建续期钩子脚本
sudo cat > /etc/letsencrypt/renewal-hooks/deploy/reload-services.sh << 'EOF'
#!/bin/bash
echo "[$(date)] Let's Encrypt证书已续期,正在重载服务..."
# 重载Nginx
systemctl reload nginx
# 重载SQL Admin(如有必要)
systemctl reload sqladmin
# 发送通知
# mail -s "证书续期成功" admin@example.com << EOF
# SQL Admin SSL证书已成功续期
# 新到期时间: $(date -d "+90 days" '+%Y-%m-%d')
# EOF
echo "[$(date)] 服务重载完成"
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-services.sh
7.2 证书到期监控
# 创建证书到期检查脚本
cat > /opt/scripts/check-cert-expiry.sh << 'EOF'
#!/bin/bash
CERT_DIR="/etc/letsencrypt/live/sqladmin.example.com"
ALERT_DAYS=30
# 获取证书到期时间
EXPIRY_DATE=$(sudo openssl x509 -in "$CERT_DIR/cert.pem" -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
NOW_EPOCH=$(date +%s)
DAYS_UNTIL_EXPIRY=$(( ($EXPIRY_EPOCH - $NOW_EPOCH) / 86400 ))
echo "证书到期日期: $EXPIRY_DATE"
echo "距离到期还有: $DAYS_UNTIL_EXPIRY 天"
if [ $DAYS_UNTIL_EXPIRY -le $ALERT_DAYS ]; then
echo "[WARNING] 证书即将到期,请在 ${ALERT_DAYS} 天内续期!"
# 发送告警邮件
# mail -s "[ALERT] SSL证书即将到期" admin@example.com << EOF
# 域名: sqladmin.example.com
# 到期日期: $EXPIRY_DATE
# 剩余天数: $DAYS_UNTIL_EXPIRY
#
# 请立即续期证书!
# EOF
fi
if [ $DAYS_UNTIL_EXPIRY -le 7 ]; then
echo "[CRITICAL] 证书将在7天内到期,立即续期!"
sudo certbot renew --force-renewal
fi
EOF
chmod +x /opt/scripts/check-cert-expiry.sh
# 添加到cron(每天检查)
echo "0 9 * * * /opt/scripts/check-cert-expiry.sh" | sudo tee -a /etc/crontab
八、安全加固
8.1 SSL/TLS安全测试
使用SSL Labs等工具测试SSL配置安全性:
在线测试:
访问 https://www.ssllabs.com/ssltest/
输入域名: sqladmin.example.com
等待评分结果(目标: A或A+)
本地测试:
# 安装testssl.sh
git clone --depth 1 https://github.com/drwetter/testssl.sh.git
cd testssl.sh
# 全面测试
./testssl.sh --protocols --ciphers --headers --vulnerabilities \
https://sqladmin.example.com
# 快速测试
./testssl.sh -U --sneaky https://sqladmin.example.com
测试项目说明:
| 测试项目 | 说明 | 理想结果 |
|---|---|---|
| 协议版本 | TLS 1.2/1.3 | 仅TLS 1.2+ |
| 加密套件 | 避免弱加密 | 仅AEAD套件 |
| 证书有效性 | 有效期、公钥算法 | RSA 2048+ / ECDSA |
| OCSP stapling | 在线证书状态 | 启用 |
| HSTS | 严格传输安全 | 启用,max-age>=1年 |
| BEAST攻击 | 客户端漏洞 | 不受影响 |
| POODLE攻击 | SSLv3漏洞 | 无SSLv3 |
| Heartbleed | 内存漏洞 | 不受影响 |
8.2 修复常见安全问题
问题一:禁用TLS 1.0和TLS 1.1:
# Nginx配置
ssl_protocols TLSv1.2 TLSv1.3; # 移除TLSv1和TLSv1.1
问题二:禁用RC4等弱加密:
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
问题三:启用HSTS:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
问题四:启用OCSP Stapling:
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
8.3 SQL Server端SSL配置
配置SQL Server端强制SSL连接:
-- SQL Server端SSL配置
-- 1. 查看当前加密配置
EXEC sys.sp_configure @configname = 'force encryption';
GO
-- 2. 启用强制加密(需要重启SQL Server)
EXEC sp_configure 'force encryption', 1;
RECONFIGURE;
GO
-- 3. 查看证书配置
SELECT * FROM sys.dm_exec_connections WHERE session_id = @@SPID;
-- 查看encrypt_option列
-- 4. 测试加密连接
-- 在客户端连接字符串中添加:
-- Encrypt=True; TrustServerCertificate=False;
客户端连接字符串:
# Python pyodbc连接(强制SSL)
import pyodbc
conn_str = (
"DRIVER={ODBC Driver 18 for SQL Server};"
"SERVER=sqladmin.example.com,1433;"
"DATABASE=master;"
"UID=your_username;"
"PWD=your_password;"
"Encrypt=yes;" # 强制加密
"TrustServerCertificate=no;" # 不信任自签名证书
"Connection Timeout=30;"
)
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
cursor.execute("SELECT @@VERSION")
print(cursor.fetchone())
九、性能优化
9.1 SSL会话复用
配置SSL会话缓存减少握手开销:
# Nginx配置
ssl_session_cache shared:SSL:50m; # 50MB会话缓存
ssl_session_timeout 1d; # 会话超时1天
ssl_session_tickets off; # 禁用会话票据(TLS 1.3)
# 验证会话复用
openssl s_client -connect sqladmin.example.com:443 -sess_out /tmp/sess.pem </dev/null
openssl s_client -connect sqladmin.example.com:443 -sess_in /tmp/sess.pem </dev/null
# 查看 "Reused, TLSv1.3" 或 "Reused, TLSv1.2"
9.2 OCSP缓存
配置OCSP Stapling减少客户端验证延迟:
# 手动获取OCSP响应
openssl ocsp -header "Host" "your-ocsp-responder.com" \
-issuer /etc/letsencrypt/live/sqladmin.example.com/chain.pem \
-cert /etc/letsencrypt/live/sqladmin.example.com/cert.pem \
-CAfile /etc/letsencrypt/live/sqladmin.example.com/fullchain.pem \
-url "http://ocsp.int-x3.letsencrypt.org" \
-text
# Nginx OCSP配置
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/sqladmin.example.com/chain.pem;
9.3 HTTP/2优化
HTTP/2配合SSL可显著提升性能:
# Nginx配置(HTTP/2已包含在ssl配置中)
server {
listen 443 ssl http2; # 启用HTTP/2
# 其他优化
keepalive_timeout 65;
keepalive_requests 100;
}
十、故障排查
10.1 常见错误及解决方案
错误一:SSL证书过期
# 检查证书有效期
openssl x509 -in /etc/letsencrypt/live/sqladmin.example.com/cert.pem -noout -dates
# 立即续期
sudo certbot renew --force-renewal
# 重载Nginx
sudo systemctl reload nginx
错误二:私钥与证书不匹配
# 检查私钥和证书的公钥是否匹配
# 私钥MD5
openssl rsa -noout -modulus -in /etc/letsencrypt/live/sqladmin.example.com/privkey.pem | openssl md5
# 证书MD5
openssl x509 -noout -modulus -in /etc/letsencrypt/live/sqladmin.example.com/cert.pem | openssl md5
# 两个MD5值必须相同
错误三:证书链不完整
# 检查证书链
openssl s_client -connect sqladmin.example.com:443 -showcerts
# 查看证书链输出,确保包含所有中间证书
# 证书链应包含:服务器证书 → 中间证书 → 根证书
错误四:Nginx SSL配置错误
# 测试SSL配置
sudo nginx -t
# 查看详细错误
sudo nginx -T | grep -i ssl
# 检查SSL协议和加密套件
openssl s_client -connect sqladmin.example.com:443 -tls1_2
openssl s_client -connect sqladmin.example.com:443 -tls1_3
10.2 调试工具
使用openssl测试SSL连接:
# 测试完整握手
openssl s_client -connect sqladmin.example.com:443 -debug
# 测试TLS 1.3
openssl s_client -connect sqladmin.example.com:443 -tls1_3
# 测试特定密码套件
openssl s_client -connect sqladmin.example.com:443 -cipher 'ECDHE-RSA-AES128-GCM-SHA256'
# 查看证书详情
openssl s_client -connect sqladmin.example.com:443 2>/dev/null | \
openssl x509 -noout -text | \
grep -E "Subject:|Issuer:|Not Before|Not After|Signature Algorithm|Public Key"
使用curl测试:
# 测试HTTPS连接
curl -v https://sqladmin.example.com
# 测试证书信息
curl -Iv https://sqladmin.example.com
# 测试重定向
curl -IL https://sqladmin.example.com
# 忽略证书错误(仅测试)
curl -k https://sqladmin.example.com
十一、总结
11.1 配置要点回顾
- 证书获取:推荐使用Let’s Encrypt免费证书,生产环境使用商业证书
- 协议版本:强制使用TLS 1.2及以上,禁用TLS 1.0和TLS 1.1
- 加密套件:使用AEAD加密套件,避免RC4、3DES等弱加密
- 安全头:配置HSTS、CSP、X-Frame-Options等安全响应头
- 证书续期:配置自动续期,避免证书过期导致服务中断
- 监控告警:建立证书到期监控机制
11.2 快速配置清单
| 步骤 | 操作 | 验证方法 |
|---|---|---|
| 1 | 获取SSL证书 | openssl s_client -connect sqladmin.example.com:443 |
| 2 | 配置Nginx SSL | nginx -t |
| 3 | 启用HTTPS | curl -I https://sqladmin.example.com |
| 4 | 配置强制重定向 | 访问 http://sqladmin.example.com 应跳转HTTPS |
| 5 | 测试SSL评级 | SSL Labs评分达到A或A+ |
| 6 | 配置自动续期 | certbot renew --dry-run |
| 7 | 配置证书监控 | 检查到期时间 |
遵循以上配置指南,可以在CentOS上为SQL Admin构建安全可靠的HTTPS环境,有效保护数据传输安全。
本文基于CentOS Stream 9、Nginx和SQL Admin 3.2编写,适用于CentOS环境下的SQL Admin SSL加密配置与安全加固。