前几天给我们网站的所有域名都换了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
Leave a comment