文章目录
一、简介
相信大家都知道 https 是更加安全的,特别是一些网站,有 https 的网站更能够让用户信任访问
接下来以我的个人网站 五岁小孩 (jxy.xj.cn) 为例子,带大家一起从 0 到 1 配置网站 https
本次配置的:
- 证书是 腾讯云免费证书、
- 服务器也是腾讯云的、
- 使用 docker 部署的 nginx
二、申请 ssl 证书
推荐使用云服务的免费 ssl 证书,一般都会有免费额度,本次使用的是腾讯云的 ssl 证书:我的证书 - SSL 证书 - 控制台 (tencent.com)
提交申请后到 【我的证书】列表,等待审核通过,一般几分钟就审核通过了
三、下载 ssl 证书
等待证书审核通过之后,就可以下载 ssl 证书到本地
四、配置 nginx
如果你的 nginx 和我一样是通过 docker 部署的,那么在配置之前要先确认下容器有没有映射 443 端口,如果不是 docker 部署,则可以忽略这一步
使用 docker 命令查看
docker ps | grep nginx
接下来就可以配置 nginx 了:
首先将刚才下载的 ssl 压缩包上传到服务器,解压到 nginx的配置目录
一般是上传在 nginx.conf 的同级目录下的 cert 目录,如下图
注意:证书一定要放在 nginx.conf 的同级目录下,以免重启配置出现问题
- 修改 nginx 的配置
修改配置文件,添加 443 代理
例子如下:
server { listen 443 ssl; # 开启 443 代理监听 server_name blog.jxy.xj.cn; # 证书绑定的域名 ssl_certificate cert/blog.jxy.xj.cn_bundle.pem; # 证书 pem 位置 ssl_certificate_key cert/blog.jxy.xj.cn.key; # 证书 key 位置 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 代理映射的服务,我这里是代理了 443 到 本地的 30891,按自己的配置 location / { proxy_pass http://127.0.0.1:30891; proxy_set_header Host $host; } }
- 重启 nginx
重启前推荐 执行nginx -t
命令检查配置文件是否有语法错误。如果没有错误,执行nginx -s reload
命令使配置生效。
我这里是使用 docker 部署,所以我直接使用 docker restart nginx 重启
如果启动后有问题无法正常访问,可以查看 nginx 的错误日志,一般是位于 /var/log/nginx/error.log 查看具体原因
五、开放 443 端口
先看自己的防火墙状态,如果是激活状态,那就需要开放 443 端口
这一步请自行百度
基本上到这里之后,直接访问就可以了:五岁小孩 (jxy.xj.cn)
六、常见问题解决
(一)、配置后,访问 https 无法连接成功
这种情况的排查思路:
确认下自己的 nginx 的状态是否正常启动,如果是 docker,则使用 docker ps| grep nginx , 一般可能是因为配置写错了,如证书的路径配错了,导致 nginx 无法正常启动,那么在查看 error.log 时就会出现错误:
cannot load certificate "/etc/nginx/cert/jxxxx": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/nginx/cert/jxxxx','r') error:2006D080:BIO routines:BIO_new_file:no such file)
此时就需要先确认配置是否正确,可以使用 nginx -t 检查
还有一种可能是,docker 部署,但是没有映射 443端口
(二) 证书配置成功,但是访问 https 还是报不安全
这种一般只有两种情况:
证书和域名没对上,比如证书绑定的A域名,但是你在 nginx 配置的是 B 域名
证书过期
可以使用curl -vvv https://域名
访问返回的证书是过期,是否配置错误
如果出现:Unable to communicate securely with peer: requested domain name does not match the server’s certificate
那就说明你的证书和域名没对上
总结
配置 ssl 证书还是很简单的:
申请证书 -> 下载证书 -> 配置nginx -> 重启 ngix