利用letsencrypt.sh脚本来获取Let'sEncrypt的SSL证书

Let's Encrypt是个好项目,但是问题是它的客户端太臃肿了,而且到目前为止还只支持Apache,相比之下github上letsencrypt.sh只用sh脚本就实习了足够的功能了。还能适配nginx。但是,它也有它的问题——文档太少且支离破碎,根本没有成体系的手册,只能自己看代码摸索。我也是花了老半天的时间才搞定它。

首先先clone下这个项目
git clone git@github.com:lukas2511/letsencrypt.sh.git

默认有两种办法在ACME服务器上获取授权注册,我用的是配合Nginx的HTTP模式
在nginx的对应的domain server字段下添加以下设置

location /.well-known/acme-challenge {
   alias /var/www/letsencrypt;
}


这个在http或者https下都没问题,哪怕你https的证书有问题也可以被识别,但是如果是第一次申请,还是老老实实地放http上省得麻烦

指向的地址是需要用的WELLKNOWN变量地址

在仓库下新建一个config.sh文件,内容如下:

#CA="https://acme-staging.api.letsencrypt.org/directory"
CA="https://acme-v01.api.letsencrypt.org/directory"
WELLKNOWN=/var/www/letsencrypt


第一行的CA地址是调试用的,基本上你搞这个一次是很难搞定的,用调试地址可以有效的避免被远端屏蔽
 WELLKNOWN就指向我们刚才nginx中设置的地址

继续新建一个domains.txt,格式类似

aaa.com www.aaa.com b.aaa.com
bbb.com ccc.bbb.com www.bbb.com rr.bbb.com

一行一个域名,每个子域名空一格

 接着运行

 ./letsencrypt.sh -c --config config.sh

你会看到类似这样的输出
+ Signing domains...
+ Generating private key...
+ Generating signing request...
+ Requesting challenge for xxx.com..


这个可能需要很长的时间,切忌不耐心的杀进程,我就是不耐心杀掉了进程,结果接下来就一直给我403了
{"type":"urn:acme:error:unauthorized","detail":"No registration exists matching provided key","status":403}

出现这样的问题也很好解决,删除根目录下的private_key.pem让它重新生成一个就好

生成好了之后的证书会存放在文件目录的certs目录下

进入以你域名命名的文件夹就可以看到对应的证书了

参考的nginx配置如下,放入对应的server字段中:

       ssl_certificate /home/siglud/letsencrypt.sh/certs/xxxxx/fullchain.pem;
       ssl_certificate_key /home/siglud/letsencrypt.sh/certs/xxxxx/privkey.pem;

       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       ssl_prefer_server_ciphers on;
       ssl_dhparam /etc/ssl/certs/dhparam.pem;
       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-A
ES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AE
S256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DH
E-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-S
HA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-S
HA:!KRB5-DES-CBC3-SHA';
       ssl_session_timeout 1d;
       ssl_session_cache shared:SSL:50m;
       ssl_stapling on;
       ssl_stapling_verify on;
       add_header Strict-Transport-Security max-age=15768000;


其中的dhparam.pem是这样生成的:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

接下来就是让它每月运行一次来保障SSL证书持续有效了,简单的给它做个crontab就完事了

评论

此博客中的热门博文

远程记录OpenWRT日志

用OpenWRT打造自动翻墙路由器(详解篇)

Python中为什么要用is None来代替== None?