09.Nginx HTTPS
徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。老男孩Linux云计算运维QQ交流群: 384467551 226199307
老男孩教育官网 http://www.oldboyedu.com
实战构建一个满足苹果要求的HTTPS后台服务
1.HTTPS证书基本概述
为什么需要使用HTTPS, 因为HTTP不安全
1.传输数据被中间人盗用, 信息泄露
2.数据内容劫持, 篡改
配置HTTPS前预备知识
- HTTPS证书购买类型
- 专业版OV型证书, 不显示企业名称
- 高级版EV型证书, 显示企业名称
- HTTPS证书购买选择
- 保护1个域名
www
- 保护5个域名
www images cdn test m
- 通配符域名
*.oldboy.com
- 保护1个域名
- HTTPS注意事项
- Https不支持续费,证书到期需重新申请新并进行替换.
- Https不支持三级域名解析, 如
test.m.oldboy.com
- Https显示绿色, 说明整个网站的URL都是https的。
- Https显示黄色, 因为网站代码中包含http的不安全连接。
- Https显示红色, 要么证书是假的,要么证书过期。
2.HTTPS证书本地申请
配置苹果要求的证书
1.服务器所有连接使用TLS1.2以上版本(openssl 1.0.2)
2.HTTPS证书必须使用SHA256以上哈希算法签名
3.HTTPS证书必须使用RSA 2048位或ECC256位以上公钥算法
秘钥生成操作步骤
1.生成key密钥
2.生成证书签名请求文件(csr文件)
3.生成证书签名文件(CA文件)
1.环境准备
//openssl必须是1.0.2
[root@Nginx ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
//nginx必须有ssl模块
[root@Nginx ~]# nginx -V
--with-http_ssl_module
[root@Nginx ~]# mkdir /etc/nginx/ssl_key -p
[root@Nginx ~]# cd /etc/nginx/ssl_key
2.使用openssl
充当CA
权威机构创建私钥(生产不可能使用此方式生成证书,不被互联网CA权威承认的黑户证书)
[root@Nginx ssh_key]# openssl genrsa -idea -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.....+++
//记住配置密码, 我这里是1234
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
3.生成自签证书,同时去掉私钥的密码
[root@Nginx ssl_key]# openssl req -days 36500 -x509 \
-sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:WH
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:edu
Organizational Unit Name (eg, section) []:SA
Common Name (eg, your name or your server's hostname) []:bgx
Email Address []:bgx@foxmail.com
# req -->用于创建新的证书
# new -->表示创建的是新证书
# x509 -->表示定义证书的格式为标准格式
# key -->表示调用的私钥文件信息
# out -->表示输出证书文件信息
# days -->表示证书的有效期
3.HTTPS单台场景实践
1.Nginx配置HTTPS
语法
Syntax: ssl on | off;
Default: ssl off;
Context: http, server
Syntax: ssl_certificate file;
Default: —
Context: http, server
Syntax: ssl_certificate_key file;
Default: —
Context: http, server
2.配置Nginx
支持Https
实例
[root@Nginx ~]# cat /etc/nginx/conf.d/ssl.conf
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
root /soft/code;
index index.html index.htm;
access_log /logs/ssl.log main;
}
}
3.测试访问, 由于该证书非第三方权威机构颁发,而是我们自己签发的,所以浏览器会警告
4.以上配置如果用户忘记在浏览器地址栏输入https://
那么将不会跳转至https
, 那么需要配置将用户访问http
请求强制跳转https
[root@Nginx ~]# cat /etc/nginx/conf.d/ssl.conf
server {
listen 443;
server_name bgx.com;
index index.html index.htm;
ssl on;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
root /code;
}
}
server {
listen 80;
server_name bgx.com;
rewrite ^(.*) https://$server_name$1 redirect;
#return 302 https://$server_name$request_uri;
}
5.最后检查是否支持苹果要求ATS
协议
//仅能在苹果终端上使用
$ nscurl --ats-diagnostics --verbose https://192.168.69.113
4.HTTPS集群场景实践
1.实战单台web
服务配置HTTPS
# 1.准备文件
[root@Nginx ~]# mkdir /etc/nginx/ssl_key -p
[root@Nginx ~]# cd /etc/nginx/ssl_key
[root@Nginx ~]# openssl genrsa -idea -out server.key 2048
[root@Nginx ~]# openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
# 2.配置nginx
[root@web03 conf.d]# cat https.conf
server {
listen 443;
server_name s.oldboy.com;
ssl on;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
root /code;
index index.html;
}
}
server {
listen 80;
server_name s.oldboy.com;
rewrite (.*) https://$server_name$1 redirect;
#return 302 https://$server_name$request_uri;
}
1. 443端口为ssl监听端口。
2. ssl on表示打开ssl支持。
3. ssl_certificate指定crt文件所在路径,如果写相对路径,必须把该文件和nginx.conf文件放到一个目录下。
4. ssl_certificate_key指定key文件所在路径。
5. ssl_protocols指定SSL协议。
6. ssl_ciphers配置ssl加密算法,多个算法用:分隔,ALL表示全部算法,!表示不启用该算法,+表示将该算法排到最后面去。
7. ssl_prefer_server_ciphers 如果不指定默认为off,当为on时,在使用SSLv3和TLS协议时,服务器加密算法将优于客户端加密算法。
2.实战Nginx
负载均衡+Nginx WEB
配置HTTPS
1) 环境准备
主机名 | 外网IP(NAT) | 内网IP(LAN) | 角色 |
---|---|---|---|
lb01 | eth0:10.0.0.5 | eth1:172.16.1.5 | nginx-proxy |
web01 | eth0:10.0.0.7 | eth1:172.16.1.7 | nginx-web01 |
web02 | eth0:10.0.0.8 | eth1:172.16.1.8 | nginx-web02 |
2) 配置后端两台web节点监听80端口, 如已配置则无需修改
[root@web01 conf.d]# cat blog.oldboy.com.conf
server {
listen 80;
server_name blog.oldboy.com;
root /code/wordpress;
index index.php index.html;
location ~ \.php$ {
root /code/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3) 配置第二台web节点
[root@web02 ~]# yum install -y nginx
[root@web01 ~]# scp -rp /etc/nginx/ssl_key/ root@172.16.1.8:/etc/nginx/
[root@web01 ~]# scp -rp /etc/nginx/conf.d/ root@172.16.1.8:/etc/nginx/
4) 重启两台后端web节点Nginx
[root@web01 ~]# systemctl restart nginx
[root@web02 ~]# systemctl restart nginx
5) Nginx负载均衡先生成证书
[root@lb01 ~]# mkdir /etc/nginx/ssl_key -p
[root@lb01 ~]# cd /etc/nginx/ssl_key
[root@lb01 ~]# openssl genrsa -idea -out server.key 2048
[root@lb01 ~]# openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
6) Nginx负载均衡配置文件如下
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy.conf
# 定义后端资源池
upstream site {
server 172.16.1.7:80 max_fails=2 fail_timeout=10s;
server 172.16.1.8:80 max_fails=2 fail_timeout=10s;
}
# https配置
server {
listen 443;
server_name blog.oldboy.com;
ssl on;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
proxy_pass http://site;
include proxy_params;
}
}
# 用户http请求跳转至https
server {
listen 80;
server_name blog.oldboy.com;
return 302 https://$server_name$request_uri;
}
7) 重启Nginx 负载均衡
[root@lb01 ~]# nginx -t
[root@lb01 ~]# systemctl restart nginx
8) wordpress早期安装如果是使用http方式, 那开启https后会导致, wordpress出现破图或加载不全的情况
建议:
1.在安装wordpress之前就配置好https
2.在wordpress后台管理页面, 设置->常规->修改(WordPress地址以及站点地址)为 https://
3.注意: wordpress很多链接在安装时被写入数据库中
6.HTTPS阿里云场景实践
在云上签发各品牌数字证书,实现网站HTTPS
化,使网站可信,防劫持、防篡改、防监听。并进行统一生命周期管理,简化证书部署,一键分发到云上产品
上传阿里云证书, 并解压
[root@Nginx ssl_key]# rz
rz waiting to receive.
Starting zmodem transfer. Press Ctrl+C to cancel.
Transferring 1524377920931.zip...
100% 3 KB 3 KB/sec 00:00:01 0 Errors
//解压
[root@Nginx ssl_key]# unzip 1524377920931.zip
配置nginx https
[root@Nginx conf.d]# cat ssl.nginx.bjstack.com.conf
server {
listen 443;
server_name nginx.bjstack.com;
ssl on;
ssl_session_timeout 10m;
ssl_certificate ssl_key/1524377920931.pem;
ssl_certificate_key ssl_key/1524377920931.key;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root /soft/code;
index index.html index.htm;
}
}
server {
listen 80;
server_name nginx.bjstack.com;
rewrite ^(.*) https://$server_name$1 redirect;
}
测试访问Https
使用腾讯云ATS
检测工具检查是否满足苹果IOS
要求苹果ATS测试传送门
7.Https阿里云SLB场景实践
1) 环境准备
角色 | 外网IP(NAT) | 内网IP(LAN) | 协议 |
---|---|---|---|
slb | eth0:10.0.0.5 | eth1:172.16.1.5 | https |
ecs01 | eth0:10.0.0.7 | eth1:172.16.1.7 | http |
ecs02 | eth0:10.0.0.8 | eth1:172.16.1.8 | http |