HTTPS安全证书基本概述
- 为什么需要使用HTTPS,因为HTTP不安全。当我们使用HTTP网站时,会遭到劫持和篡改,如果采用HTTPS协议,那么数据在传输的过程中是加密的,所以黑客无法窃取或者篡改数据报文信息,同时也避免网站传输时信息泄露。
场景模拟
- 正常访问情况(本地hosts文件代替DNS解析服务)
- web01服务器
3. 修改Nginx配置文件
vim /etc/nginx/conf.d/test.nana.com.conf
server {
listen 80;
server_name test.nana.com;
charset utf-8,gbk;
root /soft/code;
index index.html;
}
4. 创建Nginx配置文件指定的数据信息
vim /soft/code/index.html
<h1>Nginx01</h1>
<h2>Nginx01</h2>
<h3>Nginx01</h3>
- 测试
在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析(注释掉本机其他ip与域名之间的对应关系)
192.168.15.7 test.nana.com
我们打开浏览器输入test.nana.com;可以看到三个字体大小不一致的Nginx01
- DNS数据被劫持的情况
- lb01服务器
1. 修改Nginx配置文件
vim proxy_test.conf
upstream test {
server 172.16.1.7:80;
}
server {
listen 80;
server_name test.nana.com;
location / {
proxy_pass http://test;
proxy_set_header Host $http_host;
sub_filter "<h3>" "<h1>"; # 将Nginx配置文件中<h3>替换成<h1>
# sub_filter模块可以实现Nginx数据替换
sub_filter "</h3>" "</h1>"; # 将Nginx配置文件中</h3>替换成</h1>
}
}
- 测试
在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析(注释掉本机其他ip与域名之间的对应关系)
192.168.15.5 test.nana.com
我们打开浏览器输入test.nana.com;可以看到的Nginx01字体格式跟之前的字题格式不一样了
对称加密与非对称加密
-
对称加密比较简单,就是客户端和服务器共用同一个密钥,该密钥可以用于加密一段内容,同时也可以用于解密这段内容。对称加密的优点是加解密效率高,但是在安全性方面可能存在一些问题,因为密钥存放在客户端有被窃取的风险。
-
非对称加密则要复杂一点,它将密钥分成了两种:公钥和私钥。公钥通常存放在客户端,私钥通常存放在服务器。使用公钥加密的数据只有用私钥才能解密,反过来使用私钥加密的数据也只有用公钥才能解密。非对称加密的优点是安全性更高,因为客户端发送给服务器的加密信息只有用服务器的私钥才能解密,因此不用担心被别人破解,但缺点是加解密的效率相比于对称加密要差很多。
https使用的是对称加密与非对称加密相结合的方式。
TLS加密协议
- 我们在实现Https时,需要了解ssl协议,但是我们现在使用更多的是TLS加密协议。
那么TLS是怎么保证明文消息被加密的呢?在OSI七层模型中,应用性是http协议,那么应用层协议下,我们的表示层,是ssl协议所发挥作用的一层,它通过(握手,交换秘钥,告警,加密)等方式,是应用层http协议在没有感知的情况下做到了数据的安全加密。
那么在数据进行加密与解密的过程中,如何让确定双方的身份,此时就需要一个权威机构来验证双方身份。那么这个权威机构则是CA机构。那么CA机构又是如何让颁发证书的。
首先我们需要申请证书,需要进行登记,并且提交自己的公钥,到了登记机构再通过CRS发给CA。CA机构则会使用我们提交的公钥,再加上一系列其他的信息,如网站域名、有效时长等,来制作证书。CA中心证书制作完成后,CA机构会使用自己的私钥对其加密,并将加密后的数据返回给我们,证书订阅人拿到加密过公钥证书后,会直接将证书(CA机构私钥加密过的证书)部署在WEB服务器上。
- 当浏览器访问我们的https站点时,它会去请求我们的证书
- Nginx这样的Web服务器会将我们的公钥证书颁发给浏览器
- 浏览器会用CA机构的公钥(任何正版操作系统都会将所有主流CA机构的公钥内置到操作系统当中)解开经过CA私钥加密过的证书。然后去CA机构(CRL和OCSP)验证证书是否合法、有效。浏览器通过CA证书中服务器的公钥与服务端建立连接后,后续的通信用的是对称加密。
- CA机构会将过去的证书放置在CRL服务器,那么CRL服务器验证的效率是非常差的,所以CA又推出了OCSP响应程序,OCSP响应程序可以查询指定的一个证书是否过期,所以浏览器可以直接查询OCSP响应程序,但OCSP响应程序性能还不是很高。
- Nginx会有一个OCSP的开关,当我们开启后,Nginx会主动上OCSP上查询,这样大量的客户端直接从Nginx获取,证书是否有效。
CA证书的类型
HTTPS证书的购买选择
- 保护1个域名,例如 : www.nana.com(保护1个二级域名)
- 保护5个域名,例如:www.nana.com;a.nana.com(保护5个二级域名)
- 通配符域名,例如:www.nana.com(保护*.nana.com个二级域名)
HTTPS注意事项
- Https不支持续费,证书到期需要重新申请并进行替换
- Https不支持三级域名解析,比如test.a.nana.com
- Https显示绿色,说明整个网站的url都是https的
- Https显示黄色,因为网站代码中包含http的不安全链接
- Https显示红色,要么证书是假的,要么证书过期
Nginx Https实战
1.模拟申请CA证书
- 环境准备
- nginx必须有ssl模块
nginx -V
# --with-http_ssl_module
- 创建存放ssl证书的路径
mkdir -p /etc/nginx/ssl_key
cd /etc/nginx/ssl_key
- 使用openssl命令充当CA权威机构创建证书(生产环境中不使用此方式生产证书,不被互联网认可的黑户证书)
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 表示证书的有效期
ls /etc/nginx/ssl_key
# server.crt(公钥文件) server.key(私钥文件)
配置单台Nginx支持Https协议
- Web01服务器
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/s.nana.com
server {
listen 443 ssl; # https默认的监听端口443,ssl表示启用https协议
server_name s.nana.com;
root /code;
ssl_certificate ssl_key/server.crt; # https协议的公钥文件路径
ssl_certificate_key ssl_key/server.key; # https协议的私钥文件路径
location /{
index index.html;
}
}
# 将http协议跳转至https协议
server {
listen 80;
server_name s.nana.com;
return 302 https://$server_name$request_uri;
# 302 每次请求都会询问服务器
}
2. 创建Nginx配置文件指定的数据信息
echo "Test Https" > /code/index.html
3. 重启Nginx服务
systemctl restart nginx
- 测试
在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析(注释掉本机其他ip与域名之间的对应关系)
192.168.15.7 s.nana.com
我们打开浏览器输入s.nana.com会跳转至https://s.nana.com,并且会跳出一个不安全的红色警告。点击高级,访问页面显示Test Https。
Nginx集群实现Https实践
Web01服务器
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/s.nana.conf
server {
listen 80;
server_name s.nana.com;
root /code;
location /{
index index.html;
}
}
2. 创建Nginx配置文件指定的数据信息
echo "Web01 Https" > /code/index.html
3. 重启Nginx服务
systemctl restart nginx
Web02服务器
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/s.nana.conf
server {
listen 80;
server_name s.nana.com;
root /code;
location /{
index index.html;
}
}
2. 创建Nginx配置文件指定的数据信息
echo "Web02 Https" > /code/index.html
3. 重启Nginx服务
systemctl restart nginx
负载均衡服务器
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/proxy_s.conf
upstream website {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 443 ssl;
server_name s.nana.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
proxy_pass http://website;
proxy_set_header Host $http_host;
}
}
server {
listen 80;
server_name s.nana.com;
return 302 https://$server_name$request_uri;
}
2. 创建公钥与私钥文件
scp -rp 172.16.1.7:/etc/nginx/ssl_key ./
3. 重启服务
systemctl restart nginx
- 测试
在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析(注释掉本机其他ip与域名之间的对应关系)
192.168.15.5 s.nana.com
我们打开浏览器输入s.nana.com会跳转至https://s.nana.com,可以实现页面跳转Web01 Https ; Web02 Https。
案例
我们基于七层负载的Wordpress服务和WeCenter服务,实现进行配置HTTPS协议跳转
web服务器
Wordpress服务(web01服务器,web02服务器均用以下配置)
- Wordpress服务
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/blog.nana.com.conf
server {
listen 80;
server_name blog.nana.com;
root /code/wordpress;
client_max_body_size 100m;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS on;
# Nginx支持https的配置时,需要在php区域配置中添加fastcgi服务,否则https不支持php文件
# 如果是http协议,不可以加这个参数
include fastcgi_params;
}
}
2. 重启服务
systemctl restart nginx
WeCenter服务(web01服务器,web02服务器均用以下配置)
- WeCenter服务
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/zh.nana.com.conf
server {
listen 80;
server_name zh.nana.com;
root /code/zh;
client_max_body_size 100m;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS on;
# Nginx支持https的配置时,需要在php区域配置中添加fastcgi服务,否则https不支持php文件
# 如果是http协议,不可以加这个参数
include fastcgi_params;
}
}
2. 重启服务
systemctl restart nginx
负载均衡服务器
lb01服务器
vim /etc/nginx/conf.d/proxy_nana.com.conf
upstream node {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name blog.nana.com;
return 302 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name blog.nana.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
proxy_pass http://node;
include proxy_params;
}
}
server {
listen 80;
server_name zh.nana.com;
return 302 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name zh.nana.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
proxy_pass http://node;
include proxy_params;
}
}
2. 重启服务
systemctl restart nginx
我们基于七层负载的Phpmyadmin服务,实现进行配置HTTPS协议跳转
web服务器
Phpmyadmin服务(web01服务器,web02服务器均用以下配置)
- web01服务器
vim /etc/nginx/conf.d/php.conf
server {
listen 80;
server_name php.nana.com;
root /code/phpMyAdmin-5.1.0-all-languages;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS on;
# Nginx支持https的配置时,需要在php区域配置中添加fastcgi服务,否则https不支持php文件
# 如果是http协议,不可以加这个参数
include fastcgi_params;
}
}
2. 重启Nginx服务
systemctl restart nginx
负载均衡服务器
- lb01服务器
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/proxy_php.conf
upstream php {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name php.nana.com;
return 302 https://$server_name$request_uri;
}
server {
listen 443 ssl;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
server_name php.nana.com;
location / {
proxy_pass http://php;
include proxy_params;
}
}
2. 重启Nginx服务
systemctl restart nginx
测试
- 我们打开浏览器,用HTTP协议访问配置好的服务域名,浏览器会跳转到HTTPS协议进行页面展示。
生产环境单台主机配置HTTPS
- 负载均衡服务器
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/blog_nana.com.conf
upstream node {
server 172.16.1.7:80;
}
server {
listen 443 ssl;
server_name blog.nana.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
ssl_session_cache shared:SSL:10m;
# 在建立完ssl握手后如果断开连接,在session_time时间内再次连接,是不需要再次建立握手,可以复用之前的连接
ssl_session_timeout 100m; # ssl连接断开后的超时时间
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 使用的TLS版本协议
ssl_prefer_server_ciphers on; # Nginx决定使用哪些协议与浏览器进行通讯
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 加密算法
location / {
proxy_pass http://node;
include proxy_params;
}
}
server {
listen 80;
server_name blog.nana.com;
return 302 https://$server_name$request_uri;
}
2. 重启Nginx服务
systemctl restart nginx