CentOS Nginx 安装Let’s Encrypt 免费ssl证书

Let’s Encrypt

随着现在启用SSL证书的网站越来越多,装逼的光环已经黯淡了很多。但是现在运营商劫持越来越厉害了,我个人的域名,同样的配置,没启用SSL证书的经常无法访问。一些博友的网站我也经常无法访问,主要是广东电信太坑爹了,启用https可以避免这个问题。

Let’s Encrypt 这个免费、自动化、开放的证书签发服务。虽然是免费证书,但是十分给力。我也参考了ququ的文章实际体验了一下,虽然最后成功了,但申请过程中还是踩了不少坑,本文在详细介绍下安装方法以及可能遇到的错误。我的其他域名wpista.com galfond.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/

然后修改你的Nginx 域名配置文件并重新载入服务

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 相当不错,我给我的好几个域名都申请了该证书,应该没有任何问题了,有问题欢迎留言和我交流。

Comments : 28

  1. 免费证书会推动 https 的普及

  2. oneinstack 内置了Let’s Encrypt客户端 操作相对简便些

发表留言

Smilies powered by wp-alu

Post Comment