基于 Nginx 的 HTTPS 证书配置实践

  • A+
所属分类:安全闲碎

HTTPS 的好处就不多说了,不过随着 Chrome 和 FireFox 在地址栏添加了明显的锁标识,甚至在用户访问网页的时候会显示


基于 Nginx 的 HTTPS 证书配置实践


这样一来,我们就不得不给自己的站点加上 SSL 证书,否则会损失不少的访问量。

免费的证书从哪里申请

收费的 SSL 证书到处都是,如果是安全性较高(例如包含资金往来、个人敏感信息)的站点,购买收费证书会比免费证书好。如果只是个人专栏、企业官网等,可以选择国内几大云服务商(华为云、阿里云、腾讯云)提供的免费证书。

这里以腾讯云为例,登录腾讯云官网后打开 SSL 控制台[1],界面如下图所示:


基于 Nginx 的 HTTPS 证书配置实践


点击申请免费证书后按照指引操作即可获得为期一年的免费 SSL 证书。申请到证书之后点击下载,下载得到的压缩包解压后会得到几个著名服务器对应的文件夹,包括 Tomcat/IIS/Apache/Nginx。这里以 Nginx 为例,文件夹下有 2 个文件:


1_weishidong.com_bundle.cert2_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_modulehttp_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 证书配置实践

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: