考虑到网站上面一堆域名证书的续费成本,还是花了几个小时将给服务器装上了Let's Encrypt 的免费证书。其实还算挺简单的。总体来说,LE的证书还是挺可靠的,支持着有EFF、Mozilla等大头,虽然是2015年末才正式推出服务,但是一年多以前我就早已听到,当时好像还引发了很强烈的反响。
基本原理
https://letsencrypt.org/how-it-works/
简要的说,签发机构通过可信的DNS找到你的服务器,确认上面有验证文件证明你是这个网站的所有者。为了确保安全性,与目前很多免费一样,仅提供短期(3个月)的验证服务。主要问题还是如何设置长期可维护的自动更新脚本了。更新证书的方法是 ACME (已经提交ietf草案 https://tools.ietf.org/html/draft-barnes-acme-01)
安装方法
我们需要两个private key,一个是用于和签发机构交流用的,另外一个是给网站用的正常的证书。
openssl genrsa 4096 > account.key openssl genrsa 4096 > domains.key
我没有用官方的略显臃肿的程序,直接用一个短小精悍的python脚本,只有两百余行,个人可以自己将程序看完,了解这个程序是干什么的。官方文档上也是这样写的,程序不能太长,必须让大家都看清写的是什么。
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
接下来就要生成证书申请文件了,可以自己写一个openssl的配置文件,以免以后添加域名的时候需要麻烦地更改命令行。另外letsencrypt可以支持一个证书多个域名,但是不支持泛域名(wildcard),于是需要大家把域名都写在一起。配置文件的写法可以参考下面的文件。
[ req ] default_bits = 4096 default_keyfile = /文件位置/domains.key distinguished_name = req_distinguished_name req_extensions = req_ext # The extentions to add to the self signed cert [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = 国家代号 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = 省份 localityName = Locality Name (eg, city) localityName_default = 城市 organizationName = Organization Name (eg, company) organizationName_default = 组织名称 commonName = Common Name (eg, YOUR name) commonName_max = 名称 [ req_ext ] subjectAltName = @alt_names [alt_names] DNS.1 = 域名1.com DNS.2 = 域名2.com DNS.3 = 域名3.com
生存csr文件可用命令
openssl req -new -sha256 -key /文件位置/privatekey.key -out /文件位置/requests.csr -config /文件位置/settings.conf
这时候需要用nginx给需要验证的服务器添加一个目录以便存放验证文件,建立成功后,建议弄一个文件然后访问网站看看能不能成功下载。
location ^~ /.well-known/acme-challenge/ { alias /var/目录/challenges/; try_files $uri =404; }
然后就用csr去请求证书,第二行是将官方Let's Encrypt Authority X1 证书(链)添加到请求到的证书的后面,然后重启nginx的服务
python acme_tiny.py --account-key /文件位置/account.key --csr /文件位置/requests.csr --acme-dir /var/目录/challenges/ > /文件位置/publickey.crt cat /文件位置/publickey.leix1.crt >> /文件位置/publickey.crt systemctl restart nginx
值得注意的是推荐使用 Let's Encrypt Authority X1 -> DST Root CA X3的证书链,否则在部分设备可能不支持
-----BEGIN CERTIFICATE----- MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0NlowSjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxl dCdzIEVuY3J5cHQxIzAhBgNVBAMTGkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4 S0EFq6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8SMx+yk13 EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0Z8h/pZq4UmEUEz9l6YKH y9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWAa6xK8xuQSXgvopZPKiAlKQTGdMDQMc2P MTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQAB o4IBfTCCAXkwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEE czBxMDIGCCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNvbTA7 BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9kc3Ryb290Y2F4My5w N2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAwVAYDVR0gBE0wSzAIBgZngQwBAgEw PwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcCARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNy eXB0Lm9yZzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9P VENBWDNDUkwuY3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJouM2VcGfl96S8 TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/wApIvJSwtmVi4MFU5aMqrSDE 6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwuX4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPM TZ+sOPAveyxindmjkW8lGy+QsRlGPfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M +X+Q7UNKEkROb3N6KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg== -----END CERTIFICATE-----
定期执行方法
其实了解怎么安装也就不难弄了,只需要在crontab 里面挂一个脚本即可。主要需要做:
- 重新请求一个证书
- 将Let's Encrypt Authority X1 证书贴到收到的证书的后面
- 重启nginx
0 0 15 * * root /文件路径/get_certificate.sh > /dev/null 2>&1
其他注意事项
- 验证的时候会首先验证80端口上面的页面,可以转跳到443页面,也就是说可以在不停机的情况下验证。
- 所有成功分发的证书都可以在 https://crt.sh/ 查找到
- 不可以频繁请求证书,网站对此有限制,可以使用测试的服务器进行尝试
- 可以用https://www.ssllabs.com/ssltest/analyze.html 看看你网站证书的安全状态
以下内容是给自己看的
- 修改 settings.conf
- 运行 get_requestfile.sh
- 复制request-日期.csr 到 request.csr
- 运行 get_certificate.sh
- 运行 active.sh