第三届全国技能大赛网络安全项目(模块A)复现与练习(四)—根 CA配置指南

根CA配置与CRL服务部署

. 环境说明

       本文详细介绍搭建外网根 CA 服务器的完整步骤,核心实现两大功能:生成根 CA 证书及相关密钥、通过 Nginx 提供 HTTP 服务供外部查询证书吊销列表(CRL)。

. 环境说明

. 根 CA 基础环境搭建

3.1 创建 CA 专用目录结构

       实现目标:分离 CA 的证书、私钥、CRL、证书请求(CSR)等文件,确保私钥安全性(仅所有者可访问)。

操作命令如下:

# 创建多级目录:certs(证书)、crl(吊销列表)、newcerts(新签发证书)、private(私钥)、csr(证书请求)

[root@localhost ~]# mkdir -p /root/ca/{certs,crl,newcerts,private,csr}

[root@localhost ~]# cd /root/ca

# 私钥目录设置700权限(仅root可读写,防止泄露)

[root@localhost ca]# chmod 700 private

# 创建CA数据库文件(记录证书签发/吊销状态)

[root@localhost ca]# touch index.txt

3.2 配置 OpenSSL

       实现目标:定义 CA 的核心规则(如证书策略、扩展属性、文件路径等),确保后续证书生成符合 PKI 规范。

配置文件内容及说明

[root@localhost ca]# cat > openssl.cnf << 'EOF'

# -------------------------- 全局CA配置 --------------------------

[ ca ]

default_ca = CA_default  # 指定默认CA配置段

# -------------------------- CA默认配置 --------------------------

[ CA_default ]

dir               = /root/ca                # CA根目录

certs             = $dir/certs              # 已签发证书存储路径

crl_dir           = $dir/crl                # CRL文件存储路径

new_certs_dir     = $dir/newcerts           # 新签发证书临时存储路径

database          = $dir/index.txt          # CA数据库(记录证书状态)

serial            = $dir/serial             # 证书序列号文件(初始需手动创建,如echo "01" > serial)

RANDFILE          = $dir/private/.rand      # 随机数文件(增强加密安全性)

private_key       = $dir/private/root.ca.key.pem  # 根CA私钥路径

certificate       = $dir/certs/root.ca.cert.pem   # 根CA证书路径

crl               = $dir/crl/root.ca.crl.pem      # 根CA CRL文件路径

crlnumber         = $dir/crlnumber                # CRL序列号文件(初始需手动创建,如echo "01" > crlnumber)

default_crl_days  = 30                            # CRL有效期(30天,到期需重新生成)

default_md        = sha256                       # 默认哈希算法(SHA-256,比SHA-1更安全)

preserve          = no                           # 不保留证书请求文件

policy            = policy_strict                # 证书请求验证策略(严格匹配)

# -------------------------- 严格验证策略 --------------------------

[ policy_strict ]

countryName             = match    # 国家代码必须与根CA一致

stateOrProvinceName     = match    # 省/州必须与根CA一致

organizationName        = match    # 组织名称必须与根CA一致

organizationalUnitName  = optional # 部门名称可选

commonName              = supplied # 通用名(CN)必须由请求方提供

# -------------------------- 证书请求(CSR)配置 --------------------------

[ req ]

default_bits        = 4096                  # 默认密钥长度(4096位,抗暴力破解能力更强)

distinguished_name  = req_distinguished_name # 证书持有者信息字段定义

string_mask         = utf8only              # 仅支持UTF-8字符

default_md          = sha256                # CSR默认哈希算法

# -------------------------- 证书持有者信息字段 --------------------------

[ req_distinguished_name ]

countryName                     = Country Name (2 letter code) # 国家代码(如CN)

stateOrProvinceName             = State or Province Name      # 省/州(如Chongqing)

localityName                    = Locality Name               # 城市(如Chongqing)

organizationName                = Organization Name           # 组织名称(如DubheLjsec)

organizationalUnitName          = Organizational Unit Name    # 部门名称(如IT)

commonName                      = Common Name                 # 通用名(根CA需填域名www.testpki.com)

# -------------------------- 根CA证书扩展属性 --------------------------

[ v3_ca ]

subjectKeyIdentifier = hash                # 证书持有者密钥标识(哈希值)

