OpenSSL.sh - 自签名 SSL 证书生成脚本

温馨提醒
总结摘要
OpenSSL.sh 是一个用于生成自签名 SSL 证书的 Shell 脚本,支持自定义域名、IP 地址、加密位数等参数,可创建 CA 证书和服务端证书,适用于测试环境和内部服务。

OpenSSL.sh - 自签名 SSL 证书生成脚本

脚本功能

OpenSSL.sh 是一个功能完整的自签名 SSL 证书生成脚本,使用 OpenSSL工具创建CA证书和服务端SSL证书。支持多域名、多 IP 地址的扩展证书生成,适用于测试环境、开发环境和内部服务。

核心特性

  • 自动生成 CA(证书颁发机构)证书
  • 生成服务端 SSL 证书并由 CA 签名
  • 支持多域名和多 IP 地址的 SAN(主题备用名称)扩展
  • 自定义加密位数(默认 2048 位)
  • 灵活的证书有效期设置
  • 支持 CA 证书和密钥的复用与重新创建
  • 自动输出 YAML格式证书内容便于复制
  • 生成标准命名的 tls.key和tls.crt文件

脚本依赖

系统工具依赖

  • openssl:OpenSSL工具包(核心依赖)
  • bash:脚本运行环境
  • catsedecho:基础文本处理工具

可选工具

  • vim或其他编辑器:用于手动编辑 openssl.cnf配置文件

环境变量依赖

内置变量说明

脚本通过命令行参数传递配置,无需预设环境变量。主要参数包括:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
--ssl-domain        # 主域名(必填),如 www.test.com
--ssl-trusted-ip    # 受信任的 IP 地址列表,多个用逗号分隔
--ssl-trusted-domain # 额外的受信任域名,多个用逗号分隔
--ssl-size          # SSL 加密位数,默认 2048
--ssl-date          # SSL 证书有效期(天),默认 3650 天
--ca-date           # CA 证书有效期(天),默认 3650 天
--ssl-cn            # 国家代码,默认 CN(中国)
--ca-cert-recreate  # 是否重新创建 CA 证书,默认 false
--ca-key-recreate   # 是否重新创建 CA 私钥,默认 false
--ca-domain         # CA 证书的组织名称,默认'Shanghai Lieyue Information'

脚本内部默认配置

1
2
3
4
5
6
7
CA_DATE=${CA_DATE:-3650}              # CA 证书默认有效期 10 年
SSL_DATE=${SSL_DATE:-3650}            # SSL 证书默认有效期 10 年
SSL_SIZE=${SSL_SIZE:-2048}            # 默认 2048 位加密
CN=${CN:-CN}                          # 默认国家代码为中国
CA_KEY=${CA_KEY:-cakey.pem}           # CA 私钥文件名
CA_CERT=${CA_CERT:-cacerts.pem}       # CA 证书文件名
SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf}  # OpenSSL 配置文件路径

参数用法

使用方法

快速安装与使用

  1. 下载脚本

    1
    2
    3
    4
    5
    
    # 使用主下载地址
    bash <(curl -sL sc.eli1.top) OpenSSL download
    
    # 或使用备用地址
    bash <(curl -sL download.elisky.cn) OpenSSL download
  2. 赋予执行权限

    1
    
    chmod +x OpenSSL.sh
  3. 生成基础 SSL 证书

    1
    
    ./OpenSSL.sh --ssl-domain=www.test.com
  4. 生成完整配置的 SSL 证书

    1
    2
    3
    4
    5
    
    ./OpenSSL.sh --ssl-domain=www.test.com \
      --ssl-trusted-domain=www.test2.com,api.test.com \
      --ssl-trusted-ip=192.168.1.1,10.0.0.1 \
      --ssl-size=2048 \
      --ssl-date=3650

典型使用场景示例

场景 1:为 Kubernetes Ingress生成自签名证书

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 创建证书目录
mkdir -p /etc/kubernetes/pki/ingress
cd /etc/kubernetes/pki/ingress

# 生成证书
/path/to/OpenSSL.sh --ssl-domain=ingress.local \
  --ssl-trusted-ip=10.96.0.1 \
  --ssl-date=3650

# 证书文件已自动生成在当前目录
ls -la tls.* cacerts.pem cakey.pem

场景 2:为本地开发环境生成 HTTPS 证书

1
2
3
4
5
6
7
8
# 为本地开发域名生成证书
./OpenSSL.sh --ssl-domain=localhost \
  --ssl-trusted-ip=127.0.0.1 \
  --ssl-trusted-domain=dev.local,test.local \
  --ssl-size=2048

# 将证书添加到系统信任列表(以 macOS 为例)
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain cacerts.pem

场景 3:复用现有 CA 证书签发新证书

1
2
3
4
5
6
7
8
9
# 第一次创建 CA 证书
./OpenSSL.sh --ssl-domain=first.example.com \
  --ca-domain="My Organization"

# 后续签发新证书时复用 CA(不重新创建)
./OpenSSL.sh --ssl-domain=second.example.com \
  --ssl-trusted-domain=api.second.example.com \
  --ca-cert-recreate=false \
  --ca-key-recreate=false

场景 4:更新即将过期的 SSL 证书

