Let’s Encrypt Public Beta 初体验/证书签发过程实录 [Ubuntu 14.04 / Vesta集成环境]

letsencrypt08

由于http的安全问题(明文传输,流量劫持,代码注入),推广全网https的呼声也越来越大,所以我决定上一个https证书。其实说白了还是想要地址栏有一个绿色的小锁装逼。

MikeLei给我推荐了Let’s Encrypt的免费证书,当时Let’s Encrypt还在内测中,使用前需要首先向服务器提交申请。之前还没有写Blog的打算,唯一需要证书的地方就是Anyconnect登录时候的验证。自签证书除了登录的时候需要点一个不信任的服务器提示之外也没有什么太麻烦的,所以就一直没有管。

当然,人的追求是越来越高的。其实是越来越懒得每次都点“我信任”。为了消除“不信任的服务器”提示和避免中间人攻击,我觉定把anyconnect的登录验证证书从自签证书换成可信机构签发的证书。正巧当时Let’s Encrypt刚刚开始Public Beta公测,于是尝试了一下,各种出错,最终发现是DNSpod解析导致的问题。于是最后从沃通Wosign签了一个免费证书

虽然后来MikeLei各种恐吓我WoSign会协助搞中间人balabala,但主要是我终于把DNS解析从DNSpod转到了HE,可以研究Let’s Encrypt了。

要说明的是Let’s Encrypt和WoSign的免费证书还是很相似的,都可以在同一个证书里写进很多域名,由于不是通配符证书所以需要把所有的域名在申请前全部都指定进去,沃通可以在一个证书里指定5个,Let’s Encrypt可以一次指定50个……

2015-12-30

 

对于这种一个证书解决各种域名还免费的结果,我只想说,懒人福音……但是首先这些域名必须都先同时指向到运行Let’s Encrypt的这台VPS……

好了接下来开始从终端把Let’s Encrypt下载下来

git clone https://github.com/letsencrypt/letsencrypt

再进入Let’s Encrypt的目录

cd letsencrypt

以后再需要更新只需要在目录内执行

git pull

就可以了。

由于Let’s Encrypt是采用内建的程序和验证服务器进行通讯,需要使用80端口,所以需要先关闭apache和nginx,如果80端口被占用则会返回 “The client lacks sufficient authorization” 错误。

sudo service apache2 stop && sudo service nginx stop

当然也可以从Vesta的网页端里直接停止这两个……像我这种懒人

letsencrypt01

如果要是用Vesta这种集成环境的话尽量用网页来停止,因为它有设定Crontab来防止服务器掉线,所以手动从终端stop以后过几分钟自己就起来了……

其次确定自己的DNS解析商不是DNSpod,貌似还有几家国内的DNS解析服务不行,这个没有考察,可以自己尝试一下,DNS问题的多会返回 “Name server can not resolve” 错误。

好了一切就绪可以使用了。在进入Let’s Encrypt的克隆目录后执行命令

./letsencrypt-auto

Let’s Encrypt目前支持几种插件,可以直接完成几种常见环境的注册和证书安装。

The Let’s Encrypt client supports a number of different “plugins” that can be used to obtain and/or install certificates. Plugins that can obtain a cert are called “authenticators” and can be used with the “certonly” command. Plugins that can install a cert are called “installers”. Plugins that do both can be used with the “letsencrypt run” command, which is the default.

Plugin Auth Inst Notes
apache Y Y Automates obtaining and installing a cert with Apache 2.4 on Debian-based distributions with libaugeas0 1.0+.
standalone Y N Uses a “standalone” webserver to obtain a cert.
webroot Y N Obtains a cert by writing to the webroot directory of an already running webserver.
manual Y N Helps you obtain a cert by giving you instructions to perform domain validation yourself.
nginx Y Y Very experimental and not included in letsencrypt-auto.

Future plugins for IMAP servers, SMTP servers, IRC servers, etc, are likely to be installers but not authenticators.

比如像使用apache监听443端口的可以直接使用

./letsencrypt-auto --apache

来完成证书签发并在apache里设置路径。

我的ssl是通过nginx监听443端口转发的,所以我可以使用 –nginx 指令,不过Vesta后台上可以写入ssl证书,所以我没有尝试插件。

letsencrypt02

由于我没有在apache中绑定域名,所以开头会提示一下。

letsencrypt03

在这里输入所有需要的域名,比如example.com www.example.com a.example.com。域名可以用空格或逗号隔开。

letsencrypt04

由于我之前签发过其中几个域名,在 /etc/letsencrypt/renewal 中留有记录,所以会提示我是否覆盖,需要注意的是,目前无法签发ipv6地址对应的域名。

letsencrypt05

这个还是和apache有关的,由于我没有在apache中填写域名……一个一个select吧,默认的这个就没有问题。

letsencrypt06

这一步选Easy就可以,因为我之前已经手动在nginx里写过了rewrite的命令。

letsencrypt07

然后就成功了 。需要注意的是,在签发完成后,我试图启动apache和nginx发现启动失败了,两个只能同时启动一个。

经过检查,发现 ./letsencrypt-auto 在 /etc/apache2/ports.conf 中写入了如下信息

Listen 我的IP地址:443
Listen 127.0.0.1:443

由于我一直使用的nginx监听的443端口绑定证书和转发,于是很显然的冲突了,注释掉这两条或者删掉再启动apache和nginx即正常。

虽然在结束后的说明中表示证书文件是存储在 /etc/letsencrypt/live/yourdomain.xx/ 中的,实际上只是一个link,真正的地址为

/etc/letsencrypt/archive/yourdomain.xx/

记得选选数字最大的

最后可以参考showfom的博文增强密钥交换强度:https://s.how/nginx-ssl/

但是这么做并不安全,默认是 SHA-1 形式,而现在主流的方案应该都避免SHA-1,为了确保更强的安全性,我们可以采取迪菲-赫尔曼密钥交换

首先,进入 /etc/ssl/certs 目录并生成一个 dhparam.pem

cd /etc/ssl/certs

openssl dhparam -out dhparam.pem 2048

如果你的机器性能足够强大,可以用 4096 位加密

生成完毕后,在 Nginx 的 SSL 配置后面加入

ssl_prefer_server_ciphers on;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";

keepalive_timeout 70;

ssl_session_cache shared:SSL:10m;

ssl_session_timeout 10m;

同时,如果是全站 HTTPS 并且不考虑 HTTP 的话,可以加入 HSTS 告诉你的浏览器本网站全站加密,并且强制用 HTTPS 访问

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

add_header X-Frame-Options DENY;

add_header X-Content-Type-Options nosniff;

祝玩耍愉快~

发表评论

%d 博主赞过: