CentOS Nginx 安装Let’s Encrypt 免费ssl证书
随着现在启用SSL证书的网站越来越多,装逼的光环已经黯淡了很多。但是现在运营商劫持越来越厉害了,我个人的域名,同样的配置,没启用SSL证书的经常无法访问。一些博友的网站我也经常无法访问,主要是广东电信太坑爹了,启用https可以避免这个问题。
Let’s Encrypt 这个免费、自动化、开放的证书签发服务。虽然是免费证书,但是十分给力。我也参考了ququ的文章实际体验了一下,虽然最后成功了,但申请过程中还是踩了不少坑,本文在详细介绍下安装方法以及可能遇到的错误。我的其他域名wpista.comgalfond.com都申请了该证书。
虚拟主机上我没研究能否安装,但是自动续签这个应该只能在VPS上进行。其实阿里云非常便宜,选择青岛机房的最低配,一年282,再使用我的9折码AMTU1Y
,一年254,流量费可以忽略不计。图片存储选择又拍云,每天1分钱,偶尔出现个故障会返你1元代金券,基本啥上也算是完全免费了。这个价位应该比一些虚拟主机还便宜,至于选择就看你自己了。
我的服务器环境为Centos 6.5 军哥lnmp 一键安装包。没有使用Let’s Encrypt 官网提供的工具来申请证书,而是用了acme-tiny 这个更为小巧的开源工具。
创建帐号和 CSR 文件
如果多个域名请注意修改相应前缀区分,避免造成证书混乱。
首先ssh登录你的服务器
mkdir ssl/ cd ssl openssl genrsa 4096 > galfond_account.key openssl genrsa 4096 > galfond_domain.key openssl req -new -sha256 -key galfond_domain.key -subj "/" -reqexts SAN -config <(cat /usr/local/openssl/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:galfond.com")) > galfond_domain.csr
执行这一步时,可能会提示找不到/etc/ssl/openssl.cnf
文件,其实是openssl配置文件的位置不对,修改下位置即可,可用下面的命令查找文件位置find / -name "openssl.cnf"
,找到后替换即可。
配置验证服务
我们知道,CA 在签发 DV(Domain Validation)证书时,需要验证域名所有权。传统 CA 的验证方式一般是往 admin@yoursite.com 发验证邮件,而 Let’s Encrypt 是在你的服务器上生成一个随机验证文件,再通过创建 CSR 时指定的域名访问,如果可以访问则表明你对这个域名有控制权。
首先创建用于存放验证文件的目录,例如:
mkdir /home/wwwroot/challenges/
server { server_name www.yoursite.com yoursite.com; location ^~ /.well-known/acme-challenge/ { alias /home/wwwroot/challenges/; try_files $uri =404; } location / { rewrite ^/(.*)$ https://yoursite.com/$1 permanent; } }
获取网站证书
下载脚本并执行
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py python acme_tiny.py --account-key ./galfond_account.key --csr ./galfond_domain.csr --acme-dir /home/wwwroot/challenges/ > ./galfond_signed.crt
如果你的Python 版本为2.6可能会出现argparse
没安装的错误,需要安装一下。
wget https://pypi.python.org/packages/source/a/argparse/argparse-1.4.0.tar.gz#md5=08062d2ceb6596fcbc5a7e725b53746f tar -xzvf argparse-1.4.0.tar.gz cd argparse python setup.py install easy_install argparse pip install argparse
再重新执行命令即可,如果出现以下错误,那应该是Nginx 配置问题,确定目录是否正确,域名是否正确绑定等。
ValueError: Wrote file to /home/xxx/www/challenges/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg,but couldn't download http://www.yoursite.com/.well-known/acme-challenge/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg
搞定网站证书后,还要下载 Let’s Encrypt 的中间证书。在 Nginx 配置中,需要把中间证书和网站证书合在一起:
wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem cat galfond_signed.crt intermediate.pem > galfond_chained.pem
中间证书都是一样的,多个域名无需重复下载。
最终,修改 Nginx 中有关证书的配置并 reload 服务即可:
ssl_certificate /root/ssl/galfond_chained.pem; ssl_certificate_key /root/ssl/galfond_domain.key;
详细配置可以参考我以前写的文章
配置 crontab 及自动更新
如果没有安装crontab 则需要先安装一下
yum install -y vixie-cron
确认是否安装成功:
crontab -l
启动
service crond start
新建renew.sh
#!/bin/bash cd /root/ssl/ python acme_tiny.py --account-key galfond_account.key --csr galfond_domain.csr --acme-dir /home/wwwroot/challenges/ > galfond_signed.crt || exit wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem cat galfond_signed.crt intermediate.pem > galfond_chained.pem service Nginx reload
保存后执行
chmod a+x renew.sh
增加脚本执行权限,然后再执行
crontab -e
0 0 1 * * /root/renew.sh >/dev/null 2>&1
注:需在root帐号下执行,注意脚本位置。
总体来说Let’s Encrypt 相当不错,我给我的好几个域名都申请了该证书,应该没有任何问题了,有问题欢迎留言和我交流。