HTTPS加密与私有CA配置全攻略
HTTPS 基础概念
HTTPS = HTTP + SSL/TLS
- HTTP: 明文传输,端口 80
- HTTPS: 数据加密传输,端口 443
TLS 握手流程
步骤 | 客户端 (Client) | 服务端 (Server) |
---|---|---|
1 | Client Hello: 支持的 TLS 版本、加密算法列表、随机数 random_c (32字节) | → |
2 | ← | Server Hello: 确认 TLS 版本、加密算法、随机数 random_s (32字节) Server Certificate: 发送证书(含公钥) |
3 | Client Key Exchange: 发送 pre_master (用公钥加密) | → |
4 | ← | 用私钥解密 pre_master ,生成会话密钥: Session Key = random_c + random_s + pre_master |
关键点:会话密钥通过三方随机数生成,确保前向安全性。
CA 目录结构
#查看记录openssl信息
vim /etc/pki/tls/openssl.cnf
# 默认 CA 根目录
#键值对 key = value
dir = /etc/pki/CA
#调用值用$符号
# 子目录与文件
$dir/certs # 证书存放目录 → /etc/pki/CA/certs
database = $dir/index.txt # 证书数据库 → /etc/pki/CA/index.txt
OpenSSL 命令选项
选项 | 作用 |
---|---|
-x509 | 生成自签名证书(用于私有 CA) |
-new | 生成证书签署请求(CSR) |
-key | 指定私钥文件路径 |
-out | 指定输出文件路径 |
-days | 设置证书有效期(默认 365 天) |
私有 CA 配置流程
1. DNS 准备(CA 服务器)
# 添加解析记录
vim /var/named/ydh.com
ca IN A 192.168.100.10
#重启服务
systemctl restart named
2. 生成 CA 密钥与自签名证书
# 生成 CA 私钥(权限 600)
(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem)# 生成自签名证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
填写信息:
Country(国家)=CN, State(省份)=HB, City(城市)=WH, Org(公司)=LQ, OU(组织单元)=linux,
CN(主机名字)=ca.example.com, Email(邮箱)=root@example.com
3. 初始化 CA 环境
touch /etc/pki/CA/index.txt # 证书数据库
echo 01 > /etc/pki/CA/serial # 初始序列号,不能为空
Web 服务器证书申请
1. 在Web服务器生成 Web 私钥与 CSR
#查看DNS是否关联
vim /etc/sysconfig/network-scripts/ifcfg-ens33
DNS1=192.168.100.10 #更改DNS,使其关联CA服务器#重启网卡服务
systemctl restart network#私钥放入/etc/httpd/ssl文件中
mkdir /etc/httpd/ssl
(umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key)# 生成证书签署请求 (CSR)
openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
填写信息:CN(主机名)=web.example.com(其他与 CA 一致)
2. Web服务器发送 CSR 到 CA 服务器
scp /etc/httpd/ssl/httpd.csr root@ca.example.com:/etc/pki/CA/
3. CA服务器签署证书
openssl ca -in /etc/pki/CA/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
4. Web服务器下载签名后的证书
scp root@ca.example.com:/etc/pki/CA/certs/httpd.crt /etc/httpd/ssl/
Apache HTTPS 配置
1. Web服务器安装模块与配置 SSL
yum -y install mod_ssl
vim /etc/httpd/conf.d/ssl.conf
#更改证书的路径,私钥路径
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
2.Web服务器配置 HTTPS 虚拟主机
vim /etc/httpd/conf.d/httpd-vhosts.conf
#添加
<VirtualHost 192.168.100.20:443>DocumentRoot "/var/www/html"ServerName web.example.comSSLEngine onSSLCertificateFile /etc/httpd/ssl/httpd.crtSSLCertificateKeyFile /etc/httpd/ssl/httpd.key
</VirtualHost>
3. 重启服务与防火墙
#关闭防火墙
systemctl stop firewall
systemctl disable firewall
#或
systemctl restart httpd
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
客户端信任 CA 根证书
-
客户端下载 CA 根证书:
#更改DNS为192.168.100.10 vim /etc/sysconfig/network-scripts/ifcfg-ens33scp root@ca.example.com:/etc/pki/CA/cacert.pem .
-
浏览器导入:
- Firefox:设置 → 隐私与安全 → 证书 → 查看证书 → 导入
- 勾选两个 信任此 CA 标识的网站
-
访问测试:
https://web.example.com
动态 Web 内容集成(Python WSGI)
1. 安装依赖
yum -y install httpd mod_wsgi
mkdir /var/www/wsgi
# 上传 Python 应用至 /var/www/wsgi
2. 配置虚拟主机
# 注释主配置中的 DocumentRoot
# vim /etc/httpd/conf/httpd.conf
# DocumentRoot "/var/www/html"#将python.text改名为webapp.py,并赋予权限
mv python.txt webapp.py
chmod +x test.py # 配置 WSGI 虚拟主机
vim /etc/httpd/conf.d/httpd-vhosts.conf
#访问python.txt
<VirtualHost 192.168.100.20:80>DocumentRoot "/var/www/wsgi"WSGIScriptAlias / /var/www/wsgi/webapp.pyServerName py.example.com
</VirtualHost>
#访问html网页
<VirtualHost 192.168.100.20:80>DocumentRoot "/var/www/wsgi"ServerName py.example.com
</VirtualHost>
3. DNS 解析与防火墙**
# DNS 服务器添加记录
vim /var/named/example.com.zone
py IN A 192.168.100.20
systemctl restart named# 防火墙放行 HTTP
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
4. 验证访问
systemctl restart httpd
访问:http://py.example.com
关键修正说明
- TLS 握手流程:
- 补充
Change Cipher Spec
和Finished
消息(实际通信需确认密钥切换)。 - 明确会话密钥生成公式为伪代码(实际使用 PRF 函数)。
- 补充
- 路径标准化:
- 统一使用
/etc/pki/CA
作为 CA 根目录。 - 明确
index.txt
和serial
为 CA 数据库文件。
- 统一使用
- 命令纠错:
- 修正
openssl ca
命令的输入文件路径 (/etc/pki/CA/httpd.csr
)。 - 添加
mod_ssl
安装步骤(原笔记遗漏)。
- 修正
- 防火墙优化:
- 使用
--add-service=https
代替端口放行,提高可读性。
- 使用
- 动态 Web 部分:
- 明确需注释主配置中的
DocumentRoot
避免冲突。
作为 CA 根目录。 - 明确
index.txt
和serial
为 CA 数据库文件。
- 明确需注释主配置中的
- 命令纠错:
- 修正
openssl ca
命令的输入文件路径 (/etc/pki/CA/httpd.csr
)。 - 添加
mod_ssl
安装步骤(原笔记遗漏)。
- 修正
- 防火墙优化:
- 使用
--add-service=https
代替端口放行,提高可读性。
- 使用
- 动态 Web 部分:
- 明确需注释主配置中的
DocumentRoot
避免冲突。 - 补充
WSGIScriptAlias
指向应用入口文件(如webapp.py
)。
- 明确需注释主配置中的