我感兴趣的特定功能是关于 TCP 上游的 SSL 终止。我正在评估 NGINX Open Source 和 NGINX Plus。
我们有一个应用程序通过 TLS 从客户端接受消息 (TCP)。使用 NGINX,我想在 NGINX 处终止 TLS,然后 NGINX 将解密的数据包转发给应用程序。请注意,我的应用程序不是通过 HTTP 接收消息,而是通过 TCP 接收消息(因此 HTTP(S) 相关模块对我的用例无效)。
客户端 --(TLS)--> NGINX --(解密)--> 应用程序
我已经配置了 NGINX 以实现 TCP 负载平衡,如下所示这文档(非 SSL)。为此,我必须使用以下两个模块构建源代码:
- ngx_stream_core_module
- ngx_stream_ssl_module
现在,我想在 NGINX 和客户端之间启用 SSL 相互身份验证。我看到了以下内容文档其中讨论了服务器端身份验证(客户端验证服务器的证书),但我无法找到配置相互身份验证(客户端和服务器都验证彼此的证书)的步骤。你能帮我吗?在“ngx_stream_ssl_module”中,我找不到任何提及客户端证书的选项。
以下是我的 nginx.conf 的内容:
stream {
server {
listen *:5222 ssl;
proxy_pass backend;
ssl_certificate /usr/local/nginx/certs/server.crt;
ssl_certificate_key /usr/local/nginx/certs/server.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 4h;
ssl_handshake_timeout 30s;
}
upstream backend {
server 0.0.0.0:5223;
}
}
此外,我只想在客户端具有特定身份(可能基于客户端的标识符/唯一名称)时允许(SSL 握手)。有没有办法使用 NGINX 或 NGINX Plus 来实现这一点?
如果有任何其他建议我将不胜感激。
答案1
看起来模块 ngx_stream_ssl_module 不支持这些指令ssl_客户端证书, ssl_验证客户端
stream {
server {
listen *:5222 ssl;
proxy_pass backend;
ssl_certificate /usr/local/nginx/certs/server.crt; # Can Include the Chain
ssl_certificate_key /usr/local/nginx/certs/server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Removed SSLv3
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 4h;
ssl_handshake_timeout 30s;
ssl_client_certificate /usr/local/nginx/certs/ca.chain.cert.pem;
ssl_verify_client on;
ssl_verify_depth 2;
}
upstream backend {
server 0.0.0.0:5223;
}
}
答案2
server {
listen 80;
server_name www.example.com;
...
location /upstream {
proxy_pass https://backend.example.com;
proxy_ssl_certificate /etc/nginx/client.pem;
proxy_ssl_certificate_key /etc/nginx/client.key
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_ciphers HIGH:!aNULL:!MD5;
proxy_ssl_trusted_certificate /etc/nginx/trusted_ca_cert.crt;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_ssl_session_reuse on;
}
}
如果您使用自签名证书,则应包含 CA 文件:proxy_ssl_trusted_certificate
。