HTTPS通信安全及证书管理

本文介绍了HTTPS的工作原理及其在防御多种网络攻击方面的应用,详细解析了PKI体系与SSL/TLS协议,以及如何生成和管理证书,包括自签名证书与Let's Encrypt免费证书的配置过程。
部署运行你感兴趣的模型镜像

HTTPS基础

  • 基于安全套接字协议(TLS/SSL)之上的HTTP通信协议
  • 可用于抵御 窃听、篡改、冒充、劫持 攻击,实现 身份验证、信息加密、完整性校验
  • 其在TCP协议三次握手之后增加了四次握手

PKI体系原理

  1. CA机构审核服务商身份信息后利用私钥签名其证书请求来签发证书
  2. 客户端利用CA机构公钥校验服务商证书上的签名从而验证其身份

SSL/TLS

SSL/TLSPKI 体系的一种实现

  • TLS: 传输层安全协议(Transport Layer Security),基于RSA加密算法
  • SSL:TLS的上一代产品,已废弃

SSL/TLS通信流程

  1. 客户端请求建立加密通信等 +随机数1
  2. 服务器返回证书(内含非对称加密公钥)等 +随机数2
  3. 客户端校验证书并从中取出公钥,通知服务端握手结束等 +公钥加密随机数3
  4. 服务端私钥解密随机数3,并通知客户端握手结束等
  5. 两端各自基于三个随机数生成对称加密秘钥session key,通信进入常规http协议并用session key加密

证书概要

证书是CA为服务商签发的身份认证凭据

  • 浏览器默认已内置了常用 CA根证书(CA的自签名证书)
  • 我们可选用免费的CA机构 Let's Encrypt 签发的证书
  • 证书可通过信任链传递有效性
  • 证书内容包括
    • CA私钥签名、CA公钥、签发机构、域名、申请者等
    • 可能存在的信任链(如果不是CA根证书签发的话)
  • 证书主要分两类:
    • 自签名证书
    • CA证书(可用于签名其他证书)
  • 有两种方式吊销证书:
    • CRL 文件
    • OCSP
  • 证书格式

常规证书签发

openssl genrsa -out domain.key 4096  # 网站先生成 rsa加密的私钥
openssl req -new -key domain.key -out domain.csr  # 基于 网站私钥 生成 证书请求csr

# csr证书请求 被签名后 转换为证书
# 证书可由商业CA机构签发 或 以下方式自行签发3种证书:
openssl x509 -req -in domain.csr -signkey domain.key -out domain.crt  # 基于网站私钥 签发 自签名证书
openssl x509 -req -in domain.csr -signkey domain.key -extensions v3_ca -out domain_ca.crt  # 基于网站私钥 签发 自签名CA证书
openssl x509 -req -in next_domain.csr -CA domain_ca.crt -CAkey domain_ca.key -CAcreateserial -extensions v3_usr -out next_domain_ca.crt  # 基于 CA证书、CAkey 签发 派生域名的CA证书

自签名证书

sudo mkdir /etc/certs
cd /etc/certs
sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key -x509 -days 365 -out domain.crt  # 其中Common Name输入域名
sudo openssl dhparam -out dhparam.pem 1024  # 生成DHE参数文件增强ssl加密
sudo chmod -R 777 /etc/certs

配置客户机信任自签名证书

  • windows平台
    • 自签名证书会被浏览器标记为不安全
    • 需要手动将自签名证书导入到浏览器的根证书信任列表
    • Chrome根证书信任设置:设置 》 高级 》 HTTPS/SSL 》 管理证书 》 受信任的根证书颁发机构 》 导入
  • CentOs7平台
sudo yum install ca-certificates
update-ca-trust enable
sudo cp 自签名证书.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust extract

Let's Encrypt证书

Let's Encrypt是由ISRG互联网安全小组开放的免费证书服务,基于ACME协议,证书有效期为90天

0.基于Docker创建证书

