目录
ToggleHttps概述
https == http over tls
基于http协议,传输的时候进行加密.
如果不使用https,数据传输都是明文的.
应用场景:
目前大部分的业务都是使用https加密.
企业想使用http 2.0基于https.
部署https加密的流程
域名 *.jd.com www.jd.com
根据域名申请https证书(私钥与公钥(ca证书)),也可以自己创建.
进行配置web/lb进行配置
跳转http 👉 https

Https加密流程(单台)
部署:申请的https证书的域名与网站域名一致,才能正常使用.
否则用户访问会有警告与提示
mkdir -p /etc/nginx/ssl_keys/
配置文件:
[root@web01 /etc/nginx/ssl_keys]# cat /etc/nginx/conf.d/ssl.linuxjk.cn.conf
server {
listen 443 ssl;
#ssl on ; 1.15.0 以后被废弃了.
server_name ssl.linuxjk.cn;
root /app/code/ssl;
#ssl key
ssl_certificate /etc/nginx/ssl_keys/ssl.linuxjk.cn.pem;
ssl_certificate_key /etc/nginx/ssl_keys/ssl.linuxjk.cn.key;
location / {
index index.html;
}
}
mkdir -p /app/code/ssl
echo ssl.linuxjk.cn web01 > /app/code/ssl/index.ngx_html
这里使用自建ssl证书

http跳转https(return)
配置http 👉 https
server {
listen 80;
server_name ssl.linuxjk.cn;
return 301 https://ssl.linuxjk.cn$request_uri;
#rewrite ^(.*)$ https://ssl.linuxjk.cn$1 permanent
}https认证原理
pem,crt等等属于公钥,用于展示
key属于私钥,藏好
严格的https包含非对称加密和对称加密

首先走非对称加密,将客户端使用网站公钥生成的随机密钥发送至服务端,后面二者之间就用对称加密进行通信

命令行创建https证书(自己给自己颁 发证书)
#创建私钥 私钥server.keyopenssl genrsa -idea -out server.key 2048

#根据私钥创建 证书 server.crt .pem证书openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt

网站集群https配置

一般只有外网的机器需要配https,80跳转443后,lb将请求发给内网web服务器的80端口,内网之间可以不分配公网ip
如果是PHP需要在nginx配置文件中添加fast_param HTTPS ON;
1) 网站集群全部配置https加密并配置http2.0
ssl.oldboylinux.cn web01
lb01配置文件
[root@lb01 ~]# cat /etc/nginx/conf.d/ssl.linuxjk.cn.conf
upstream ssl_pools {
server 10.0.0.7:443 ;
server 10.0.0.8:443 ;
}
server {
listen 80;
server_name ssl.linuxjk.cn;
return 301 https://ssl.linuxjk.cn$request_uri;
}
server {
listen 443 ssl http2;
server_name ssl.linuxjk.cn;
#ssl keys
ssl_certificate /etc/nginx/ssl_keys/ssl.linuxjk.cn.pem;
ssl_certificate_key /etc/nginx/ssl_keys/ssl.linuxjk.cn.key;
location / {
proxy_pass https://ssl_pools;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
}
}
web01配置文件
server {
listen 443 ssl http2;
server_name ssl.linuxjk.cn;
root /app/code/ssl;
#ssl key
ssl_certificate /etc/nginx/ssl_keys/ssl.linuxjk.cn.pem;
ssl_certificate_key /etc/nginx/ssl_keys/ssl.linuxjk.cn.key;
location / {
index index.html;
}
}2) 网站集群部分进行https(用户到负载为https)
#lb配置与上方一致,proxy_pass需要改成http;upstream ssl_pools写成server 10.0.0.8:80
#web配置
server {
listen 80;
server_name ssl.linuxjk.cn;
root /app/code/ssl;
location / {
index index.html;
}
}
可以看出抓包信息中只有用户到负载之间才有tls的协议(https)
用户 : 负载加密(https) 负载到web未加密(http) 配置php网站的时候有问题.
对php动态部分进行配置.
fastcgi_param HTTPS on; #因为前面部分的请求是https
#适用于 负载是https;web是http场景下添加.
#HTTPS on告诉php 请求是来自于负载的https请求.
优化与监控
1) 优化(在配置文件中可以根据需要添加)
https ==http over tls
通过tls协议对数据进行加密.
server {
listen 443 ssl;
keepalive_timeout 70;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #指定ssl加密协议的版本
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5;
#加密算法.需要排除不安全的算法
#排除null空算法, md5算法
ssl_certificate /usr/local/nginx/conf/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/cert.key;
#设置https 会话缓存 10MB大小的空间用于存储缓存.
ssl_session_cache shared:SSL:10m;
#超时时间 10分钟
ssl_session_timeout 10m;
}监控⭐(证书/域名过期时间)
监控方案(监控https证书是否过期):
- 命令行curl的方式监控. https证书已经部署到网站上并且可以访问
- 命令行openssl命令的方法监控.证书无法通过curl访问.
脚本流程:
᳄ 域名列表
- 通过命令获取证书的过期日期 https
- 与当前日期对比(30天之前)(转换为秒)
- 获得剩余的时间,如果小于30天就发送邮件告警.
查询已经建立的网站证书是否过期(优先使用)
curl -vL https://www.baidu.com -o /dev/null |& grep 'expire date' | awk -F ' ' '{print $4,$5,$(NF-1)}'
curl -vL https://www.baidu.com -o /dev/null |& grep 'expire date:' | awk -F 'date:|GMT' '{print $2}'
#有一些命令的输出,并非标准输出,而是作为标准错误输出,管道后方加个&才能达到正常的过滤效果
#-o表示把curl命令的响应报文信息定向到指定位置,这里是/dev/null空.
|& 表示把管道前面标准输出(正确)和标准错误输出 都传递给后面的命令.
如果不加,默认传递标准输出(正确)
把获取到的时间转换为秒(date -d * +%s)
date -d 'Aug 10 07:01:01 2026' +%s
#-d 根据描述显示日期或时间
#+%s 显示当前时间为秒显示
计算:过期时间-当前时间然后统计
#计算:bc 命令
#1.获取过期日期export LANG=en_US.UTF-8
#先设置语言防止date命令显示错误无法解析curl -Lv https://www.baidu.com -o /dev/null |& grep 'expire date:'|awk -F 'date:|GMT' '{print $2}'
# Aug 06 05:16:01 2023
#2.过期日期转换为秒date +%s -d " Aug 06 05:16:01 2023"
#1691270161
#3.当前日期转换为秒date +%s
#1687142200
#4.相减获取还有多少天过期echo "1691270161 - 1687142200" |bc
#4127961echo "(1691270161 - 1687142200)/60/60/24" |bc
#47
#5.进行判断(多少天发邮件警告)
书写并测试脚本
进阶脚本:增加for循环批量检查.
备用检查方法:openssl查看本地证书文件的方式查看证书是否过期
openssl x509 -in server.pem -noout -datesnotBefore=Sep 19 14:26:55 2025 GMT
#这个时间之前不能用notAfter=Aug 26 14:26:55 2125 GMT
#这个时间之后不能用
##在二者之间是证书有效期