authorityKeyIdentifier = keyid:always,issuer # 签发者密钥标识(始终包含,关联根CA)

basicConstraints = critical, CA:true       # 核心约束:标记为CA(不可省略)

keyUsage = critical, digitalSignature, cRLSign, keyCertSign # 密钥用途:数字签名、CRL签名、证书签名

# -------------------------- 中间CA证书扩展属性(预留) --------------------------

[ v3_intermediate_ca ]

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer

basicConstraints = critical, CA:true, pathlen:0 # 核心约束:允许签发证书,但不能再签发下级CA(pathlen:0)

keyUsage = critical, digitalSignature, cRLSign, keyCertSign

crlDistributionPoints = URI:http://www.testpki.com/crl/root.ca.crl.pem # CRL查询地址(HTTP)

nameConstraints = critical, @permitted_names # 名称约束:仅允许签发.cn域名的证书

# -------------------------- 名称约束规则 --------------------------

[ permitted_names ]

DNS.0 = .cn  # 允许的DNS域名后缀(仅.cn)

EOF

        关键补充操作:创建证书序列号文件和 CRL 序列号文件(OpenSSL 依赖这两个文件生成证书 / CRL)。

[root@localhost ca]# echo "01" > serial  # 证书起始序列号(十六进制,后续递增)

[root@localhost ca]# echo "01" > crlnumber  # CRL起始序列号

. 生成根 CA 核心组件

4.1 生成根 CA 私钥

      实现目标:私钥是根 CA 的核心身份凭证,用于签名证书和 CRL,需加密存储防止泄露。

操作命令及参数解释如下:

[root@localhost ca]# openssl genrsa -aes256 -out private/root.ca.key.pem 4096

Enter PEM pass phrase:dubhe  # 私钥加密密码(自定义,需牢记,丢失无法恢复)

Verifying - Enter PEM pass phrase:dubhe

  • -aes256:用 AES-256 算法加密私钥(比 DES 更安全)
  • -out:指定私钥输出路径
  • 4096:私钥长度(推荐 4096 位,兼容主流设备)

权限验证

确保私钥仅所有者可读写:

[root@localhost ca]# ls -l private/root.ca.key.pem

-rw-------. 1 root root 3456 Nov 18 05:40 private/root.ca.key.pem  # 权限应为600

4.2 生成根 CA 自签名证书

      实现目标:根 CA 证书是信任链的起点,需自签名(无上级 CA 签发),有效期建议设置较长(如 20 年)。

操作命令及参数解释如下:

[root@localhost ca]# openssl req -config openssl.cnf -key private/root.ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/root.ca.cert.pem

Enter pass phrase for private/root.ca.key.pem:dubhe  # 输入私钥加密密码

  • -config:指定 OpenSSL 配置文件
  • -new:生成新的证书请求(CSR)
  • -x509:直接生成自签名证书(跳过 CSR 提交步骤,根 CA 专用)
  • -days 7300:证书有效期(7300 天≈20 年)
  • -extensions v3_ca:应用根 CA 扩展属性(标记为 CA 身份)
  • -out:指定证书输出路径

交互信息填写(示例):

You are about to be asked to enter information that will be incorporated into your certificate request.

-----

Country Name (2 letter code) []:CN  # 国家代码(固定为CN)

State or Province Name []:Chongqing  # 省/州(与配置文件策略匹配)

Locality Name []:Chongqing  # 城市(与配置文件策略匹配)

Organization Name []:DubheLjsec  # 组织名称(与配置文件策略匹配)

Organizational Unit Name []:IT  # 部门名称(可选)

Common Name []:www.testpki.com  # 通用名(必须为根CA关联域名)

证书验证:

      确认证书是否有效(查看证书详情):

[root@localhost ca]# openssl x509 -in certs/root.ca.cert.pem -text -noout

# 输出应包含“CA:TRUE”(确认CA身份)、有效期、密钥用途等信息

4.3 生成根 CA 证书吊销列表(CRL)

      实现目标:CRL 记录已吊销的证书信息,客户端通过 HTTP 查询 CRL,验证证书是否有效。

操作命令如下:

[root@localhost ca]# openssl ca -config openssl.cnf -gencrl -out crl/root.ca.crl.pem

Using configuration from openssl.cnf

Enter pass phrase for /root/ca/private/root.ca.key.pem:dubhe  # 输入私钥加密密码

