本文介绍了如何为NGINX Plus和接受TCP连接的负载均衡的服务器组设置SSL
SSL终端意味着NGINX Plus充当与客户端连接的服务器端SSL端点:它执行对请求的解密和对响应的加密,否则后端服务器就必须这样做。该操作称为终止,因为NGINX Plus关闭了客户端连接,并通过新创建的未加密连接将客户端数据转发到上游组中的服务器。在R6和更高版本中,NGINX Plus对TCP连接和HTTP连接执行SSL终止。
首先,您将需要获取服务器证书和私钥,并将它们放在服务器上。可以从可信证书颁发机构(CA)获得证书,也可以使用SSL库(例如OpenSSL)生成证书。
要配置SSL终止,请在NGINX Plus配置中添加以下指令:
要启用SSL,请为将连接传递到上游服务器组的TCP服务器指定指令的ssl
参数listen
:
stream {server {listen 12345 ssl;proxy_pass backend;#...}
}
要添加SSL证书,请使用ssl_certificate
指令指定证书的路径(必须采用PEM格式),并在指令中指定私钥的路径ssl_certificate_key
:
server {#...ssl_certificate /etc/ssl/certs/server.crt;ssl_certificate_key /etc/ssl/certs/server.key;
}
此外,ssl_protocols
and ssl_ciphers
指令可用于限制连接并仅包括SSL / TLS的强版本和密码:
server {#...ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers HIGH:!aNULL:!MD5;
}
该ssl_ciphers
指令告诉NGINX通知SSL库它喜欢哪种密码。
实施SSL / TLS可能会严重影响服务器性能,因为SSL握手操作(客户端和服务器交换一系列消息以验证连接是否可信任)会占用大量CPU。SSL握手的默认超时为60秒,可以使用ssl_handshake_timeout
伪指令重新定义。我们不建议将此值设置得太低或太高,因为这可能导致握手失败或等待握手完成的时间较长:
server {#...ssl_handshake_timeout 10s;
}
创建适用于每个SSL / TLS连接的会话参数的缓存可以减少握手次数,从而可以显着提高性能。缓存是通过ssl_session_cache
伪指令设置的:
ssl_session_cache;
默认情况下,NGINX Plus使用built-in
会话缓存的类型,这意味着您的SSL库中内置了缓存。这不是最佳选择,因为这样的缓存只能由一个工作进程使用,并且可能导致内存碎片。设置ssl_session_cache
指令以shared
在所有工作进程之间共享缓存,这可以加快以后的连接速度,因为连接设置信息是已知的:
ssl_session_cache shared:SSL:1m;
作为参考,一个1 MB的共享缓存可以容纳大约4,000个会话。
默认情况下,NGINX Plus将缓存的会话参数保留五分钟。将的值ssl_session_timeout
增加到几个小时可以提高性能,因为重新使用缓存的会话参数可以减少耗时的握手次数。当您增加超时时,缓存需要更大,以容纳产生的更多缓存参数。对于以下示例中的4小时超时,适合使用20 MB的缓存:
ssl_session_timeout 4h;
如果超时长度增加,则需要更大的缓存来存储会话,例如20 MB:
server {#...ssl_session_cache shared:SSL:20m;ssl_session_timeout 4h;
}
这些行创建了一个20 MB的内存中高速缓存来存储会话信息,并指示NGINX Plus在添加会话参数后的4小时内重新使用高速缓存中的会话参数。
ession_Tickets
会话票证是会话缓存的替代方法。会话信息存储在客户端,因此无需服务器端缓存即可存储会话信息。当客户端恢复与后端服务器的交互时,它会显示会话票证,并且不需要重新协商。将ssl_session_tickets
指令设置为on
:
server {#...ssl_session_tickets on;
}
将会话票证用于上游组时,必须使用相同的会话密钥初始化每个上游服务器。最佳做法是经常更改会话密钥,我们建议您实施一种机制,以在所有上游服务器之间轮换共享密钥:
server {#...ssl_session_tickets on;ssl_session_ticket_key /etc/ssl/session_ticket_keys/current.key;ssl_session_ticket_key /etc/ssl/session_ticket_keys/previous.key;
}
stream {upstream stream_backend {server backend1.example.com:12345;server backend2.example.com:12345;server backend3.example.com:12345;}server {listen 12345 ssl;proxy_pass stream_backend;ssl_certificate /etc/ssl/certs/server.crt;ssl_certificate_key /etc/ssl/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;#...}
}
在此示例中,该server
块中的指令指示NGINX Plus终止并解密来自客户端的安全TCP流量,并将未加密的流量传递给stream_backend
由三台服务器组成的上游组。
伪指令的ssl
参数listen
指示NGINX Plus接受SSL连接。当客户端请求安全的TCP连接时,NGINX Plus将启动握手过程,该过程将使用ssl_certificate
指令指定的PEM格式证书,指令指定的证书私钥以及and 指令ssl_certificate_key
列出的协议和密码。ssl_protocols
ssl_ciphers
一旦建立了安全的TCP连接,NGINX Plus就会根据ssl_session_cache
指令缓存会话参数。在该示例中,会话高速缓存在所有工作进程(shared
参数)之间共享,大小为20 MB(20m
参数),并且将每个SSL会话保留4小时以供重用(ssl_session_timeout
指令)。
要了解有关NGINX Plus的更多信息,请参阅我们的商业订阅的描述。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态