如何在Nginx中配置SSL直连WebSocket

以下是在 Nginx 中配置 SSL 直连 WebSocket(WSS)的完整指南,涵盖证书配置、协议升级和性能优化,特别适配生产环境需求:


1. 核心配置模板

在 Nginx 配置文件中(如 /etc/nginx/sites-available/your-domain.conf),添加以下内容:

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    # SSL 证书配置(必须)
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;

    # WebSocket SSL 直连配置
    location /wss {
        proxy_pass https://localhost:6002;  # 指向后端 WebSocket 服务的 HTTPS 端口
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        
        # SSL 证书双向验证(可选)
        proxy_ssl_certificate /path/to/client.crt;
        proxy_ssl_certificate_key /path/to/client.key;
        proxy_ssl_trusted_certificate /path/to/ca.crt;
        proxy_ssl_verify on;
        proxy_ssl_verify_depth 2;

        # 连接优化
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
        proxy_buffer_size 128k;
    }

    # 其他 HTTPS 路由
    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
    }
}

2. 关键参数解析

参数作用必需
proxy_pass https://...代理到后端 HTTPS WebSocket 服务
proxy_http_version 1.1启用 HTTP/1.1 支持协议升级
Upgrade $http_upgrade协议升级为 WebSocket
Connection "upgrade"保持长连接
proxy_ssl_certificate客户端证书(双向验证时)
proxy_read_timeout防止空闲断开(建议 ≥86400s)

3. 后端 WebSocket 服务配置示例

Node.js + ws 库 为例,需启用 HTTPS 服务:

// server.js
const fs = require('fs');
const https = require('https');
const WebSocket = require('ws');

const server = https.createServer({
  cert: fs.readFileSync('/path/to/server.crt'),
  key: fs.readFileSync('/path/to/server.key'),
  ca: fs.readFileSync('/path/to/ca.crt')  // 可选:CA 证书
});

const wss = new WebSocket.Server({ server });

wss.on('connection', (ws) => {
  console.log('Client connected');
  ws.send('Welcome to WSS!');
});

server.listen(6002, () => {
  console.log('WSS server running on wss://localhost:6002');
});

4. 证书管理最佳实践

4.1 证书类型
  • 单向 SSL:仅客户端验证服务端(常用)
  • 双向 SSL:客户端和服务端互相验证(高安全场景)
4.2 Let’s Encrypt 自动续期
# 申请证书(如果尚未申请)
sudo certbot certonly --nginx -d your-domain.com

# 测试续期
sudo certbot renew --dry-run

5. 高级配置选项

5.1 负载均衡多个 WSS 节点
upstream wss_cluster {
    server ws1.example.com:6002;
    server ws2.example.com:6002;
    keepalive 64;  # 保持连接池
}

location /wss {
    proxy_pass https://wss_cluster;
    # ... 其他 WebSocket 参数 ...
}
5.2 安全加固
location /wss {
    # IP 白名单限制
    allow 192.168.1.0/24;
    allow 10.0.0.0/8;
    deny all;

    # 禁用缓存
    proxy_buffering off;
}

6. 测试与验证

6.1 使用 openssl 测试连接
openssl s_client -connect your-domain.com:443 -servername your-domain.com -status

检查输出是否包含:

TLSv1.3, Cipher: TLS_AES_256_GCM_SHA384
Extension: status_request
6.2 浏览器端测试
// 前端代码
const socket = new WebSocket('wss://your-domain.com/wss');
socket.onopen = () => console.log('WSS connected!');

7. 常见问题排查

问题 1:证书不信任
  • 现象:浏览器提示 NET::ERR_CERT_AUTHORITY_INVALID
  • 解决:确保证书链完整(包含中间证书)
问题 2:WebSocket 握手失败
  • 日志检查
    sudo tail -f /var/log/nginx/error.log | grep 'upgrade'
    
  • 可能原因:缺失 UpgradeConnection
问题 3:双向 SSL 验证失败
  • 调试命令
    curl -v --cert /path/to/client.crt --key /path/to/client.key https://your-domain.com/wss
    

8. 性能优化参数

# 在 http 块中添加
proxy_ssl_session_reuse on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 24h;

# 单个连接配置
location /wss {
    proxy_ssl_server_name on;
    proxy_ssl_protocols TLSv1.2 TLSv1.3;
    proxy_ssl_ciphers 'HIGH:!aNULL:!MD5';
}

9. 完整配置示例

Nginx + 双向 SSL 验证 + Laravel Echo Server

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

    location /wss {
        proxy_pass https://localhost:6002;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 双向 SSL 验证
        proxy_ssl_certificate /etc/nginx/client.crt;
        proxy_ssl_certificate_key /etc/nginx/client.key;
        proxy_ssl_trusted_certificate /etc/nginx/ca.crt;
        proxy_ssl_verify on;

        # 安全头
        add_header Strict-Transport-Security "max-age=31536000";
    }
}

通过以上配置,你的 WebSocket 服务将获得:
端到端加密(SSL 直连)
高性能长连接(支持 HTTP/2 + TLS 1.3)
企业级安全(可选双向验证)
遇到问题时,优先检查 Nginx 错误日志后端 WebSocket 服务日志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值