2017-10-04

用上Let’s Encrypt的HTTPS证书

0 突发奇想?

看着越来越多的个人网站开始使用https ,很早就有打算,但等到最近才弄的原因其实是有别的服务要提供,为了防止被串改只能尝试着配置了一下HTTPS,成功之后便开始在这边配置。

使用 Let's Encrypt 这个证书签发服务还是挺多的,主要是看到了 Let's Encrypt,免费好用的 HTTPS 证书 这篇文章,免费,自动只是一部分原因,还有另一些原因是考虑到后面的多地部署本网站,需要多个域名的绑定同个服务器,需要SNI(Server Name Indication)这个, 之前没有找到有提供SNI 扩展的证书颁发,那就选这个好了。

1 环境

OpenSSL 1.0.2g 1 Mar 2016 (有点老,所以不支持 TLS1.3,回头再去升级好了。

使用 acme-tiny 这个工具,很小巧的脚本,功能不多,但是足够了。

归档好文件吧, 在web相关的目录下建立一个文件夹,这里的默认为 /var/www/ssl

2 获取证书

创建 RSA 私钥用于 Let's Encrypt 识别你的身份
openssl genrsa 4096 > account.key
创建 域名 私钥

创建一个域名私钥,根据证书种类不同可以申请不同的私钥。

  • 1) RSA私钥(兼容性好
openssl genrsa 4096 > domain.key
  • 2) ECC私钥(部分老旧操作系统、浏览器不支持,但证书体积小
#secp256r1
openssl ecparam -genkey -name secp256r1 | openssl ec -out domain.key

#secp384r1
openssl ecparam -genkey -name secp384r1 | openssl ec -out domain.key

这里我就直接选择 RSA私钥了。

创建CSR文件

接着就可以生成 CSR(Certificate Signing Request,证书签名请求)文件了,在CSR文件中可以添加子域,但不能超过100个

openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config < (cat /etc/ssl/openssl.cnf < (printf "[SAN]\nsubjectAltName=DNS:example.com,DNS:www.example.com")) > domain.csr

验证域名所有权

Let's Encrypt 在你的服务器上生成一个随机验证文件,再通过创建 CSR 时指定的域名访问,如果可以访问则表明你对这个域名有控制权。

自己并不会写 .htaccess 文件,所以只能老老实实按他访问的路径创建文件夹, 在html下创建 .well-known/acme-challenge/ 目录

创建证书

下载 acme_tiny 脚本
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
指定文件 申请证书
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/html/.well-known/acme-challenge/ > ./signed.crt
下载上游CA证书
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem

生成完整的证书链

cat signed.crt intermediate.pem > chained.pem

3 配置apache2

我自己用apache啊,nginx可以去看 Let's Encrypt,免费好用的 HTTPS 证书 这篇文章

apache环境配置

加载 SSL 模块,启用 SSL 站点
a2enmod ssl
a2ensite default-ssl

编辑 /etc/apache2/sites-available/default-ssl.conf 文件,修改以下字段

SSLCertificateFile /var/www/ssl/chained.pem
SSLCertificateKeyFile /var/www/ssl/domain.key

然后重启一下apache 就应该可以了吧, 访问的时候手动添加一下https前缀进行访问

4 配置自动更新脚本

直接到 /etc/cron.monthly/ 文件夹下建立个renew

#!/bin/bash

cd /var/www/ssl/
python acme_tiny.py --account-key account.key --csr domain.csr --acme-dir /var/www/html/.well-known/acme-challenge/ > signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
systemctl restart apache2

然后 chmod +x 下,每个月自动更新证书就好了

-- EOF --

comments

如果无法加载 请将 disqus.com | disquscdn.com 加入代理