克隆脚本
sudo git clone https://github.com/diafygi/acme-tiny.git
cd acme-tiny
创建Let's Encrypt私钥
openssl genrsa 4096 > account.key
创建CSR(Certificate Signing Request,证书签名请求) 文件
openssl genrsa 4096 > domain.key
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr
注意:openssl.cnf 文件的位置可能会因为linux版本的不同而有变
证明你拥有该域名
acme-tiny脚本会生成验证文件并写入到你指定的目录下,然后通过 ".well-known/acme-challenge/" 这个URL来访问到验证文件. 注意: Let's Encrypt 会对你的服务器做一次http请求来进行验证,因此你需要保证80端口能够访问.
手动生成challenges目录,用来存放验证文件(路径可以根据需要修改)
mkdir -p /var/www/challenges
配置nignx的80端口
server {
listen 80;
server_name yoursite.com www.yoursite.com;
# 让 Let's Encrypt 成功访问到验证文件不受 301 影响
if ( $request_uri !~ "/.well-known/acme-challenge/*" ) {
# 注意进行301重定向到https,否则通过http仍能访问你的站点
return 301 https://yoursite.com$request_uri;
}
location /.well-known/acme-challenge/ {
alias /var/www/challenges/;
try_files $uri =404;
}
#...你的其他配置
}
重要-重启nginx
service nginx restart
获取签名证书
sudo chmod +x acme_tiny.py
sudo python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/challenges/ > ./signed.crt
安装证书
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat www.crt intermediate.pem > www.pem
server {
listen 443;
server_name yoursite.com www.yoursite.com;
ssl on;
ssl_certificate /path/to/chained.pem;
ssl_certificate_key /path/to/domain.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
ssl_session_cache shared:SSL:50m;
ssl_prefer_server_ciphers on;
#...你的其他配置
}
证书自动更新定时任务
恭喜!你的网站已经使用上了HTTPS。 但Let's Encrypt 证书有效期只有90天, 所以需要定期更新。现在只需要写一个更新脚本并把它放到定时任务中即可。
脚本内容:
#!/usr/bin/sh
python /path/to/acme_tiny.py --account-key /path/to/account.key --csr /path/to/domain.csr --acme-dir /var/www/challenges/ > /tmp/signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat /tmp/signed.crt intermediate.pem > /path/to/chained.pem
service nginx reload
定时任务可以设置为每个月执行一次:
0 0 1 * * sudo bash /path/to/renew_cert.sh 2>> /var/log/acme_tiny.log