Nginx SSL证书设置
一、证书获取
使用 https://ssl.ztimage.com 在线获取Let's Encrypt提供的免费证书。成功申请到证书后,下载下来的文件夹中Nginx文件夹里保存的就是本次设置需要的crt公钥和key私钥文件了,如果是从其它渠道获取的证书文件则需要准备这两个公钥和私钥文件。
二、Nginx SSL模块支持
通过命令查看nginx 编译时是否已经配置了SSL模块,命令:# nginx -V
如果出现“OpendSSL”字样则说明已经编译进了SSL模块,直接进入第三步。
如果未包含SSL模块可按以下步骤编译源码
1.下载源码
2.配置
#./configure --prefix=/usr/local
--prefix=/usr/local/nginx
--with-http_ssl_module
--with-file-aio
--with-http_realip_module
--with-http_stub_status_module
3.编译和安装
注意:如果你的nginx正在提供服务千万不要使用 make install,否则会覆盖安装
# make
//停止服务并备份
# nginx stop
# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
//使用新编译的程序
# cp /objs/nginx /usr/local/nginx/sbin/
# nginx -V
# nginx
三、配置文件修改
打开nginx的站点配置文件,在需要配置ssl证书的站点中添加以下配置信息:
listen 443 ssl;
ssl_certificate /usr/certs/cert.crt;
ssl_certificate_key /usr/certs/private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
现在站点配置看起来像这样:
其中ssl_certificate设置的是公钥文件路径,ssl_certificate_key设置的是私钥文件路径
保存修改,测试一下我们的配置是否有问题
# nginx -t
如果测试没有问题,我们重新载入配置,让其生效
# nginx -s reload
生效后通过https的方式在浏览器访问域名就可以看到我们的站点启用SSL加密。
四、访问http,自动跳转到https
方法一:使用url rewrite,将http的访问重定向至https
server {
listen 80;
server_name www.域名.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443;
server_name www.域名.com;
root /home/www;
ssl on;
ssl_certificate /usr/certs/cert.crt;
ssl_certificate_key /usr/certs/private.key;
}
方法二:使用HSTS(HTTP Strict Transport Security)
使用方法一主要有两个缺点:
1.不安全,rewrite使用的是302跳转来实现的,302跳转会暴露用户访问的站点路径和query string,易被劫持。
2.多增加一次访问,访问会显得更慢一点。
基于以上缺点HSTS诞生了,HTSP 就是添加 header 头(add_header Strict-Transport-Security max-age=15768000;includeSubDomains),告诉浏览器网站使用 HTTPS 访问,支持HSTS的浏览器就会在后面的请求中直接切换到 HTTPS。在 Chrome 中会看到浏览器自己会有个 307 Internal Redirect 的内部重定向。在一段时间内也就是max-age定义的时间,不管用户输入 www.ztimage.com 还是 http://www.ztimage.com ,都会默认将请求内部跳转到https://www.ztimage.com 。
采用HSTS协议的网站将保证浏览器始终连接到该网站的HTTPS加密版本,不需要用户手动在URL地址栏中输入加密地址。
该协议将帮助网站采用全局加密,用户看到的就是该网站的安全版本。
在nginx中配置HSTS,仅需要在https的server站点添加如下头部:
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
这样当第一次以https方式访问我的网站,nginx则会告知客户端的浏览器,以后即便地址栏输入http,也要浏览器改成https来访问我的nginx服务器。