使用Nginx中配置CRL 在Nginx中配置证书吊销列表CRL, Certificate Revocation List主要用于‌双向 TLS 认证mTLS‌场景以验证客户端证书是否已被证书颁发机构CA吊销。以下是完整的配置指南、格式要求及自动化更新方案。1. 核心前提与注意事项‌仅用于客户端验证‌ssl_crl 指令仅在校验‌客户端证书‌时生效必须配合 ssl_verify_client on 使用。它‌不‌用于检查 Nginx 自身服务器证书的吊销状态服务器证书吊销请使用 OCSP Stapling。格式要求‌Nginx 仅支持 ‌PEM 格式‌的 CRL 文件。如果 CA 提供的是 DER 格式必须转换。有效期检查‌CRL 文件包含 Next Update 字段。如果当前时间超过该时间Nginx 将认为 CRL 过期并拒绝加载或报错。因此必须定期更新。证书链完整性‌如果客户端证书由中间 CA 签发CRL 文件通常需要包含根 CA 和所有相关中间 CA 的吊销列表合并后的内容或者启用 ssl_crl_check allNginx 1.19.4来检查整条链。2. CRL文件准备2.1 获取 CRL从 CA 提供的“CRL 分发点CRL Distribution Points”URL 下载 CRL 文件。通常可以通过浏览器访问该 URL 或使用 wget/curl 下载。2.2 格式转换DER 转 PEM大多数 CA 发布的 CRL 默认为 DER 二进制格式需转换为 PEM 文本格式openssl crl-informDER-inca.crl.der-outformPEM-outca.crl.pem2.3 合并多个 CRL如有必要如果证书链涉及根 CA 和中间 CA且它们分别发布 CRL需要将它们合并到一个文件中catroot-ca.crl.pem intermediate-ca.crl.pemcombined.crl.pem2.4 权限设置确保 Nginx 工作进程用户如 www-data 或 nginx有读取权限chmod644/etc/nginx/ssl/ca.crl.pemchownroot:root /etc/nginx/ssl/ca.crl.pem# 根据实际运行用户调整3. Nginx 配置示例在 nginx.conf 的 http 块或具体的 server 块中添加以下配置server{listen443ssl;server_name example.com;# 服务器自身的证书和私钥ssl_certificate /etc/nginx/ssl/server.crt;ssl_certificate_key /etc/nginx/ssl/server.key;# --- 双向认证与 CRL 配置开始 ---# 1. 指定信任的 CA 证书用于验证客户端证书签名# 必须包含签发客户端证书的根 CA 和中间 CA 公钥ssl_client_certificate /etc/nginx/ssl/ca-bundle.pem;# 2. 启用客户端证书验证# on: 强制要求客户端提供证书optional: 可选提供ssl_verify_client on;# 3. 指定 CRL 文件路径必须是绝对路径PEM格式ssl_crl /etc/nginx/ssl/ca.crl.pem;# 4. (可选) 设置验证深度# 默认为1。如果客户端证书经过中间CA签发建议设置为2或更大ssl_verify_depth2;# 5. (可选, Nginx 1.19.4) 检查证书链中所有层级的吊销状态# 默认只检查叶子节点(客户端证书)启用all可检查中间CA是否也被吊销# ssl_crl_check all;# --- 双向认证与 CRL 配置结束 ---location /{root /usr/share/nginx/html;index index.html;# 可选根据验证结果返回不同信息# $ssl_client_verify 变量值: SUCCESS, FAILED, NONEadd_header X-Client-Verify$ssl_client_verify;}}4. 自动化更新 CRL由于 CRL 有过期时间必须定期更新。Nginx 不会自动联网拉取最新的 CRL需通过脚本 Cron 实现。4.1 创建更新脚本 (update_crl.sh)#!/bin/bash# 配置变量CRL_URLhttp://ca.example.com/intermediate.crl# 替换为实际的CRL分发点URLCRL_FILE/etc/nginx/ssl/ca.crl.pemTEMP_FILE/tmp/ca.crl.tmpNGINX_USERwww-data# 替换为你的nginx运行用户# 1. 下载最新的 CRL (假设是DER格式如果是PEM则去掉转换步骤)wget-q-O/tmp/ca.crl.der$CRL_URLif[$?-ne0];thenechoFailed to download CRLexit1fi# 2. 转换为 PEM 格式openssl crl-informDER-in/tmp/ca.crl.der-outformPEM-out$TEMP_FILEif[$?-ne0];thenechoFailed to convert CRL formatexit1fi# 3. 验证 CRL 是否过期 (可选但推荐)NEXT_UPDATE$(openssl crl-in$TEMP_FILE-noout-nextupdate|cut-d-f2)if[-z$NEXT_UPDATE];thenechoInvalid CRL fileexit1fi# 简单比较日期如果过期则不替换if[[$(date-d$NEXT_UPDATE%s)-lt$(date%s)]];thenechoCRL is expired, not updatingexit1fi# 4. 原子替换文件 (避免Nginx读取到半写文件)mv$TEMP_FILE$CRL_FILE# 5. 设置权限chown$NGINX_USER:$NGINX_USER$CRL_FILEchmod644$CRL_FILE# 6. 平滑重载 Nginx# 注意对于较新版本的Nginx如果只是替换文件内容通常不需要reload# 新的连接握手时会重新读取文件。但为了保险起见或旧版本建议发送reload信号。nginx-sreloadechoCRL updated successfully4.2 设置定时任务 (Cron)编辑 crontab (crontab -e)例如每小时更新一次0* * * * /path/to/update_crl.sh/var/log/crl_update.log215. 验证配置‌测试配置语法‌nginx-t如果 CRL 文件路径错误、格式不对或已过期这里会报错。‌重载 Nginx‌systemctl reload nginx‌功能测试‌‌有效证书‌使用未被吊销的客户端证书访问应正常建立连接。吊销证书‌使用已在 CRL 中的客户端证书访问TLS 握手应失败客户端通常收到 SSL_ERROR_REVOKED_CERT_ALERT 或 HTTP 400/495 错误。查看日志‌检查 /var/log/nginx/error.log若验证失败通常会看到类似 client certificate verify error: (XX:certificate revoked) 的记录。