sudo docker run -it --rm -p 443:443 -p 80:80 --name certbot \
            -v "/etc/letsencrypt:/etc/letsencrypt" \
            -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
            certbot/certbot certonly -n -v --standalone --agree-tos --email 邮箱 -d 域名1 -d 域名2

1.基于官方工具Certbot创建Let's Encrypt证书

sudo yum install certbot

# 使用工具内建web服务器模式,需临时停用主机上的已有80端口服务
sudo certbot certonly -n -v --standalone --agree-tos --email 邮箱 -d 域名1 -d 域名2 \
 --pre-hook  "service nginxd stop"  --post-hook "service nginxd start"

Certbot执行成功后将在 /etc/letsencrypt/live/域名 路径下导出以下文件:

  • cert.pem (网站证书)
  • chain.pem (cert.pem + 中间证书)
  • fullchain.pem (【网站证书 + 】 中间证书 + root证书)
  • privkey.pem (证书私钥)

设置每月一号凌晨1点自动更新证书CronJob

0 1 1 * * certbot renew --quiet --pre-hook "service nginxd stop" --post-hook "service nginxd start"

2. 基于 acme-tiny 工具创建证书 GitHub地址

外部依赖:

  • openssl
  • python
sudo mkdir /etc/certs
cd /etc/certs

sudo openssl genrsa 4096 > account.key  # 创建账户私钥
sudo openssl genrsa -out domain.key 4096  # 创建网站rsa私钥

# 两种方式创建csr证书请求
sudo openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:example.com,DNS:www.example.com")) > domain.csr  # 直接导出方式
sudo openssl req -new -sha256 -key domain.key -out domain.csr  # 交互命令行方式,Common Name指定为网站域名

## 校验服务配置 ##
# 1. 校验服务目录
mkdir /srv/ca_challenges
# 2. nginx配置
'server {
    listen 80;
    server_name www.example.com example.com;

    location ^~ /.well-known/acme-challenge/ {
        alias /srv/ca_challenges/;
        try_files $uri =404;
    }

    location / {
        rewrite ^/(.*)$ https://example.com/$1 permanent;
    }
}'

# acme-tiny工具生成证书
cd /etc/certs
sudo wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
sudo python acme_tiny.py --account-key ./domain.key --csr ./domain.csr --acme-dir /srv/ca_challenges/ > ./domain.crt

# 中间证书合并
sudo wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
sudo cat domain.crt intermediate.pem > chain.pem

# 证书信任链
sudo wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
sudo cat root.pem intermediate.pem > fullchain.pem

设置每月一号凌晨1点自动更新证书CronJob

  1. 更新脚本renew_cert.sh
cd /etc/certs
python acme_tiny.py --account-key domain.key --csr domain.csr --acme-dir /srv/ca_challenges/ > signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chain.pem
service nginxd reload
  1. 加入定时任务:
0 0 1 * * /etc/certs/renew_cert.sh

服务器配置支持HTTPS

自动配置生成器:https://mozilla.github.io/server-side-tls/ssl-config-generator

典型的如nginx下配置

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name example.com, www.example.com;

    location ^~ /.well-known/acme-challenge/ {
        alias /srv/ca_challenges/;
        try_files $uri =404;
    }

    location / {
        # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
        return 301 https://$host$request_uri;        
    }

}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com, www.example.com;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /etc/certs/chain.pem;
    ssl_certificate_key /etc/certs/domain.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;


    # modern configuration. tweak to your needs.
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    ## verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /etc/certs/fullchain.pem;

    resolver <IP DNS resolver>;

    ....
}

转载于:https://my.oschina.net/u/2400083/blog/809355

您可能感兴趣的与本文相关的镜像

AutoGPT

AutoGPT

AI应用

AutoGPT于2023年3月30日由游戏公司Significant Gravitas Ltd.的创始人Toran Bruce Richards发布,AutoGPT是一个AI agent(智能体),也是开源的应用程序,结合了GPT-4和GPT-3.5技术,给定自然语言的目标,它将尝试通过将其分解成子任务,并在自动循环中使用互联网和其他工具来实现这一目标

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值