Linux服务器下使用acme.sh脚本是申请let’s encrypt证书最便捷的方式,比官方推荐的certbot
脚本工具要强大的多。
安装文档: https://github.com/Neilpang/acme.sh/wiki/说明
前提条件
- 拥有一个域名,例如mydomain.com (在国内主机的用的话,还需要通过ICP备案)
- 确定二级域名,并且在域名服务器创建一条A记录,执行云主机的公网IP地址。www.mydomain.com指向xxx.xxx.xxx.xxx的IP地址
- 要等到新创建的域名解析能在公网上被解析到。
- 据说国内的域名提供商对letsencrypt的支持非常差,但是现阶段用dnspod解析的域名还没碰到问题。
一、安装acme.sh脚本
curl https://get.acme.sh | sh
# 重新登录ssh,或者使用source命令重新加载环境变量
source .
二、使用DNS API申请证书
(推荐配置使用API的方式,否则每隔三个月,仍然需要重新验证DNS TXT记录)
创建DNS API的Key及Secret
参考:https://github.com/Neilpang/acme.sh/tree/master/dnsapi
【例子一】域名由DNSPod提供解析
-
使用DNSPod域名服务的话,首先需要在DNSPod网站上获取API Key以及ID
-
Linux下使用acme.sh命令申请证书
export DP_Id="xxxxx" export DP_Key="xxxxx" # 注:-d参数可以多次使用,来实现同时为多个域名创建同一个证书 acme.sh --issue --dns dns_dp -d mydomain.com -d www.mydomain.com -d blog.mydomain.com --accountemail my@email.com #等2分钟
【例子二】域名由GoDaddy域名解析的情况
-
首先在godday的开发者页面获取API的key https://developer.godaddy.com/keys
创建API的Key以及Secret
-
Linux下使用acme.sh命令申请证书
export GD_Key="xxxxx" export GD_Secret="xxxxx" acme.sh --issue --dns dns_gd -d mydomain.com --accountemail email@mydomain.com #等2分钟
三、安装证书
# 创建安装目录
mkdir /etc/ssl/mydomain.com/ -p
# reloadcmd参数里面填写的是在更新证书后需要重新启动的服务,例如重启nginx或者apache或者其它脚本。
acme.sh --installcert -d mydomain.com \
--keypath /etc/ssl/mydomain.com/privkey.pem \
--fullchainpath /etc/ssl/mydomain.com/fullchain.pem \
--reloadcmd "systemctl reload nginx"
四、应用实例:配置nginx使用证书开通https站点
-
生成Perfect Forward Security(PFS)键值
Perfect Forward Security(PFS)是个什么东西,中文翻译成
完美前向保密
,一两句话也说不清楚,反正是这几年才提倡的加强安全性的技术。如果本地还没有生成这个键值,需要先执行生成的命令。mkdir /etc/ssl/private/ -p cd /etc/ssl/private/ openssl dhparam 2048 -out dhparam.pem
生成的过程还挺花时间的,喝杯咖啡歇会儿吧。
-
配置使用证书。例如:Nginx配置SSL网站:
/etc/nginx/conf.d/www.mydomain.com.conf
,样例内容如下:server { listen 80; server_name www.mydomain.com; rewrite ^ https://$server_name$request_uri? permanent; } server { listen 443 ssl; server_name www.mydomain.com; charset utf-8; root /opt/www/www.mydomain.com; index index.html index.htm; access_log /var/log/nginx/www.mydomain.com_access.log; error_log /var/log/nginx/www.mydomain.com_error.log; # letsencrypt生成的文件 ssl_certificate /etc/ssl/mydomain.com/fullchain.pem; ssl_certificate_key /etc/ssl/mydomain.com/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets on; ssl_dhparam /etc/ssl/private/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK'; ssl_prefer_server_ciphers on;
在浏览器打开http://www.mydomain.com
, 如果正常跳转到https://demo.mydomain.com
,就算成功了。
如果是chrome浏览器,在地址栏点击小锁的图标,可以查看证书的详情。
五、测试证书
如果是网站的话,可以使用第三方网站工具测试自己网站的HTTPS配置
https://ssllabs.com/ssltest/analyze.html?d=mydomain.com
也可以在Linux下使用openssl命令查看证书的过期时间
openssl x509 -noout -dates -in /etc/ssl/mydomain.com/privkey.pem
六、确认crontab自动更新脚本
正常情况下acme.sh会自动安装以下定时任务,如果没有的话,需要手工添加
0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null