CRL 验证:

      查看 CRL 内容(初始无吊销证书,仅包含 CRL 有效期等信息):

[root@localhost ca]# openssl crl -in crl/root.ca.crl.pem -text -noout

# 输出应包含“Next Update”(下次更新时间,当前+30天)

. 部署 Nginx 提供 HTTP CRL 服务

5.1 安装 Nginx

操作命令如下:

[root@localhost ca]# dnf install nginx -y

  • 自动安装依赖包:centos-logos-httpd(HTTP 图标资源)、nginx-core(Nginx 核心组件)、nginx-filesystem(Nginx 目录结构)

5.2 配置 CRL 文件访问路径

      实现目标:将 CRL 文件放到 Nginx 的 Web 根目录,确保客户端可通过http://www.testpki.com/crl/root.ca.crl.pem访问。

操作命令如下:

# 创建CRL访问目录

[root@localhost ca]# mkdir -p /usr/share/nginx/html/crl

# 复制CRL文件到Web目录(保持文件权限可读取)

[root@localhost ca]# cp crl/root.ca.crl.pem /usr/share/nginx/html/crl/

# 确保Nginx可读取CRL文件

[root@localhost ca]# chmod 644 /usr/share/nginx/html/crl/root.ca.crl.pem

5.3 启动 Nginx 并设置开机自启

操作命令如下:

# 启动Nginx服务

[root@localhost ca]# systemctl start nginx

# 设置开机自启(避免服务器重启后服务失效)

[root@localhost ca]# systemctl enable nginx --now

# 验证Nginx状态

[root@localhost ca]# systemctl status nginx

# 输出应包含“active (running)”表示服务正常

5.4 开放防火墙 HTTP 端口

       实现目标:允许外部客户端通过 HTTP(80 端口)访问 Nginx 服务。

操作命令如下:

# 永久开放HTTP服务(80端口)

[root@localhost ca]# firewall-cmd --permanent --add-service=http

# 返回结果:success

# 重新加载防火墙规则(使配置生效)

[root@localhost ca]# firewall-cmd --reload

# 返回结果:success

# 验证防火墙规则

[root@localhost ca]# firewall-cmd --list-services

# 输出应包含“http”

. 在 pfSense 中配置 DNS 解析

      实现目标:将www.testpki.com域名解析到根 CA 服务器的 IP(22.33.44.55),确保客户端能通过域名访问 CRL。

6.1 操作步骤(基于 pfSense 界面)

(1) 登录 pfSense 管理界面

       通过天枢一体化虚拟仿真靶场平台Internet区域的WIN 访问pfSense 的 Web 管理地址(如https://3.4.5.1),输入管理员账号密码登录。

(2) 进入 DNS 解析器配置

       点击顶部菜单 Services > DNS Resolver > General,确认 “Enable DNS resolver” 已勾选(启用 DNS 解析功能),“Listen Port” 保持默认53

(3) 添加 Host Override(域名映射)

            点击 Host Overrides 下方的 Add 按钮,进入 “Edit Host Override” 页面。

        填写配置项:

配置项

填写内容

说明

Host

WWW

主机名(域名前缀)

Domain

testpki.com

父域名(与根 CA 的 CN 一致)

IP Address

22.33.44.55

根 CA 服务器的 IP 地址

Description

Root CA CRL DNS Mapping

备注(便于管理)

        点击 Save 保存配置,再点击页面顶部的 Apply Changes 使配置生效。

. 验证 CRL HTTP 访问功能

7.1 本地验证(根 CA 服务器上)

# 使用curl访问CRL(验证Nginx配置)

[root@localhost ca]# curl http://localhost/crl/root.ca.crl.pem

# 输出应为CRL文件的PEM格式内容(以“-----BEGIN X509 CRL-----”开头)

7.2 客户端验证(需在 pfSense 管理的网络内)

  1. 确保客户端已通过 pfSense 获取 DNS(或手动设置 DNS 为 pfSense 的 IP)。
  2. 在客户端浏览器或终端访问:http://www.testpki.com/crl/root.ca.crl.pem
    • 成功:下载或显示 CRL 文件的 PEM 内容。
    • 失败:检查 DNS 解析(ping www.testpki.com是否返回22.33.44.55)、防火墙规则、Nginx 状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值