Debian OpenSSL 搭建 CA 证书服务:签发、吊销与客户端信任

Debian OpenSSL 搭建 CA 证书服务:签发、吊销与客户端信任

1. 服务介绍

CA(Certificate Authority,证书颁发机构)用于签发、验证和吊销数字证书。企业内网可以用自建 CA 为 HTTPS、LDAPS、SMTPS、VPN、域控及其他 TLS 服务签发证书,避免每台服务都依赖外部证书。客户端导入 CA 根证书后,便可验证由该 CA 签发的服务证书。

本文以 Debian 环境为例,完成 OpenSSL CA 初始化、生成根证书、签发服务证书、查看证书、吊销证书、生成吊销列表(CRL)和客户端信任配置。

2. 准备运行环境

• 操作系统:Debian 系 Linux,实验命令按 Debian 的 apt 方式执行。

• 操作账号:root,或具备 sudo 权限的管理员账号。

• 软件包:opensslca-certificates

• 网络条件:CA 服务器、证书使用服务器和客户端之间网络可达;客户端 DNS、系统时间正常。

• 实验角色:CA 服务器负责签发和吊销证书,服务端生成私钥与 CSR,客户端导入 CA 根证书。

• 文件约定:本文使用 /CA 保存 CA 数据,使用 /tmp/tls-lab 保存服务端申请文件;生产环境应使用权限更严格的目录。

安装前确认系统版本和软件源:

bash 复制代码
cat /etc/os-release
apt-get update
apt-get install -y openssl ca-certificates
openssl version -a

3. 相关知识

• **证书链**:客户端通常需要信任根证书;服务端证书中的 Issuer 应指向签发它的 CA,存在中间 CA 时还要正确提供中间证书。

• **私钥保护**:CA 私钥可以签发证书,权限应限制为 CA 管理账号可读,不能上传到公开仓库或直接发给客户端。

• **有效期与系统时间**:证书校验依赖客户端和服务端时间。时间偏差、证书过期或尚未生效,都会导致 TLS 校验失败。

• **SAN 优先**:现代客户端主要校验证书的 Subject Alternative Name(SAN),不能只填写 CN。为域名和 IP 使用证书时,应把实际访问名称写入 SAN。

• **序列号和索引**:CA 使用 serial 分配证书序列号,index.txt 记录已签发证书。删除或手工修改这些文件,可能导致后续签发和吊销失败。

• **吊销与 CRL**:吊销证书后,需要重新生成 CRL,并让使用方能获取或加载最新 CRL;仅执行吊销命令,不代表所有客户端立即完成吊销检查。

• **配置文件路径**:Debian 默认配置常见于 /etc/ssl/openssl.cnf。复制到 /CA/openssl.cnf 后,应同步检查 [ CA_default ] 中的 dirdatabasecertificateprivate_key 等路径。

4. 实验步骤

4.1 初始化 CA 目录

创建 CA 数据目录、索引文件和序列号文件:

bash 复制代码
mkdir -p /CA/{certs,crl,newcerts,private,csr}
touch /CA/index.txt
echo 1000 > /CA/serial
echo 1000 > /CA/crlnumber
chmod 700 /CA/private
cp -f /etc/ssl/openssl.cnf /CA/openssl.cnf

修改配置文件中的 CA 路径,使配置与实验目录一致:

bash 复制代码
vim /CA/openssl.cnf

4.2 设置 CA 路径和基础文件

检查 CA 配置中以下路径是否指向 /CA

ini 复制代码
[ CA_default ]
dir             = /CA
database        = $dir/index.txt
new_certs_dir   = $dir/newcerts
certificate     = $dir/cacert.pem
serial          = $dir/serial
crlnumber       = $dir/crlnumber
crl             = $dir/crl.pem
private_key     = $dir/private/cakey.pem

再次确认 CA 数据目录和证书保存路径:

bash 复制代码
ls -ld /CA /CA/private /CA/newcerts
ls -l /CA/index.txt /CA/serial /CA/crlnumber

4.3 生成 CA 私钥和根证书

CA 私钥是整个信任链的核心。生成后限制文件权限:

bash 复制代码
openssl genrsa -out /CA/private/cakey.pem 2048
chmod 600 /CA/private/cakey.pem

使用 CA 私钥生成自签名根证书。-days 3650 表示有效期约十年,生产环境应按安全策略设置:

bash 复制代码
openssl req -new -x509 \
  -key /CA/private/cakey.pem \
  -sha256 -days 3650 \
  -out /CA/cacert.pem \
  -config /CA/openssl.cnf

也可以在交互式命令中显式指定主题信息:

bash 复制代码
openssl req -new -x509 \
  -key /CA/private/cakey.pem \
  -out /CA/cacert.pem \
  -days 3650 -sha256

检查根证书文件和权限:

bash 复制代码
ls -l /CA/cacert.pem /CA/private/cakey.pem
openssl x509 -in /CA/cacert.pem -noout -subject -issuer -dates

4.4 服务端生成私钥和证书申请文件

在服务端创建申请目录,私钥只保留在服务端:

bash 复制代码
mkdir -p /tmp/tls-lab
cd /tmp/tls-lab
openssl genrsa -out server.key 2048
chmod 600 server.key

生成 CSR。CN 应填写主要访问名称,生产环境还应在配置中加入 SAN:

bash 复制代码
openssl req -new \
  -key server.key \
  -out server.csr \
  -config /CA/openssl.cnf

也可以直接指定主题,适合实验环境快速生成:

bash 复制代码
openssl req -new -key server.key -out server.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=Example/OU=IT/CN=server.example.com"

CA 与服务端申请信息应按实验要求填写。若国家、组织或域名不同,应检查 OpenSSL 配置中的默认值和 SAN 配置:

