nginx 配置 SSL 证书实现 https 访问
Contents
配置好 nginx 服务,并且把域名解析到服务器后,我们已经可以通过 http://mydomain.com
访问到页面了。但是 http 协议是明文通信,如果我们希望我们的服务器与web应用更安全的话,就应该使用 https 协议。本文就记录一下 nginx 配置 SSL 证书实现 https 协议的过程。SSL 证书采取 cloudflare 颁发的长时间证书。
域名解析:域名获取 · 解析至公网服务器
nginx 部署: DOCKER部署NGINX,PHP环境(步骤+注解)
1. SSL 证书简介与获取
1.1 SSL 证书介绍
如上文所说,http 协议是明文协议,https 协议是加密协议,这个加密过程就是通过 SSL(Secure socket layer) 证书(其中一种方式)实现的。SSL 证书分为两部分
- xxx.pem 证书文件
- xxx.key 私钥文件
两个文件将服务器与域名绑定在一起,这样就能通过 https 协议和这个域名,安全的访问服务器上的 web 应用了。
1.2 获取 SSL 证书
SSL 证书可以向 CA 机构通过付费的方式申请(证书都是有有效期的),也可以自己制作。一般企业会去购买证书,个人用户推荐使用免费的证书。
上面已经说明,SSL 证书将域名和服务器绑定。那我们就可以找相关服务商申请证书,比如阿里云、腾讯云、华为云已经经典的 Let’s Encrypt 方式。
由于我的服务器是让 cloudflare 管理的,那就正好使用 cloudflare 的长时期(15年)证书吧。
注意要使用 cloudflare 的 SSL 证书必须要开启 CDN 服务,也就是 DNS 那里的小云朵,详细也可以参考笔记:域名解析:域名获取 · 解析至公网服务器。
现在假设我们已经把域名通过 cloudflare 解析到我们的服务器,并且已经开启 CDN 小云朵了。
进入站点的管理界面,选择左侧栏的SSL/TLS —>概述,并将加密模式改为完全(严格)
点击源服务器,进入创建界面
确定包含的域名包含我们的domain.com
和所有 CNAME 的域名*.domain.com
。
点击创建即可,获得两个文本,建议保存为与域名相关的文件
- domain_com.pem
- domain_com.key
文件务必要保存好,尤其是key
私钥文件,后面是不能通过网页再次查看的。
这样我们的 SSL 证书就获取好了。
2. nginx 配置 SSL 文件
2.1 SSL 文件放置与配置文件修改
2.1.1 文件配置
nginx 配置 SSL 文件实际上是为一个域名配置 https 服务,所以归根结底是配置一个新域名-服务,所以应该配置在conf.d
文件夹。
在/etc/nginx/conf.d/
文件夹下新建SSL
文件夹,用来存放刚刚获得的domain_com.pem
, domain_com.key
。然后新建domain_com.conf
, 编辑为类似如下的内容:
server {
listen 443 ssl; # HTTPS的默认访问端口443。
server_name domain.com; # 证书绑定的域名
ssl on; # 开启 SSL
ssl_certificate /etc/nginx/cond.d/SSL/domain_com.pem; # 绝对路径
ssl_certificate_key /etc/nginx/cond.d/SSL/domain_com.key; # 绝对路径
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
#表示优先使用服务端加密套件。默认开启
ssl_prefer_server_ciphers on;
# log 文件
access_log /var/log/nginx/nginx.vhost.access.log;
error_log /var/log/nginx/nginx.vhost.error.log;
location / {
root html;
index index.html index.htm;
#其他的配置~~
}
}
TLS 没开的话把相关部分关掉即可。
2.1.2 强制 https 访问
如果希望所有通过此域名的访问都必须走 https 协议的话,可以在上面的配置语句后面跟上强制跳转的语句:
server {
listen 80;
#填写证书绑定的域名
server_name domain.com;
#将所有HTTP请求通过rewrite指令重定向到HTTPS。
rewrite ^(.*)$ https://$host$1;
location / {
index index.html index.htm;
}
}
2.2 验证配置结果
配置好后。通过systemctl restart nginx
重启 nginx 服务并加载配置文件。
然后去浏览器输入https://domain.com
看看是否能访问吧。