背景介绍

在自动化证书管理场景中,acme.sh生成的证书文件通常分散存放(私钥.key和证书.crt分离),这给Nginx/Apache等服务的配置带来不便。更关键的是,私钥文件若未经加密直接存储,可能因服务器入侵导致重大安全风险。合并并加密存储可实现:

  • 单文件部署简化配置
  • 符合PCI DSS等安全规范对密钥保护的要求
  • 便于版本控制和自动化脚本处理

证书管理流程

技术方案对比

直接合并方案

cat domain.key domain.crt > combined.pem
- 优点:处理速度快 - 缺点:私钥明文存储,存在泄露风险

加密合并方案

openssl aes-256-cbc -salt -in combined.pem -out secured.pem -kfile password.txt
- 优点:符合安全审计要求 - 缺点:部署时需解密步骤

核心实现流程

1. 基础环境准备

  1. 确认已安装acme.sh和openssl
  2. 创建专用工作目录:
    mkdir -p /etc/ssl/processed_certs && chmod 700 /etc/ssl/processed_certs

2. 自动化处理脚本

#!/bin/bash
# 合并加密脚本 cert_processor.sh

DOMAIN="example.com"
CERT_DIR="/etc/ssl/acme"
OUTPUT_DIR="/etc/ssl/processed_certs"
PASSWORD_FILE="/root/cert_password.key"  # 建议单独设置权限400

# 生成随机密码(首次运行)
if [ ! -f "$PASSWORD_FILE" ]; then
  openssl rand -base64 32 > $PASSWORD_FILE
  chmod 400 $PASSWORD_FILE
fi

# 合并证书链(包含中间证书)
cat $CERT_DIR/$DOMAIN/$DOMAIN.key \
    $CERT_DIR/$DOMAIN/fullchain.cer > $OUTPUT_DIR/$DOMAIN-combined.pem

# AES-256加密(PBKDF2密钥派生)
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 100000 \
    -in $OUTPUT_DIR/$DOMAIN-combined.pem \
    -out $OUTPUT_DIR/$DOMAIN-secured.pem \
    -pass file:$PASSWORD_FILE

# 设置严格权限
chmod 600 $OUTPUT_DIR/$DOMAIN-*

3. 关键安全参数解析

  • -pbkdf2:使用Password-Based Key Derivation Function 2
  • -iter 100000:增加暴力破解难度
  • -salt:防止相同密码生成相同密文

加密过程示意图

生产环境建议

文件权限管理

  1. 私钥密码文件设置为root只读

    chown root:root /root/cert_password.key
    chmod 400 /root/cert_password.key
  2. 加密证书存储目录限制访问:

    setfacl -Rm u:nginx:r-x /etc/ssl/processed_certs

密钥轮换策略

  • 每月更换加密密码
  • 通过acme.sh hook自动触发处理脚本:
    acme.sh --install-cert -d $DOMAIN \
      --reloadcmd "/path/to/cert_processor.sh"

性能测试数据

| 算法 | 文件大小 | 加密时间 | 解密时间 | |------|---------|---------|---------| | aes-256-cbc | 4.2KB | 0.12s | 0.15s | | aes-256-gcm | 4.2KB | 0.14s | 0.13s | | chacha20 | 4.2KB | 0.08s | 0.09s |

安全警示

  1. 绝对避免将密码文件与证书同目录存储
  2. 解密操作后应立即删除临时文件:
    openssl enc -d ... > /tmp/temp.pem && \
    mv /tmp/temp.pem /etc/nginx/ssl/ && \
    shred -u /tmp/temp.pem
  3. 禁用弱加密算法(如des3)

进阶思考

  1. 如何实现加密证书的自动解密加载?考虑使用HSM或TPM的情况
  2. 在多服务器环境中,如何安全分发加密密码?
  3. 当acme.sh的DNS验证方式不可用时,有哪些替代方案能保证自动化流程不中断?

通过这套方案,我们实现了证书从申请到安全存储的全流程自动化,既方便了服务配置,又满足了企业级安全要求。实际部署时建议结合具体业务场景调整加密策略和权限模型。

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