1
2
3
4
5
# 当 CA 证书仍然有效,只需更新服务端证书
./OpenSSL.sh --ssl-domain=www.example.com \
  --ssl-date=365 \
  --ca-cert-recreate=false \
  --ca-key-recreate=false

场景 5:完全重新创建 CA 和证书

1
2
3
4
5
# 当私钥泄露或需要更换组织名称时
./OpenSSL.sh --ssl-domain=new.example.com \
  --ca-key-recreate=true \
  --ca-cert-recreate=true \
  --ca-domain="New Organization Name"

场景 6:生成高安全性证书

1
2
3
4
5
# 使用 4096 位加密,有效期 5 年
./OpenSSL.sh --ssl-domain=secure.example.com \
  --ssl-size=4096 \
  --ssl-date=1825 \
  --ssl-cn=US

生成的文件说明

脚本执行后会生成以下文件:

1
2
3
4
5
6
7
8
cakey.pem          # CA 私钥文件(重要!妥善保管)
cacerts.pem        # CA 证书文件(公开,可分发给客户端)
www.test.com.key   # 服务端私钥文件
www.test.com.csr   # 服务端证书签名请求
www.test.com.crt   # 服务端证书文件
openssl.cnf        # OpenSSL 配置文件
tls.key            # 服务端私钥的标准命名副本
tls.crt            # 服务端证书的标准命名副本(已附加 CA 证书)

证书文件用途

  • tls.key + tls.crt:直接用于 Nginx、Apache等Web服务器配置
  • cakey.pem + cacerts.pem:用于签署其他服务端证书
  • www.test.com.crt :未附加 CA 证书的纯服务端证书

实际应用场景

  • Kubernetes集群:为Ingress Controller生成自签名TLS证书,支持HTTPS访问
  • 本地开发环境:为localhost或自定义开发域名启用HTTPS,模拟生产环境
  • 内部服务部署:为企业内网服务、测试环境、预发布环境生成证书
  • 微服务架构:为服务间通信(mTLS)生成证书
  • 数据库加密连接:为MySQL、PostgreSQL等数据库生成SSL证书
  • API网关:为 Kong、Traefik等API网关生成证书
  • 证书颁发测试:测试 PKI体系、验证证书链配置
  • DevOps自动化:集成到 CI/CD流程中自动生成测试证书

注意事项

安全性警告

  • 自签名证书的限制

    • 自签名证书不被公共浏览器信任,会产生安全警告
    • 仅适用于测试、开发和内部环境
    • 生产环境应使用公共CA签发的证书(如 Let’s Encrypt)
  • CA 私钥保护

    • cakey.pem文件必须严格保密,建议设置权限为 600
    • 不要将 CA 私钥提交到代码仓库
    • 考虑使用密码保护 CA 私钥(本脚本不支持,需手动实现)

证书信任配置

  • 客户端信任设置
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    # Linux(Ubuntu/Debian)
    sudo cp cacerts.pem /usr/local/share/ca-certificates/
    sudo update-ca-certificates
    
    # CentOS/RHEL
    sudo cp cacerts.pem /etc/pki/ca-trust/source/anchors/
    sudo update-ca-trust
    
    # macOS
    sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain cacerts.pem
    
    # Windows
    # 双击 cacerts.pem -> 安装证书 -> 选择"受信任的根证书颁发机构"

证书有效期管理

  • CA 证书:默认 10 年,建议设置为 5-10 年
  • 服务端证书
    • 测试环境:365-730 天
    • 生产环境(自签名):建议不超过 1 年,定期更新
    • Let’s Encrypt证书:90 天(自动续期)

多域名和 IP配置

  • SAN 扩展限制

    • 确保证书包含所有需要的域名和 IP
    • 域名数量没有硬性限制,但过多可能影响性能
    • IPv4和IPv6地址都可以添加
  • 通配符证书

    1
    2
    3
    
    # 生成通配符证书
    ./OpenSSL.sh --ssl-domain=*.example.com \
      --ssl-trusted-domain=example.com

文件管理

  • 备份策略

    1
    2
    3
    4
    
    # 备份 CA 证书和私钥
    mkdir -p ~/ca-backup
    cp cakey.pem cacerts.pem ~/ca-backup/
    chmod 700 ~/ca-backup
  • 版本控制

    • 不要将.key 私钥文件提交到 Git
    • 可以将.crt证书文件和openssl.cnf配置文件纳入版本控制

常见问题排查

问题 1:证书不被信任

1
2
# 解决方案:将 CA 证书添加到系统信任列表
# 参考上文"证书信任配置"部分

问题 2:域名不匹配

1
2
# 确保访问域名在证书的 SAN列表中
openssl x509 -in tls.crt -text -noout | grep -A1 "Subject Alternative Name"

问题 3:证书过期

1
2
3
4
5
6
7
# 检查证书有效期
openssl x509 -in tls.crt -dates -noout

# 重新生成证书(复用 CA)
./OpenSSL.sh --ssl-domain=www.example.com \
  --ca-cert-recreate=false \
  --ca-key-recreate=false

最佳实践

  1. 建立证书清单:记录所有生成的证书、用途、到期时间
  2. 定期轮换:即使证书未过期,也建议定期更换(如每年)
  3. 权限控制:私钥文件权限设置为 600,目录权限 700
  4. 审计日志:记录证书生成时间、参数、操作人员
  5. 应急预案:准备证书泄露或丢失时的应急流程