HTTPS 的好处就不多说了,不过随着 Chrome 和 FireFox 在地址栏添加了明显的锁标识,甚至在用户访问网页的时候会显示
这样一来,我们就不得不给自己的站点加上 SSL 证书,否则会损失不少的访问量。
免费的证书从哪里申请
收费的 SSL 证书到处都是,如果是安全性较高(例如包含资金往来、个人敏感信息)的站点,购买收费证书会比免费证书好。如果只是个人专栏、企业官网等,可以选择国内几大云服务商(华为云、阿里云、腾讯云)提供的免费证书。
这里以腾讯云为例,登录腾讯云官网后打开 SSL 控制台[1],界面如下图所示:
点击申请免费证书后按照指引操作即可获得为期一年的免费 SSL 证书。申请到证书之后点击下载,下载得到的压缩包解压后会得到几个著名服务器对应的文件夹,包括 Tomcat/IIS/Apache/Nginx。这里以 Nginx 为例,文件夹下有 2 个文件:
1_weishidong.com_bundle.cert
2_weishidong.com.key
配置证书
将这 2 个文件复制到 weishidong.com 网站所在的服务器的 /etc/ssl
目录下,接着打开站点(这里是 weishidong.com 站点)对应的 Nginx 的配置文件(我的站点对应的是 weishidong.conf),调整以下 server 配置:
server {
listen 443 ssl;
server_name weishidong.com,www.weishidong.com;
charset utf-8;
ssl_certificate /etc/ssl/1_weishidong.com_bundle.crt;
ssl_certificate_key /etc/ssl/2_weishidong.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /root/zhuanlan;
index index.html index.htm;
}
}
其中前缀为 ssl_
的配置项可以在腾讯云官网查询到,location
项是站点配置,与证书配置无关。
配置完成之后执行 nginx -s reload
即可生效。
HTTP 自动从定向到 HTTPS
当我们配置好 SSL 证书后,希望所有以 HTTP 协议访问站点的流量都自动跳转到 HTTPS 协议,可以通过 Nginx 的 rewrite 重定向功能实现。打开站点对应的 Nginx 配置文件,在刚才的 server 同级再增加一个 server 配置:
server {
listen 80;
server_name weishidong.com,www.weishidong.com;
rewrite ^ https://$http_host$request_uri? permanent;
}
配置完成后记得执行 nginx -s reload
使新配置生效。
Nginx SSL 模块开启
由于 Nginx 的安装方式或者编译选项不同,在我们配置好之后有可能会发现 HTTPS 并不生效,这时候打开 Nginx 的 errors 日志查看具体原因,例如 nginx: the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf
,这是提示我们 Nginx 并未开启 ssl 模块。
如何查看呢?
执行命令 nginx -V
即可查看 Nginx 编译时指定的参数,终端显示:
configure arguments: --prefix=/usr/local/nginx --add-module=/usr/local/nginx-module-vts
原来这里真的没有 ssl 相关模块,这就需要重新编译 Nginx(通过 rpm 等方式安装的 Nginx 并不会缺失这些基础模块,只有安装时手动编译的才有可能会缺失)。
现在需要找到 Nginx 的源码目录,在源码目录中执行:
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/usr/local/nginx-module-vts
这个命令是在原来已有模块的基础上新增 http_stub_status_module 和 http_ssl_module 模块。编译完成后执行 make
命令(记住,不要执行 make install)。接着备份现在正在运行的 nginx 可执行文件:
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
将刚才编译好的 Nginx 覆盖原来的 Nginx:
cp ./objs/nginx /usr/local/nginx/sbin/
覆盖完成后通过命令 /usr/local/nginx/sbin/nginx -V
查看覆盖结果。如果显示的内容中带有 http_stub_status_module
和 http_ssl_module
则说明重新编译成功。
执行 /usr/local/nginx/sbin/nginx -s reload
即可,一切完工。
⚠️如果不生效,就要考虑关停(
/usr/local/nginx/sbin/nginx -s reload
) Nginx 后再开启(/usr/local/nginx/sbin/nginx
)
References
[1]
SSL 控制台: https://console.cloud.tencent.com/ssl
本文始发于微信公众号(NightTeam):基于 Nginx 的 HTTPS 证书配置实践
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论