- 简单的https配置
前提:获取签名证书 https自制签名证书
注意:签名证书是公开对象,它被发送给连接到服务器的每个客户端。私钥是不公开对象,应该存储在有严格访问限制的文件(nginx的主进程可读)中。 私钥可以存储在与证书相同的文件中(只有证书需要被发送到客户端)
server {
#开启ssl监听
listen 443 ssl;
server_name www.example.com;
#证书绝对路径
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
#ssl支持协议版本,加密算法(均为默认缺省配置)
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...
}
- https配置优化
消耗:ssl配置会消耗额外的cpu资源,在nginx每个独立运行的work process进程中,cpu占用最多的操作是ssl握手
方式一:配置keepalive参数,允许tcp长连接,并在同一个tcp连接上发送多个请求
方式二:复用ssl会话参数,避免ssl频繁握手。会话存储在ssl会话高速缓存中,worker process进程间可共享,由ssl_session_cache指令配置,1m缓存包含大约4000个会话,默认缓存超时为5分钟,可以使用ssl_session_timeout指令修改
worker_processes auto;
http {
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
server {
listen 443 ssl;
server_name www.example.com;
keepalive_timeout 70;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...
-
ssl证书链 略
-
配置server同时监听http、https
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
...
}
- 监听相同ip、port的https servers
bug:nginx在建立ssl连接时,只选择default server
①客户端发起https请求 ②nginx发送默认server中配置的证书项到客户端并建立ssl连接 ③ssl连接建立后客户端才发送http头信息(包含host),nginx原本判断server处理的方式是相同ip、port前提下通过host头进行server选择,但在建立连接之前nginx没有接收到http请求头故无法判断适用的server,只能选择默认server处理客户端连接和请求
解决方式一:
一般解决办法是不同server监听不同https端口
解决方式二:
TLS Server Name Indication extension,简单讲就是在建立连接之前,客户端携带有关server name信息到服务器
server {
listen 192.168.1.1:443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
...
}
server {
listen 192.168.1.2:443 ssl;
server_name www.example.org;
ssl_certificate www.example.org.crt;
...
}
- servers共享签名证书
在servers之间共享签名证书:①可以使用通配符server_name配置方式,或者多配置几个server name(有限个) ②将证书项配置到上层http指令中
ssl_certificate common.crt;
ssl_certificate_key common.key;
server {
listen 443 ssl;
server_name www.example.com;
...
}
server {
listen 443 ssl;
server_name www.example.org;
...
}