Debian OpenSSL CA 证书配置参考:根证书、服务证书与验证
1. 服务介绍
OpenSSL CA 用于在内网签发和管理数字证书。搭建 CA 后,可以为 Apache、Nginx、LDAP、邮件、VPN 等 TLS 服务签发证书;客户端导入 CA 根证书后,就能验证服务端证书是否由受信任机构签发。
本文提供一套 Debian 环境下的 CA 快速配置参考,覆盖 OpenSSL 安装、CA 目录初始化、根密钥和根证书生成、服务端私钥与 CSR 生成、服务证书签发以及证书验证。
2. 准备运行环境
• 操作系统:Debian 系 Linux,使用 apt 安装软件包。
• 操作账号:root,或具备 sudo 权限的管理员账号。
• 软件包:openssl、ca-certificates。
• 网络条件:CA 服务器、服务端和客户端之间网络可达,DNS 与网关配置正确。
• 时间条件:所有主机使用正确系统时间,建议启用 NTP;证书校验依赖时间。
• 实验目录:本文使用 /CA 保存 CA 数据,使用 /tmp/ca-lab 保存服务端申请文件。
先检查系统和 OpenSSL 版本:
bash
cat /etc/os-release
apt-get update
apt-get install -y openssl ca-certificates
openssl version
3. 相关知识
• **根证书与服务证书**:根证书是客户端信任的起点,服务端使用由 CA 签发的服务证书;两者不能混淆。
• **私钥与 CSR**:私钥只留在生成它的主机,CSR 可以发送给 CA,CSR 本身不包含私钥。
• **证书主题**:CN 是常见名称,但现代客户端优先校验 SAN;域名或 IP 发生变化时,应重新申请包含正确 SAN 的证书。
• **证书有效期**:证书过期、尚未生效或系统时间错误,都会导致 TLS 验证失败。
• **CA 配置文件**:修改配置前先备份,重点检查 CA 数据目录、索引文件、序列号文件、根证书和私钥路径。
• **权限控制**:CA 私钥和服务端私钥应设置为仅管理员可读;不要把私钥放进公开仓库或上传到不可信平台。
• **证书链**:服务端启用中间 CA 时,需要按服务要求配置完整证书链;客户端只信任根证书时,服务端应正确发送中间证书。
4. 实验步骤
4.1 安装 OpenSSL
安装证书工具并确认命令可用:
bash
apt-get update
apt-get install -y openssl ca-certificates
openssl version -a

确认安装结果:
bash
dpkg -l openssl ca-certificates
command -v openssl

4.2 准备 OpenSSL 配置
复制配置文件,避免直接破坏系统默认配置:
bash
cp -a /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.bak
cp -a /etc/ssl/openssl.cnf /CA-openssl.cnf
vim /CA-openssl.cnf

配置 CA 目录和数据库路径。实际配置中应保证目录、索引文件和序列号文件已经存在:
ini
[ CA_default ]
dir = /CA
database = $dir/index.txt
new_certs_dir = $dir/newcerts
certificate = $dir/cacert.pem
serial = $dir/serial
private_key = $dir/private/cakey.pem


4.3 初始化 CA 目录
创建证书、吊销列表、私钥和数据库目录:
bash
mkdir -p /CA/{certs,crl,newcerts,private,csr}
touch /CA/index.txt
echo 01 > /CA/serial
echo 01 > /CA/crlnumber
chmod 700 /CA/private

检查目录和初始化文件:
bash
cd /CA
find . -maxdepth 2 -type f -o -type d
ls -l index.txt serial crlnumber

4.4 生成 CA 根密钥和根证书
进入 CA 目录,生成 CA 私钥并限制权限:
bash
cd /CA
openssl genrsa -out private/cakey.pem 2048
chmod 600 private/cakey.pem

使用 CA 私钥生成自签名根证书。实验环境可以使用十年有效期,生产环境应按安全策略设置:
bash
openssl req -new -x509 \
-key private/cakey.pem \
-out cacert.pem \
-days 3650 -sha256 \
-config /CA-openssl.cnf

查看根证书主题和有效期:
bash
openssl x509 -in /CA/cacert.pem -noout -text
openssl x509 -in /CA/cacert.pem -noout -subject -issuer -dates

4.5 服务端生成私钥和证书申请
服务端创建申请目录并生成私钥:
bash
mkdir -p /tmp/ca-lab
cd /tmp/ca-lab
openssl genrsa -out server.key 2048
chmod 600 server.key

生成证书签名请求。交互式输入时,服务名称应与实际访问名称一致:
bash
openssl req -new \
-key server.key \
-out server.csr \
-config /CA-openssl.cnf

在 CA 服务器上签发服务证书:
bash
openssl x509 -req \
-in /tmp/ca-lab/server.csr \
-CA /CA/cacert.pem \
-CAkey /CA/private/cakey.pem \
-CAcreateserial \
-out /tmp/ca-lab/server.crt \
-days 365 -sha256

证书签发完成后,只把服务证书和 CA 根证书部署到需要使用它们的位置,服务端私钥继续留在服务端:
bash
ls -l /tmp/ca-lab/server.key /tmp/ca-lab/server.csr /tmp/ca-lab/server.crt
cp /tmp/ca-lab/server.crt /etc/ssl/certs/server.crt
cp /CA/cacert.pem /etc/ssl/certs/lab-ca.crt

5. 验证结果
检查 CA 根证书和服务端证书:
bash
openssl x509 -in /CA/cacert.pem -noout -subject -issuer -dates
openssl x509 -in /tmp/ca-lab/server.crt -noout -subject -issuer -dates
openssl verify -CAfile /CA/cacert.pem /tmp/ca-lab/server.crt
如果命令返回 OK,说明服务端证书由指定 CA 签发且证书链可以验证。TLS 服务已经监听时,从客户端检查实际返回证书:
bash
openssl s_client -connect 127.0.0.1:443 \
-servername server.example.com \
-CAfile /etc/ssl/certs/ca-certificates.crt \
</dev/null
重点检查:
• 证书 subject 和 SAN 与实际访问域名或 IP 一致。
• issuer 指向预期 CA。
• Not Before、Not After 覆盖当前系统时间。
• 客户端信任库包含 CA 根证书。
• TLS 客户端验证结果为 Verify return code: 0 (ok)。
6. 常见问题
• **客户端不信任**:把 CA 根证书导入客户端信任库,再执行系统证书更新命令。
• **域名不匹配**:检查 SAN,不要只依赖 CN;访问名称变化时重新生成 CSR 和服务证书。
• **证书过期或尚未生效**:检查服务端、客户端时间和证书有效期。
• **CA 签发失败**:检查 CA 配置中的目录、索引、序列号和私钥路径,不要随意删除数据库文件。
• **私钥泄露**:立即停止继续使用受影响 CA 或服务证书,按组织证书应急流程重新生成密钥和证书。