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就完事了
转载需保留链接来源:软件玩家 » letsencrypt.sh脚本获取Let’sEncrypt的SSL证书