总结摘要
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:脚本运行环境cat、sed、echo:基础文本处理工具
可选工具
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
2
3
4
5
| # 使用主下载地址
bash <(curl -sL sc.eli1.top) OpenSSL download
# 或使用备用地址
bash <(curl -sL download.elisky.cn) OpenSSL download
|
赋予执行权限:
生成基础 SSL 证书:
1
| ./OpenSSL.sh --ssl-domain=www.test.com
|
生成完整配置的 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
|
最佳实践
- 建立证书清单:记录所有生成的证书、用途、到期时间
- 定期轮换:即使证书未过期,也建议定期更换(如每年)
- 权限控制:私钥文件权限设置为 600,目录权限 700
- 审计日志:记录证书生成时间、参数、操作人员
- 应急预案:准备证书泄露或丢失时的应急流程