利用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就完事了
首先先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就完事了
评论
发表评论