Nginx · HTTPS 详解
一、HTTPS基本概述
为什么需要使用 HTTPS,因为 HTTP 不安全,当我们使用 HTTP 网站时,会遭到劫持和篡改,如果采用 HTTPS 协议,那么数据在传输过程中是加密的,所以黑客无法窃取或者篡改数据报文信息,同时也避免网站传输时信息泄露。
那么我们在实现 HTTPS 时,需要了解 SSL 协议,但我们现在使用的更多的是 TLS 加密协议。
那么 TLS 是怎么保证明文消息被加密的呢?在 OSI 七层模型中,应用层是http协议,那么在应用层协议之下,我们的表示层,是 SSL 协议所发挥作用的一层,他通过(握手、交换秘钥、告警、加密)等方式,是应用层 HTTP 协议没有感知的情况下做到了数据的安全加密
二、HTTPS证书下发流程
我们首先需要申请证书,先去登记机构进行身份登记,我是谁,我是干嘛的,我想做什么,然后登记机构再通过CSR发给 CA,CA 中心通过后会生成一堆公钥和私钥,公钥会在 CA 证书链中保存,公钥和私钥证书我们拿到后,会将其部署在WEB服务器上。
- 当浏览器访问我们的 https 站点时,他会去请求我们的证书。
- Nginx 这样的 web服务器 会将我们的公钥证书发给浏览器。
- 浏览器会去验证我们的证书是否合法有效。
- CA 机构会将过期的证书放置在CRL服务器,CRL服务的验证效率是非常差的,所以CA有推出了 OCSP 响应程序,OCSP 响应程序可以查询指定的一个证书是否过去,所以浏览器可以直接查询 OSCP 响应程序,但 OSCP 响应程序性能还不是很高。
- Nginx会有一个 OCSP 的开关,当我们开启后,Nginx会主动上 OCSP 上查询,这样大量的客户端直接从 Nginx 获取证书是否有效。
三、证书类型介绍
对比 | 域名型DV | 企业型OV | 增强型EV |
---|---|---|---|
绿色地址栏 | 小锁标记+https | 小锁标记+https | 小锁标记+企业名称+https |
一般用途 | 个人站点和应用; 简单的https加密需求 | 电子商务站点和应用; 中小型企业站点 | 大型金融平台; 大型企业和政府机构站点 |
审核内容 | 域名所有权验证 | 全面的企业身份验证; 域名所有权验证 | 最高等级的企业身份验证; 域名所有权验证 |
单次申请年限 | 10分钟-24小时 | 3-5个工作日 | 5-7个工作日 |
赔付保障金 | —— | 125-175万美金 | 150-175万美金 |
1.购买证书选择
- 单域名 SSL 证书,例如:www.xxx.com
- 多域名 SSL 证书,例如:www.xxx.com、cdn.xxx.com、img.xxx.com
- 通配符域名(泛域名)SSL 证书,例如:*.xxx.com
2.HTTPS证书注意事项
https 不支持续费,证书到期需要重新申请并进行替换。
https 不支持三级域名解析,如 test.m.haoda.com。
https 显示绿色,说明整个网站的url都是 https 的
https 显示黄色,因为网站代码中包含http 的不安全链接
https 显示红色,那么证书是假的或者证书过期。
四、配置单台机器 HTTPS 证书
1.检查 Nginx 是否有 HTTPS 模块
Nginx 需要 --with-http_ssl_module
模块才能使用 HTTPS
$ nginx -V |
2.创建存放证书目录
$ mkdir /etc/nginx/ssl_key |
3.生成证书
$ openssl genrsa -idea -out server.key 2048 |
$ openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt |
-req 用于创建新的证书
-new 创建的是新证书
-x509 定义证书的格式为标准格式
-key 调用的私钥文件信息
-out 输出证书文件信息
-days 证书的有效期
$ ll |
4.Nginx 证书配置语法
- 启动 SSL 功能
Syntax: ssl on | off; |
- 证书文件
Syntax: ssl_certificate file; |
- 私钥文件
Syntax: ssl_certificate_key file; |
5.配置 Nginx 证书
5.1 配置 Nginx
$ vim /etc/nginx/conf.d/s.linux.com.conf |
5.2 重启 Nginx
$ systemctl restart nginx |
5.3 配置站点
$ echo "test https" > /code/https/index.html |
五、全站 HTTPS
1.环境准备
主机 | 外网IP | 内网IP | 身份 |
---|---|---|---|
lb-01 | 10.0.0.5 | 172.16.1.5 | 负载均衡 |
web-01 | 10.0.0.6 | 172.16.1.6 | web服务器 |
web-02 | 10.0.0.7 | 172.16.1.8 | web服务器 |
2.配置 web服务器(两台)
2.1 配置 Nginx 配置文件
[root@web-01 conf.d]# vim s.linux.com.conf |
重启 nginx 服务
[root@web-01 conf.d]# systemctl restart nginx |
2.2 同步配置文件
[root@web-01 conf.d]# scp s.linux.com.conf 172.16.1.8:/etc/nginx/conf.d/ |
2.3 配置站点目录文件
[root@web-01 conf.d]# mkdir /code/https |
2.4 推送、上传证书文件
[root@web-01 conf.d]# scp -r /etc/nginx/ssl_key 172.16.1.4:/etc/nginx/ |
2.5 配置负载均衡机器 Nginx
写法一
[root@lb-01 conf.d]# vim s.linux.com.conf
upstream webserver {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name s.linux.com;
return 302 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name s.linux.com;
ssl_certificate /etc/nginx/ssl_key/server.crt;
ssl_certificate_key /etc/nginx/ssl_key/server.key;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
location / {
proxy_pass http://webserver;
proxy_set_header host $http_host;
}
}写法二
[root@lb-01 conf.d]# vim s.linux.com.conf
upstream webserver {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
listen 443 ssl;
server_name s.linux.com;
#HTTP_TO_HTTPS_START
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END
#SSL-START
ssl_certificate /etc/nginx/ssl_key/server.crt;
ssl_certificate_key /etc/nginx/ssl_key/server.key;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
#SSL-END
location / {
proxy_pass http://webserver;
proxy_set_header host $http_host;
}
}
注意:
以上两种 SSL 配置方法选择一种即可。
配置完成后,重启 nginx 服务,然后使用浏览器验证配置是否生效。