免费SSL证书Let’s Encrypt安装笔记-acme.sh+nginx

决定全站采用https方式,用Let’ s Encrypt来部署。
(Let’ s Encrypt是啥这里不啰嗦,可以百度)

Let’ s Encrypt官方列出了申请证书的多种方法方式,列表可点击这个链接:https://letsencrypt.org/docs/client-options/。浏览了一番,决定采用acme.sh来申请证书。
(这个是用 Shell 脚本编写的,安装更容易一些,而且acme.sh有很详细的中文说明

这次我的操作基本步骤如下:

一、安装acme.sh
二、申请证书
三、安装证书,配置nginx
四、检查和校验

一、安装acme.sh

curl https://get.acme.sh | sh
没有curl的直接安装一下即可。等跑完之后,可以重载一下.bashrc,

source ~/.bashrc
这样我们就有了acme.sh的命令了。
这个sh很强大,安装了环境,还自动利用crontab自动更新证书。

二、申请证书
acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证,我用的是http验证方式。

acme.sh --issue -d firefore.com -d www.firefore.com -w /home/domains/firefore.com/public_html/
上面这段命令解释一下,-d后面带的是域名,有不同子域名可以写多个-d,-w后面带的是网站根目录。上面这条命令运行过程将会往 /home/domains/firefore.com/public_html目录里创建一个 .well-known 的文件夹,同时 Let’ s Encrypt 将会去访问 https://firefore.com/.well-known/和http://www.firefore.com/.well-known/ 这个路径(命令里每个-d 后面的域名都会访问)。 所以我们需要确保 /home/domains/firefore.com/public_html 是在 Nginx的配置文件上是配置成 root 目录,里面任意文件可以直接域名访问的。如果实际使用,请务必换成您自己的域名,还有域名的网站根目录。

贴出一部分运行结果信息供参考:

[Mon Apr 3 10:23:36 CST 2017] Multi domain='DNS:www.firefore.com'
[Mon Apr 3 10:23:36 CST 2017] Getting domain auth token for each domain
[Mon Apr 3 10:23:36 CST 2017] Getting webroot for domain='firefore.com'
[Mon Apr 3 10:23:36 CST 2017] Getting new-authz for domain='firefore.com'
[Mon Apr 3 10:23:41 CST 2017] The new-authz request is ok.
[Mon Apr 3 10:23:41 CST 2017] Getting webroot for domain='www.firefore.com'
[Mon Apr 3 10:23:41 CST 2017] Getting new-authz for domain='www.firefore.com'
[Mon Apr 3 10:23:44 CST 2017] The new-authz request is ok.
[Mon Apr 3 10:23:44 CST 2017] Verifying:firefore.com
[Mon Apr 3 10:23:51 CST 2017] Success
[Mon Apr 3 10:23:51 CST 2017] Verifying:www.firefore.com
[Mon Apr 3 10:23:57 CST 2017] Success
[Mon Apr 3 10:23:57 CST 2017] Verify finished, start to sign.
[Mon Apr 3 10:24:01 CST 2017] Cert success.
-----BEGIN CERTIFICATE-----
这里省略n个字
-----END CERTIFICATE-----
[Mon Apr 3 10:24:01 CST 2017] Your cert is in /home/will/.acme.sh/firefore.com/firefore.com.cer
[Mon Apr 3 10:24:01 CST 2017] Your cert key is in /home/will/.acme.sh/firefore.com/firefore.com.key
[Mon Apr 3 10:24:03 CST 2017] The intermediate CA cert is in /home/will/.acme.sh/firefore.com/ca.cer
[Mon Apr 3 10:24:03 CST 2017] And the full chain certs is there: /home/will/.acme.sh/firefore.com/fullchain.cer
如果报错,可以看是在哪个环节错误,基本上出现在域名解析问题,或是-w 后面的目录写错导致Let's Encrypt访问失败。

如果成功,就会得到提示,相关的证书文件都产生了,且文件所在很有条理,都在.acme.sh的目录里根据域名产生的文件夹里。十分的绿色环保,很赞。

三、安装证书,配置nginx

acme.sh --installcert -d firefore.com -d www.firefore.com \
--keypath /home/domains/firefore.com/ssl/firefore.key \
--fullchainpath /home/domains/firefore.com/ssl/firefore.pem \
--reloadcmd "sudo service nginx force-reload"
上面这串特别重要,我们输入后,acme.sh就记住了这些参数,以后自动更新证书就会自动按照这些参数运行。另外这里用的是 service nginx force-reload, 不是 service nginx reload, 是根据acme.sh的官方说明来的,据测试, reload 并不会重新加载证书, 所以用的 force-reload。

可以看到里面有2个参数--keypath和--fullchainpath,这两个分别制定了域名ssl证书所在目录,所以运行这串时,要保障文件夹是存在的,另外这个文件夹不需要在网站根目录下,且也不建议放在网站根目录下,所以可以看到我没放到public_html目录里。请记住这两个参数的目录和文件名,它们就是域名证书所在。

贴出我的运行结果做参考

will@issite22:~# acme.sh --installcert -d firefore.com -d www.firefore.com \
> --keypath /home/domains/firefore.com/ssl/firefore.key \
> --fullchainpath /home/domains/firefore.com/ssl/firefore.pem \
> --reloadcmd "sudo service nginx force-reload"
[Mon Apr 3 10:24:39 CST 2017] Installing key to:/home/domains/firefore.com/ssl/firefore.key
[Mon Apr 3 10:24:39 CST 2017] Installing full chain to:/home/domains/firefore.com/ssl/firefore.pem
[Mon Apr 3 10:24:39 CST 2017] Run reload cmd: sudo service nginx force-reload
Restarting nginx: nginx.
[Mon Apr 3 10:24:41 CST 2017] Reload success
然后我们再生成一个ssl_dhparam要用的文件,使用如下命令:

openssl dhparam -out /home/domains/firefore.com/ssl/dhparam.pem 2048
这个命令执行后,看主机性能,普通的话需要跑个几分钟。最后的2048是个参数,如果主机性能很牛逼,也可以用4096的样子,我就乖乖2048用着了。如果没有这个文件,在ssllab那边是怎么都达不到A+的评分。

接下来,就是配置nginx了,我贴出我配置的关键内容,如果有兴趣,可以直接点这里查看完整的配置。

server{
listen 80;
server_name firefore.com www.firefore.com;
return 301 https://firefore.com$request_uri;
}
上面这段是让http访问通过301跳转到https上,传说中的强制让http变为https的方法;
另外是强制www.firefore.com的访问也跳转到firefore.com上;

server{
listen 443;
server_name firefore.com www.firefore.com;
root /home/domains/firefore.com/public_html;
index index.html index.htm index.shtml index.php;
ssl on;

ssl_certificate /home/domains/firefore.com/ssl/firefore.pem;
ssl_certificate_key /home/domains/firefore.com/ssl/firefore.key;

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

ssl_stapling on;
ssl_stapling_verify on;

ssl_prefer_server_ciphers on;
ssl_dhparam /home/domains/firefore.com/ssl/dhparam.pem;

add_header Strict-Transport-Security max-age=15552000;

# 这里省略其他配置信息的显示
}
保存且退出nginx的配置文件后,用命令检查一下配置文件,然后再把nginx重启一下。

sudo service nginx configtest
sudo service nginx restart
四、检查和校验

至此,咱们的ssl证书申请、部署、配置都算完成,现在就是检查和校验了。那么先试试原来的http能不能自动跳转到https上。可以输入带http的网址,看看是否会主动转换为https。

点击试试:https://firefore.com

校验则使用ssllabs这个网站,它会根据校验结果,给出评价,例如我们今天搞了一番之后,评价为A+,这是我们想要达到的效果。

ssllabs关于https的校验
ssllabs 的评价截图
slabs网址:https://www.ssllabs.com/ssltest/analyze.html?d=firefore.com
可以把我的域名换成你的试试。

还有最后一步,我得把原来的http超链接都改为https,做法就是数据库里搜索https://firefore.com开头的,都改为相对链接,或是https开头亦可。我用如下的SQL语句直接替换

UPDATE wp_posts SET post_content = REPLACE( post_content, 'http://firefore', 'https://firefore' ) ;


扫描二维码,在手机上阅读!

标签: acme.sh, Let’s Encrypt, https

评论已关闭