这里推荐 acme.sh,它不仅有详细的中文文档,操作更为方便,还支持 Docker。
acme.sh
以 root 用户为例
1、在线安装
- curl https://get.acme.sh | sh
安装过程:
1、/root 目录下生成 .acme.sh 文件夹,查看文件夹内容:ls ~/.acme.sh/;
2、自动添加 bash alias:
- # ~/.bashrc 添加:
- . "/root/.acme.sh/acme.sh.env"
- # acme.sh.env 内容:
- # alias acme.sh="/root/.acme.sh/acme.sh"
3、自动添加定时任务(时间随机) 执行 crontab -l 可以查看定时任务:
- # 每天凌晨检查证书的有效期,如有需要,自动续签。
- 30 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
如果遇到acme.sh命令不生效,请使用:
- /root/.acme.sh/acme.sh -h
2、设置邮箱
- acme.sh --register-account -m 398927951love@sina.com
相关命令
- # 查看帮助
- acme.sh -h
- # 查看列表
- acme.sh --list
- # 卸载 acme.sh
- # 编辑 ~/.bashrc,删除 acme.sh alias
- acme.sh --uninstall
脚本更新
自动更新:acme.sh --upgrade --auto-upgrade
手动更新:acme.sh --upgrade
关闭更新:acme.sh --upgrade --auto-upgrade 0
3、证书申请
- acme.sh --issue -d example.com -d www.example.com -w /home/wwwroot/example.com
acme.sh 有很多种申请证书的方式,上面写得如果你已经有一个在运行的server,-w 后跟的就是这个
server的根目录,前面-d 后面跟的是要申请证书的域名,可以是多个,第一个是主域名。
standalone方式,这个方式要求服务器的80端口可用,也可以指定别的端口,命令在上面的地址里都有。
- acme.sh --issue -d example.com -d www.example.com --standalone --httpport 88
DNS API(推荐)
根据域名服务商,选择对应的 DNS API。
阿里云:控制台
创建 Accesskey
- # 获取到 Key 和 Secret 后,设置环境变量
- export Ali_Key="123"
- export Ali_Secret="abc"
- # 生产证书
- acme.sh --issue --dns dns_ali -d mydomain.com -d www.mydomain.com
创建一个.sh文件放在指定的位置(api_xxx_com_create.sh),然后使用sh命令去执行它
- #!/bin/sh
- alias acme.sh='/root/.acme.sh/acme.sh'
- # 获取到 Key 和 Secret 后,设置环境变量
- export Ali_Key="Lxxxxx"
- export Ali_Secret="3Txxxx"
- # 生产证书
- acme.sh --issue --dns dns_ali -d api.xxx.com
4、证书配置
生成的证书都在 root 目录下: ~/.acme.sh/
导出证书
使用 --install-cert 命令
-d:域名
–key-file:私钥位置
–fullchain-file:证书位置
–reloadcmd:重载命令
- acme.sh --install-cert -d example.com \
- --key-file /path/to/keyfile/in/nginx/mydomain.key \
- --fullchain-file /path/to/fullchain/in/nginx/fullchain.cer
- acme.sh --install-cert -d mydomain.com \
- --key-file /websvr/ssl/mydomain.key \
- --fullchain-file /websvr/ssl/fullchain.cer \
- --reloadcmd "docker exec -t nginx nginx -s reload"
创建一个.sh文件放在指定的位(api_xxx_com_install.sh),然后使用sh命令去执行它
- #!/bin/sh
- alias acme.sh='/root/.acme.sh/acme.sh'
- acme.sh --install-cert -d api.xxx.com --key-file /data-disk/ssl/ssl_cert/api_xxx_com.key --fullchain-file /data-disk/ssl/ssl_cert/api_xxx_com.cer
5、Nginx 配置
- server {
- listen 80;
- server_name mydomain.com;
- # 重定向到 https
- rewrite ^(.*)$ https://$host$1 permanent;
- }
- server {
- listen 443;
- server_name mydomain.com;
- root /websvr/www/mydomain.com;
- index index.html index.htm;
- access_log /dev/null;
- error_log /websvr/log/nginx/mydomain.com.error.log warn;
- # SSL 配置
- ssl on;
- ssl_certificate /websvr/ssl/fullchain.cer; # 证书文件
- ssl_certificate_key /websvr/ssl/mydomain.key; # 私钥文件
- ssl_session_timeout 5m; # 会话缓存过期时间
- ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 开启 SSL 支持
- ssl_prefer_server_ciphers on; # 设置协商加密算法时,优先使用服务端的加密套件
- }
- server {
- server_name api.xxx.com;
- listen 80;
- # 重定向到 https
- rewrite ^(.*)$ https://$host$1 permanent;
- }
- server{
- listen 443 ssl;
- server_name api.xxx.com;
- index index.html index.htm index.php;
- root /var/www/html/temp/xxx/web/api;
- location / {
- try_files $uri $uri/ /index.php?$query_string;
- }
- location ~ \.php$ {
- fastcgi_pass php7.2:9000;
- include fastcgi.conf;
- }
- # SSL 配置
- ssl on;
- ssl_certificate /var/www/html/ssl/ssl_cert/api_xxx_com.cer; # 证书文件
- ssl_certificate_key /var/www/html/ssl/ssl_cert/api_xxx_com.key; # 私钥文件
- ssl_session_timeout 5m; # 会话缓存过期时间
- ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 开启 SSL 支持
- ssl_prefer_server_ciphers on; # 设置协商加密算法时,优先使用服务端的加密套件
- client_max_body_size 50m;
- }
更新证书
定时任务会自动更新
强制续签证书:acme.sh --renew -d mydomain.com --force
SSL 检测