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 权限的管理员账号。

• 软件包: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 或服务证书,按组织证书应急流程重新生成密钥和证书。

相关推荐
蹊黎14 分钟前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
牛马鸡niumasi2 小时前
【Linux】C语言文件操作
linux
say_fall2 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
wacsii3 小时前
【Linux进程(一)】Linux 进程初探:操作系统如何管理进程?fork() 为什么返回两次?
linux·运维·服务器
AI+程序员在路上3 小时前
RV1126B 上支持的模型及全流程应用--从CNN及语音到 LLMVLM 与跨平台选型
linux·c语言·人工智能
默|笙3 小时前
【Linux网络】传输层协议TCP(1)---TCP报文介绍
linux·网络·tcp/ip
相思难忘成疾3 小时前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
用户4107192013253 小时前
用 systemd 从零做一个系统健康巡检服务:脚本、沙箱与磁盘满排查实战
linux·ubuntu
GeW4 小时前
新质生产力路线图下,Linux 和数据库不能拆成两件事做
linux
云和数据.ChenGuang4 小时前
Python 闭包详解:从原理到实战
linux·开发语言·人工智能·python·kubernetes