HTTPS专题

Https概述

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.key
openssl 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
#4127961
echo "(1691270161 - 1687142200)/60/60/24" |bc
#47
#5.进行判断(多少天发邮件警告)

书写并测试脚本

进阶脚本:增加for循环批量检查.

备用检查方法:openssl查看本地证书文件的方式查看证书是否过期

openssl x509 -in server.pem -noout -dates
notBefore=Sep 19 14:26:55 2025 GMT
#这个时间之前不能用
notAfter=Aug 26 14:26:55 2125 GMT
#这个时间之后不能用
##在二者之间是证书有效期

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部