免费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' ) ;


本文短链接地址:http://lookup.im/s/freessl

《免费SSL证书Let’ s Encrypt安装笔记-acme.sh+nginx》有6个想法

    1. 如果能改nignx配置文件的,也可以用那种直接网站里申请的证书,阿里云和腾讯云都有免费的。

  1. 楼主,下面这步我生成的key文件内容为空,文件大小为0字节,是否有问题?
    Your cert key is in /home/will/.acme.sh/firefore.com/firefore.com.key

发表评论

电子邮件地址不会被公开。 必填项已用*标注