去年运营商大面积劫持http,咱们公司的小网站也未能幸免。当时不少用户投诉,立刻升级https还有所顾虑,因此当时简单hack了一下。在html中作多种判断,若是是在div中加广告,就把这个div干掉;若是内嵌到iframe中,就改变url,从新加载。暂时解决了,可是治标不治本,因此最近就进行https的升级。html
Let's Encrypt是去年十二月份开始公测的,能够免费申请证书。其签发的证书已经得到了交叉信任,已经能被全部主流浏览器信任了。交叉签名来自 IdenTrust Root CA。python
官方提供了自动获取证书的工具[letsencrypt-auto],只需一条命令,便可获取证书。第一步是下载工具:nginx
git clone https://github.com/letsencrypt/letsencrypt
执行命令./letsencrypt-auto
便可启动客户端,在执行以前,咱们来看看它的用法。letsencrypt-auto
官方集成了几个插件来帮助咱们使用:git
apache 在Debian相关系统的Apache 2.4上,能够实现自动获取和安装证书github
standalone 直接获取证书。这个在申请过程当中,会启动一个服务占用80端口,并以此来进行域名全部者验证web
webroot 若是本身启动了web服务器,这个命令会在根目录中写文件,以便letsencrypt来验证全部者apache
manual 彻底手动,本身动手,丰衣足食json
nginx 测试中,等稳定了再加入
letsencrypt-auto
浏览器
因此,若是正在运行apache服务器,能够执行 ./letsencrypt-auto --apache -d example.com -d www.example.com -d other.example.net
,这个会获取证书,并安装。
若是没有web服务器,能够执行: ./letsencrypt-auto certonly --standalone -d example.com
。bash
用过letsencrypt-auto
就知道里面有不少坑了。
我在用的过程当中,发现python2.6不支持,python3.5不支持,后来安装python2.7.11才能够运行。
安装python以前,要安装bz2压缩相关的包,否则执行letsencrypt-auto
会报错。
python的源,我用aliyun的不行,提示有个版本的包找不到,换成豆瓣的才能够http://pypi.douban.com/
。
因此acme-tiny出现了,建议使用这个来代替letsencrypt-auto
。
openssl genrsa 4096 > account.key
openssl genrsa 4096 > domain.key #对于单个域名,执行下面这条语句 openssl req -new -sha256 -key domain.key -subj "/CN=yoursite.com" > domain.csr #对于多域名,能够执行下面这条语句 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
mkdir -p /var/www/challenges/
这个文件夹能够是任意文件夹,记得nginx有权限读便可。配置nginx:
server { listen 80; server_name yoursite.com www.yoursite.com; location /.well-known/acme-challenge/ { alias /var/www/challenges/; try_files $uri =404; } ...the rest of your config }
验证域名全部者,就是经过在/.well-known/acme-challenge/
里写文件,而后经过公网来访问,看能不能访问到来判断的。
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/challenges/ > ./signed.crt
提示成功后,signed.crt就是证书,对应的私钥就是domain.key。若是要申请多个,account.key能够不用变化,其余都要变。
对于nginx,还须要额外步骤:
wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem cat signed.crt intermediate.pem > chained.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_dhparam /path/to/server.dhparam; ssl_prefer_server_ciphers on; ...the rest of your config }
能够经过crontab来定时更新证书。脚本renew_cert.sh
示例:
#!/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-x1-cross-signed.pem > intermediate.pem cat /tmp/signed.crt intermediate.pem > /path/to/chained.pem service nginx reload
#每个月1号执行 0 0 1 * * /path/to/renew_cert.sh 2>> /var/log/acme_tiny.log
更新证书时,要保证步骤3设置不变,即letsencrypt服务器可以访问对应域名下的/.well-known/acme-challenge/
文件夹
同一个ip在3小时内最多申请10个域名的证书
同一个根域名在七天内,只能注册5个证书。同一个子域名注册或更新都是要计算次数的。