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

相关推荐
梓沂2 小时前
CentOS 7.9 静默安装 Oracle 11gR2 企业版全记录
linux·oracle·centos
蜀道山老天师2 小时前
Zabbix监控Docker容器应用实践完整指南
linux·运维·docker·容器·zabbix
hweiyu002 小时前
Linux命令:info
linux·运维
wsad05323 小时前
CentOS Stream 10 Docker 容器无法访问外网:xt_addrtype 内核模块缺失解决方法
linux·网络·docker·云原生·eureka·centos
x17388062733 小时前
Linux
linux
加油码3 小时前
探秘 volatile关键字:编译器的过度优化
linux·bug·信号处理
聚美智数4 小时前
SSL证书信息查询-SSL域名解析-SSL证书查询服务-SSL证书解析服务API接口介绍
网络·网络协议·ssl
不会就选b4 小时前
Linux之线程(二)
linux·运维·服务器
冰夏之夜影4 小时前
【解决方案】SpringBoot项目添加ssl证书后不生效问题
spring boot·后端·ssl