OpenSSL
RSA密钥生成命令
生成RSA私钥
openssl genrsa -out rsa_private_key.pem 1024
生成RSA公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
将RSA私钥转换成PKCS8格式
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
注意:“>”符号后面的才是需要输入的命令。
Certbot 证书工具
yum 安装
yum install certbot
pyOpenSSL 冲突
# 更新 CA 证书
yum -y update ca-certificates
# 删除原有安装
yum remove certbot && pip uninstall pyOpenSSL
# 更新 devel 工具
yum install -y python-devel
yum install -y openssl-devel
# 安装 certbot
yum install -y certbot
# 安装 pyOpenSSL
pip install -y pyOpenSSL
# 新版本软链接
rm /usr/bin/python && ln -s /usr/bin/python3 /usr/bin/python
生成域名证书
单个域名
certbot certonly --email admin@veryide.com --agree-tos --webroot -w /disk/www/ssl.veryide.net -d ssl.veryide.net
多个域名
certbot certonly --email admin@veryide.com --agree-tos --webroot -w /disk/www/veryide.net -d veryide.net -d www.veryide.net -w /disk/www/veryide.com -d veryide.com -d www.veryide.com
证书目录
/etc/letsencrypt/live/
通配符证书
# 执行脚本,手动 DNS 验证
certbot --server https://acme-v02.api.letsencrypt.org/directory -d "*.veryide.net" --manual --preferred-challenges dns-01 certonly
# 配置域名 TXT 记录
_acme-challenge.veryide.net
# 全自动化 DNS 验证
certbot --server https://acme-v02.api.letsencrypt.org/directory -d "*.taokebaohe.com" --manual --preferred-challenges dns-01 certonly --manual-auth-hook /disk/shell/certbot-auth-dnspod.sh --deploy-hook /disk/shell/certbot-deploy.sh
续约证书
# 不保存任何证书到磁盘
certbot renew --dry-run
# 强制更新,有次数限制
certbot renew --dry-run --force-renewal
# 更新完后,执行钩子脚本
certbot renew --deploy-hook /disk/shell/certbot-deploy.sh
撤销证书
certbot revoke --cert-path /etc/letsencrypt/archive/lanpixia.com/cert1.pem
删除证书
certbot delete --cert-name lanpixia.com
定时更新脚本
# 每周一凌晨3点30自动更新证书,更新成功就自动重启 Nginx 服务
30 3 * * 1 certbot renew --deploy-hook "systemctl restart nginx" --quiet > /dev/null 2>&1 &
# 每周一凌晨3点30自动更新证书,更新成功就执行 Shell 脚本
30 3 * * 1 certbot renew --deploy-hook /disk/shell/certbot-deploy.sh --quiet > /dev/null 2>&1 &
# 每周一凌晨3点30自动更新证书,更新成功就执行 Shell 脚本
30 3 * * 1 certbot renew --manual-auth-hook /disk/shell/certbot-auth-dnspod.sh --deploy-hook /disk/shell/certbot-deploy.sh --quiet > /dev/null 2>&1 &
单域名文件验证
certbot certonly --email admin@veryide.com --agree-tos --webroot -w /disk/www/ssl.veryide.net -d ssl.veryide.net --manual-auth-hook /disk/shell/certbot-auth-file.sh
DNSPOD 解析认证
# 在 dnspod 生成 API Token
https://www.dnspod.cn/console/user/security
# 并以 ID,Token 形式存入 /etc/dnspod_token 或 /disk/certs/dnspod_token
91302,effb4ff11b869b26d99cbe086f8china
# certbot 指定手动验证钩子
certbot renew --manual-auth-hook /disk/shell/certbot-auth-dnspod.sh --deploy-hook /disk/shell/certbot-deploy.sh
mkcert 本地证书
工具下载
https://github.com/FiloSottile/mkcert
安装 CA 证书
./mkcert -install
生成本地证书
./mkcert baohe.test "*.baohe.test" localhost 127.0.0.1 ::1
信任 CA 证书
# 将 rootCA.pem 改名为 rootCA.crt,双击安装证书,选择 “受信任的根证书颁发机构”
./mkcert -CAROOT
部署证书
Nginx 证书配置
server {
listen 443;
ssl on;
ssl_certificate /disk/certs/example.crt;
ssl_certificate_key /disk/certs/.cert/example.key;
}
Apahce 证书配置
#注意需要监听 443 端口,以及启用 ssl 模块
#Listen 443
#LoadModule ssl_module modules/mod_ssl.so
<VirtualHost app.baohe.test:443>
DocumentRoot "E:\Works\Baohe\run"
ServerName app.baohe.test
# HTTPS 支持
SSLEngine on
SSLCertificateFile "E:/EasyPHP/certs/example.test.pem"
SSLCertificateKeyFile "E:/EasyPHP/certs/example.test-key.pem"
</VirtualHost>
常见错误
SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
yum install ca-certificates openssl
TypeError: str returned non-string (type Error)
升级 Python 3.x 以上版本,或者安装 python2-certbot 版本(yum install python2-certbot),亦或者需要更新 CA 证书
PHP SSL operation failed with code 1. OpenSSL Error messages: SSL routines:ssl3_get_server_certificate:certificate verify failed
cd /disk/certs/ && wget https://curl.haxx.se/ca/cacert.pem --no-check-certificate -O cacert.pem
openssl.cafile=/disk/certs/cacert.pem
参考资料