bash 复制代码
openssl req -in server.csr -noout -subject -text

4.5 CA 签发服务端证书

server.csr 传到 CA 服务器后,在 CA 服务器执行签名。实验环境可使用 openssl x509

bash 复制代码
openssl x509 -req -in /tmp/tls-lab/server.csr \
  -CA /CA/cacert.pem \
  -CAkey /CA/private/cakey.pem \
  -CAcreateserial \
  -out /tmp/tls-lab/server.crt \
  -days 365 -sha256

若需要由 CA 索引文件统一管理签发记录,可使用 openssl ca

bash 复制代码
openssl ca -config /CA/openssl.cnf \
  -in /tmp/tls-lab/server.csr \
  -out /tmp/tls-lab/server.crt \
  -days 365 -batch

签发完成后,将 server.crt 和 CA 根证书分别放到服务端、客户端要求的位置;服务端私钥不能随证书申请文件一起公开分发:

bash 复制代码
cp /tmp/tls-lab/server.crt /etc/ssl/certs/server.crt
cp /CA/cacert.pem /etc/ssl/certs/ca-cert.pem
chmod 644 /etc/ssl/certs/server.crt /etc/ssl/certs/ca-cert.pem

4.6 查看证书详细信息

查看证书主题、签发者、有效期、序列号和扩展项:

bash 复制代码
openssl x509 -in /tmp/tls-lab/server.crt -noout -text
openssl x509 -in /tmp/tls-lab/server.crt \
  -noout -serial -subject -issuer -dates

4.7 吊销证书并生成 CRL

确认需要吊销的证书序列号,再执行吊销操作。先备份 CA 索引文件:

bash 复制代码
cp -a /CA/index.txt /CA/index.txt.bak
openssl ca -config /CA/openssl.cnf \
  -revoke /tmp/tls-lab/server.crt

吊销前查看证书内容,核对主题和序列号,避免吊销错误证书:

bash 复制代码
openssl x509 -in /tmp/tls-lab/server.crt \
  -noout -serial -subject -issuer

生成最新 CRL:

bash 复制代码
openssl ca -config /CA/openssl.cnf \
  -gencrl -out /CA/crl.pem
chmod 644 /CA/crl.pem

查看已吊销证书:

bash 复制代码
openssl crl -in /CA/crl.pem -noout -text

4.8 配置客户端信任 CA

把 CA 根证书复制到客户端的信任目录。Debian 系客户端执行以下命令:

bash 复制代码
cp /path/to/cacert.pem /usr/local/share/ca-certificates/lab-ca.crt
update-ca-certificates

确认系统信任库已生成 CA 链接:

bash 复制代码
ls -l /etc/ssl/certs | grep lab-ca
openssl verify -CApath /etc/ssl/certs /tmp/tls-lab/server.crt

5. 验证结果

按 CA、证书链和实际 TLS 服务分别验证:

bash 复制代码
openssl x509 -in /CA/cacert.pem -noout -text
openssl x509 -in /tmp/tls-lab/server.crt \
  -noout -dates -issuer -subject
openssl verify -CAfile /CA/cacert.pem /tmp/tls-lab/server.crt
openssl crl -in /CA/crl.pem -noout -text

如果证书链验证成功,说明签发关系正确;如果服务已启用 TLS,再从客户端检查服务端实际返回的证书:

bash 复制代码
openssl s_client -connect 127.0.0.1:443 \
  -servername server.example.com \
  -CAfile /etc/ssl/certs/ca-certificates.crt \
  </dev/null 2>/dev/null | grep -E "Verify return code|subject=|issuer="

重点检查:

Verify return code: 0 (ok)

• 证书 Not BeforeNot After 覆盖当前时间。

subjectAltName 包含客户端实际访问的域名或 IP。

issuer 指向预期 CA,客户端信任库包含 CA 根证书。

• 吊销后的证书已出现在 CRL,服务和客户端按策略加载最新吊销列表。

6. 常见问题

unable to get local issuer certificate:客户端缺少根证书或中间证书,先检查信任库和服务端证书链。

certificate verify failed:检查系统时间、证书有效期、域名/SAN 和 CA 文件路径。

openssl ca 报数据库或序列号错误:检查 /CA/index.txt/CA/serial/CA/crlnumber,不要随意删除生产 CA 数据。

• 私钥权限过宽:将 CA 私钥和服务端私钥权限收紧,并限制备份文件访问范围。

相关推荐
老当益壮梁奶奶2 小时前
Linux软件编程学习笔记(九):消息队列、共享内存与信号灯详解
linux·c语言·笔记·学习
小雪崩2 小时前
嵌入式学习 day35:进程间通信-消息队列、共享空间及有名信号量
linux·c语言·学习
从零开始的嵌入式之旅3 小时前
day33
linux·c语言·经验分享·笔记·嵌入式硬件
qetfw3 小时前
Debian lftp FTP 客户端使用:登录、目录切换与文件传输
linux·运维·debian
神威难绷泪3 小时前
Linux应用软件编程:线程分离属性 互斥机制 同步机制 死锁
linux·开发语言·算法·线程
2401_862880823 小时前
Linux应用层开发 --- 管道
linux·运维·c语言
NJCloud3 小时前
OpenStack(四)——进阶篇之私有网络配置与块存储服务(Cinder)部署
linux·网络·云计算·openstack
raindayinrain3 小时前
深入理解Linux内核--ext文件系统,open/write/read/close执行流程,性能优化
linux·性能优化·文件系统·文件系统调用
jing.wang_20254 小时前
制作一个带用户操作界面的精简Linux操作系统
linux·服务器
沫璃染墨4 小时前
《从零入门Linux系统篇(三十二):文件篇·五——深入理解磁盘:从物理结构到LBA寻址》
linux·运维·服务器·系统架构·硬件架构