Debian OpenSSL CA 证书配置参考:根证书、服务证书与验证

Debian OpenSSL CA 证书配置参考:根证书、服务证书与验证

1. 服务介绍

OpenSSL CA 用于在内网签发和管理数字证书。搭建 CA 后,可以为 Apache、Nginx、LDAP、邮件、VPN 等 TLS 服务签发证书;客户端导入 CA 根证书后,就能验证服务端证书是否由受信任机构签发。

本文提供一套 Debian 环境下的 CA 快速配置参考,覆盖 OpenSSL 安装、CA 目录初始化、根密钥和根证书生成、服务端私钥与 CSR 生成、服务证书签发以及证书验证。

2. 准备运行环境

• 操作系统:Debian 系 Linux,使用 apt 安装软件包。

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

• 软件包:opensslca-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 BeforeNot After 覆盖当前系统时间。

• 客户端信任库包含 CA 根证书。

• TLS 客户端验证结果为 Verify return code: 0 (ok)

6. 常见问题

• **客户端不信任**:把 CA 根证书导入客户端信任库,再执行系统证书更新命令。

• **域名不匹配**:检查 SAN,不要只依赖 CN;访问名称变化时重新生成 CSR 和服务证书。

• **证书过期或尚未生效**:检查服务端、客户端时间和证书有效期。

• **CA 签发失败**:检查 CA 配置中的目录、索引、序列号和私钥路径,不要随意删除数据库文件。

• **私钥泄露**:立即停止继续使用受影响 CA 或服务证书,按组织证书应急流程重新生成密钥和证书。

相关推荐
闲云野鹤在人间3 小时前
OpenStack架构介绍和安装流程
linux·网络·架构·openstack
我命由我123453 小时前
Linux - Linux/POSIX 路径斜杠折叠规则
linux·运维·服务器·android studio·android jetpack·android-studio·android runtime
xx~t4 小时前
嵌入式——Linux软件编程——网络1
linux·c语言·网络·vscode·网络协议
Uncertainty!!4 小时前
Linux 主机无法完成校园网认证排查记录:从 DHCP、ARP 到 Portal 认证流程分析
linux·运维·服务器
神威难绷泪5 小时前
Linux消息队列 & 共享内存 笔记
linux·消息队列·共享内存
mounter6255 小时前
突破零停机演进:Linux 内核 Live Update Orchestrator (LUO) 架构设计与热升级演进
linux·服务器·linux kernel·kernel·kho·luo
波多利希最高礼仪的握力器5 小时前
安全复制SCP
linux·服务器·安全
xiaoye-duck5 小时前
《Linux网络编程·加餐》进程间关系与守护进程
linux·网络
GeW5 小时前
RHCE高频考题精讲,精准突击快速拿证
linux
MyFreeIT6 小时前
Let‘s Encrypt SSL 製作免費證書
网络协议·https·ssl