Let’s Encrypt ,给你的网站上https!

前几天给我们网站的所有域名都换了https证书,用的是Let‘s Encrypt。

Let‘s Encrypt是一个免费的https证书提供平台,包括chrome,firefox在内的主流浏览器都支持。重点是免费,不过有效期是90天,到期得重新更新证书。

EEF有一个certbot工具可以自动化的在你的网站部署https证书,我试了一下,对centos的支持好像不太友好,于是google一下,搜到了的一篇博客,写得很好。利用的另外一种方式部署。

首先创建一个目录:

mkdir ~/ssl && cd ~/ssl

然后我们需要一个账户和网站的私钥。

openssl genrsa 4096 > account.key  //账户私钥,用来识别身份
openssl genrsa 4096 > domain.key   // 域名私钥

接下来要创建CSR(Certificate Signing Request,证书签名请求)文件

openssl req -new -sha256 -key domain.key -out domain.csr

这里,因为需要交互,填的信息比较多,包括国家,公司,域名等等,输错了就得重来。所以我做了一个expect脚本,用来自动化填写信息。脚本如下,供参考

auto_crs.sh
#!/usr/bin/expect

set timeout 10
spawn openssl req -new -sha256 -key domain.key -out domain.csr
expect {
 "*Country Name*" {send "zh\r"}
}
expect {
 "*Province Name*" {send "Beijing\r"}
}
expect {
 "*Locality Name*" {send "Chaoyang\r"}
}
expect {
 "*Organization Name*" {send "xxx\r"}
}
expect {
 "*Organizational Unit Name*" {send "xxx\r"}
}
expect {
 "*Common Name*" {send "www.xxx.com\r"}
}
expect {
 "*Email Address*" {send "xxx@xxx.com\r"}
}
expect {
 "*challenge password*" {send "xxx\r"}
}
expect {
 "*An optional company name*" {send "xxx\r"}
}

interact

chmod +x auto_crs.sh

然后当前目录下会生成一个domain.csr文件,然后我们就可以生成证书了。

CA 在签发 DV(Domain Validation)证书时,需要验证域名所有权。传统 CA 的验证方式一般是往 admin@yoursite.com 发验证邮件,而 Let’s Encrypt 是在你的服务器上生成一个随机验证文件,再通过创建 CSR 时指定的域名访问,如果可以访问则表明你对这个域名有控制权。

所以,我们需要设置一下服务器,比如我们要验证对www.example.com的控制权。以apache为例,设置httpd.conf或者vhost文件:

先创建一个目录用来存放验证文件,

mkdir ~/challenge

然后更改配置

<IfModule alias_module>
     Alias /.well-known/acme-challenge/ /home/xxx/challenge/
</IfModule>

证书服务器会先在challenge目录创建一个随机文件,然后访问www.example.com/.well-known/challenge/随机文件,如果访问正常,则可以验证你对网站的控制权。

然后,我们用acme-tiny这个工具生成证书, 下载脚本:

wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

指定账户私钥、CSR 以及验证目录,执行脚本:

python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir ~/challenges/ > ./signed.crt

如果一起ok,那么会生成一个crt文件,这就是我们要的证书。

搞定网站证书后,还要下载 Let’s Encrypt 的中间证书:

wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem

最后修改,打开ssl module,修改httpd-ssl.conf文件(先Include),增加证书相关配置,然后重启apache即可。

对于多域名设置,没有深究,我写了一个脚本来设置多域名,如下,供参考:

#!/bin/bash

cd ~/ssl/
domain=$1
dir=`ls -al|grep ${domain} > /dev/null;echo $?`
if [ ${dir} -eq "0" ];then
echo "Domain exists"
exit
fi

cp -R ssl-www.example.com/ ssl-${domain}/ && cd ssl-${domain}/
sed -i 's/www.example.com/'${domain}'/g' auto.csr.sh
./auto_csr.sh
./renew_cert.sh

关于公私钥位数,我用的是4096位,想了一下,除了在ssl握手时会使用一次非对称,传输一次公钥,后面都是使用随机字串对称加密,所以并不会影响性能或者可以忽略不计,使用4096位更加安全。

另外,部署后可以在Qualys上test一下。

参考:

https://imququ.com/post/letsencrypt-certificate.html

https://letsencrypt.org/

www.certbot.com

Join the Conversation

1 Comment

Leave a comment

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