Linux 服务部署:自签 CA 证书构建 HTTPS 及动态 Web 集成
Linux 服务部署:自签 CA 证书构建 HTTPS 及动态 Web 集成
一、HTTPS基础原理
HTTPS是HTTP协议基于SSL/TLS协议的加密版本,核心差异及握手过程如下:
-
HTTP与HTTPS对比
协议 传输方式 端口 核心特点 HTTP 明文传输 80 无加密,安全性低 HTTPS 数据加密(SSL/TLS) 443 数据加密、身份验证,安全性高 -
SSL/TLS握手过程(简化)
-
客户端(Client)动作:
第一步
ClientHello
:发送支持的SSL/TLS版本、加密算法,生成随机数random_c
(32字节)。第三步
ClientKeyExchange
:用服务器公钥加密预处理密钥pre_master
,发送给服务器。 -
服务器(Server)动作:
第二步
ServerHello
:确定版本和加密算法,生成随机数random_s
(32字节);发送证书(含公钥)。第四步用私钥解密
pre_master
,结合random_c
+random_s
+pre_master
生成会话密钥,用于后续数据加密传输。
-
openssl: 命令的选项
-x509 :生成自签名证书格式,专用于创建私有CA
-new :生成新证书的签署请求
-key :生成请求时用到的私钥文件路径
-out :生成后的文件存放路径,如果是自签名操作,将直接生成签署过的证书
-days :证书有效期 默认是365天
二、CA(证书颁发机构)配置
CA是用于颁发和管理数字证书的机构,私有CA配置步骤如下:
1. 前提准备
- 在DNS服务器的正向解析文件中添加CA域名解析(如
ca.example.com
对应IP192.168.100.10
):vim /var/named/example.com.zone # 添加以下内容 ca IN A 192.168.100.10 # 保存退出后重启DNS服务 systemctl restart named
2. CA核心配置文件(/etc/pki/tls/openssl.cnf
中 [CA_default]
段)
查看缺少那些文件没有
# 配置文件关键内容如下
dir = /etc/pki/CA # CA根目录
certs = $dir/certs # 已颁发证书存储目录
database = $dir/index.txt # 证书跟踪数据库
new_certs_dir = $dir/newcerts # 新证书临时目录
certificate = $dir/cacert.pem # CA根证书路径
serial = $dir/serial # 证书序列号文件
private_key = $dir/private/cakey.pem # CA私钥路径(需保密)
RANDFILE = $dir/private/.rand # 指定随机数生成器的种子文件路径
3. 生成CA私钥和自签名证书
-
生成CA私钥(权限严格限制,
umask 077
确保仅root可读写):(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem)
-
生成CA自签名证书(
-x509
指定自签名格式):openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
- openssl req`**:OpenSSL 中用于处理证书请求(CSR)的子命令。
-new
:生成新的证书请求。
-
-x509
:直接生成自签名证书(通常用于根 CA,因为根证书无需其他机构签名)。-key
:指定用于签名的私钥路径(这里是 CA 的私钥cakey.pem
)。-out
:指定输出的证书文件路径(生成的 CA 根证书cacert.pem
)。-days 365
:设置证书有效期为 365 天(1 年)。
证书信息(DN 字段)填写详情
证书需要包含标识身份的“可分辨名称(Distinguished Name, DN)”,以下是各字段的输入和含义:
Country Name (2 letter code) [XX]:CN
- 国家/地区代码(2 个字母),输入
CN
表示“中国”。
- 国家/地区代码(2 个字母),输入
State or Province Name (full name) []:HB
- 省/州名称,输入
HB
通常代表“湖北省”。
- 省/州名称,输入
Locality Name (eg, city) [Default City]:WH
- 城市名称,输入
WH
通常代表“武汉市”。
- 城市名称,输入
Organization Name (eg, company) [Default Company Ltd]:LQ
- 组织/公司名称,这里填写自定义名称
LQ
。
- 组织/公司名称,这里填写自定义名称
Organizational Unit Name (eg, section) []:linux
- 部门/单位名称,输入
linux
表示该 CA 属于 Linux 相关部门。
- 部门/单位名称,输入
Common Name (eg, your name or your server's hostname) []:ca.example.com
- 通用名称(核心字段),通常是 CA 服务器的域名,这里设置为
ca.example.com
(符合 CA 服务器的命名规范)。
- 通用名称(核心字段),通常是 CA 服务器的域名,这里设置为
Email Address []:root@example.com
- 联系邮箱,填写
root@example.com
作为证书管理员的联系方式。
- 联系邮箱,填写
- 创建CA必要文件:
touch /etc/pki/CA/index.txt # 证书数据库 echo 01 > /etc/pki/CA/serial # 初始序列号(从01开始)
三、Web服务器证书申请与签名
Web服务器(如Apache)需向CA申请证书,步骤如下:
1. Web服务器生成私钥和CSR(证书签名请求)
-
创建存放证书的目录:
mkdir /etc/httpd/ssl # Apache证书目录
-
生成Web服务器私钥:
(umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key)
-
生成CSR文件(需与CA信息匹配,主机名填
web.example.com
):openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
- DN字段示例:国家(CN)、省份(HB)、城市(WH)、组织(LQ)、部门(linux)、主机名(hrz2.example.com)、邮箱(root@example.com)。
2. CA签名Web证书
-
Web服务器发送CSR给CA:
scp /etc/httpd/ssl/httpd.csr root@ca.example.com:/etc/pki/CA/ # 传输CSR
-
在主机CA上 对签署请求进行数字签名,并指明所生成的Web证书的存放路径:
openssl ca -in /etc/pki/CA/httpd.csr -out /etc/pki/CA/httpd.crt -days 365
3. Web服务器获取签名证书
scp root@ca.example.com:/etc/pki/CA/httpd.crt /etc/httpd/ssl/ # 下载签名后的证书
四、Apache部署HTTPS站点
通过mod_ssl
模块配置Apache支持HTTPS:
1. 安装mod_ssl
yum -y install mod_ssl # 安装SSL模块
2. 配置SSL证书路径
修改/etc/httpd/conf.d/ssl.conf
,指定证书和私钥路径:
# 编辑配置文件
vim /etc/httpd/conf.d/ssl.conf
# 修改以下两行
SSLCertificateFile /etc/httpd/ssl/httpd.crt # Web服务器证书
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key # Web服务器私钥
3. 配置HTTPS虚拟主机
创建/etc/httpd/conf.d/httpd-vhosts.conf
,添加虚拟主机配置:
# 编辑虚拟主机配置文件
vim /etc/httpd/conf.d/httpd-vhosts.conf
# 添加以下内容
<VirtualHost 192.168.100.20:443>DocumentRoot "/var/www/html/test" # 网站根目录ServerName hrz2.example.com # 绑定域名SSLEngine on # 启用SSLSSLCertificateFile /etc/httpd/ssl/httpd.crt # 证书路径SSLCertificateKeyFile /etc/httpd/ssl/httpd.key # 私钥路径
</VirtualHost>
# 保存退出后重启Apache
systemctl restart httpd
4. 客户端信任CA根证书
-
下载CA根证书到客户端:
scp root@192.168.100.10:/etc/pki/CA/cacert.pem . # 从CA服务器下载
-
导入浏览器(以火狐为例):
设置 → 首选项 → 高级 → 证书 → 查看证书 → 导入 → 选择cacert.pem
→ 勾选“信任使用此CA标识的网站” → 确认。
-
访问验证:
浏览器访问https://hrz2.example.com
,显示安全连接。
五、集成Python动态Web内容
通过mod_wsgi
模块部署Python动态内容:
1. 安装依赖
yum -y install httpd mod_wsgi # 安装Apache和WSGI模块
2. 部署动态内容
-
创建存放Python脚本的目录:
mkdir /var/www/wsgi # 存放Python脚本 # 将Python动态脚本(如webapp.py)上传至该目录
-
配置虚拟主机:
修改/etc/httpd/conf.d/httpd-vhosts.conf
,添加HTTP虚拟主机(80端口):vim /etc/httpd/conf.d/httpd-vhosts.conf # 添加以下内容 <VirtualHost 192.168.100.20:80>DocumentRoot "/var/www/wsgi"WSGIScriptAlias / "/var/www/wsgi/webapp.py" # 绑定Python脚本ServerName py.example.com # 动态站点域名 </VirtualHost>
3. DNS解析配置
在DNS服务器添加py.example.com
解析:
vim /var/named/example.com.zone
# 添加以下内容
py IN A 192.168.100.20 # 解析到Web服务器IP
# 保存退出后重启DNS
systemctl restart named
4. 验证
浏览器访问 http://py.example.com
,查看动态内容是否正常加载。