前段时间在VPS上用了自签名的SSL证书来给HTTPS进行加密,虽然用着没什么问题,但是每次访问都会弹出警告信息,浏览器网址也会变成红色,导致每次都要忽略警告才能访问,所以只能自己访问的时候用HTTPS,不能全局跳转到HTTPS。
点击HTTPS信息,会显示证书未认证
用自签名SSL证书加密HTTPS连接除了上面提到的警告信息以外,还有一个缺点就是无法在Chrome中自动保存密码,这样每次登录都要重新输入密码,非常麻烦。
为了解决这个问题,也想过是不是去申请一个认证机构颁发的SSL证书,但是看了价格之后,就放弃了
今天在逛digitalocean社区的时候看到有篇文章介绍Let’s Encrypt提供免费SSL证书,去官网看了下,感觉比较靠谱,虽然有效期只有90天,但是相比其他动辄几百一年的管理费,算是非常合理了。
由于Let’s Encrypt基于ACME,所以可以实现无人值守状态下自动申请证书,自动更新证书以及自动注销证书。绝对是近年来最具颠覆性的一项发明,HTTPS至今没有得到普及的原因就是由于高昂的管理费和复杂的申请步骤,而Let’s Encrypt把这最大的两个困难都给清除掉了。
Let’s Encrypt的优点
- 证书的生成方法和自己签名证书 一样简单
- 生成的证书在客户浏览器网址栏显示为绿色已认证
- 可以生成无限数量的证书
- 证书可以无限次续期
Let’s Encrypt的缺点
- 证书仅能用于HTTPS加密,无法对网站所有者和机构进行认证
安装letsencrypt
1 2 3 |
$ git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt $ cd /opt/letsencrypt $ ./letsencrypt-auto --help |
申请证书
Let’s Encrypt支持多种申请证书的方法,区别只在于认证域名所有权的方式不同。
Apache验证方式
目前只支持Apache2.4+Debian8,可以自动验证域名所有权并修改SSL配置。
运行命令是
1 |
./letsencrypt-auto --apache -d example.com -d www.example.com |
这里采用一个根域名+一个子域名的格式,这样做有两个好处,首先是后面可以通过程序自动续期,第二是可以最大化利用证书配额。
如果在 /etc/apache2/sites-available 的配置文件里已经配置过HTTPS,letsencrypt会自动替换配置文件里的SSL证书地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<IfModule mod_ssl.c> <VirtualHost *:443> DocumentRoot ... ServerName ... ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/letsencrypt/live/minirplus.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/minirplus.com/privkey.pem <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule> |
如果只想申请证书,可以运行下面的命令,只获取证书,不修改apache配置文件,需要手动修改证书位置
1 |
./letsencrypt-auto certonly --apache -d example.com -d www.example.com |
如果证书到期后,可以用下面的命令刷新证书有效期
1 |
./letsencrypt-auto certonly --apache --renew-by-default -d example.com -d www.example.com |
webroot验证方式
网站根目录验证方式相比Apache验证方式,限制条件要少得多,只要网站能够通过浏览器访问,就可以申请SSL证书。原理是在网站根目录写入签名文件,与Google网站管理员验证网站所有权的方法类似。
命令如下
1 |
./letsencrypt-auto certonly --webroot -w /var/www/example -d example.com -d www.example.com |
注意:网站根目录必须与域名所在的目录对应,如果根域名和子域名不在同一个目录则需要单独指定网站目录。即
1 |
./letsencrypt-auto certonly --webroot -w /var/www/example -d example.com -w /var/www/sub3 -d sub3.example.com |
如果想在一张证书中添加多个域名,可以用下面的命令
1 |
./letsencrypt-auto certonly --webroot -w /var/www/example -d example.com -d www.example.com -w /var/www/thing -d thing.is -d m.thing.is |
这个方法也可以用于更新证书有效期
1 |
./letsencrypt-auto certonly --keep-until-expiring --webroot -w /var/www/example.com -d example.com,www.example.com -w /var/www/thing -d thing.is,m.thing.is |
上面命令中的–keep-until-expiring选项是设定只有在证书到期前30天才执行更新命令,否则不更新证书。而前面的–renew-by-default命令则是不管还剩多少有效期,直接更新证书。
添加子域名
如果要在已经申请的证书上增加子域名,可以运行如下命令
1 |
./letsencrypt-auto certonly --apache --renew-by-default -d minirplus.com -d sub1.minirplus.com -d sub2.minirplus.com -d sub3.minirplus.com |
要保证添加的子域名可以通过浏览器访问,否则无法通过域名所有权认证
虽然这样以后只需要管理一张证书,但这样做有一个坏处,就是可以在证书的信息里看到所有子域名
如果不想让别人在证书信息里看到其他不公开的子域名,只需为子域名单独申请一张证书即可。
1 |
./letsencrypt-auto --apache -d sub2.example.com |
目前Let’s Encrypt对单个域名申请的证书数量有限制,在旧证书上增加域名和新申请一张证书都会占用一个申请名额,所以增加子域名请慎重。
泛域名
尝试了一下泛域名
1 |
./letsencrypt-auto --apache -d minirplus.com -d *.minirplus.com |
返回 Wildcard domains are not supported ,不能用泛域名申请证书。
效果
配置好后,就可以用https访问了,通过HTTPS信息可以看到证书以及被认证了。
添加HTTP到HTTPS跳转
通过在80端口添加跳转,可以强制让所有访问都采用HTTPS
1 2 3 4 5 6 7 8 9 10 11 12 |
<VirtualHost *:80> ServerName mysite.example.com DocumentRoot /usr/local/apache2/htdocs Redirect permanent / https://mysite.example.com/ </VirtualHost> <VirtualHost _default_:443> ServerName mysite.example.com DocumentRoot /usr/local/apache2/htdocs SSLEngine On # etc... </VirtualHost> |
测试HTTPS连接状态
要了解详细的HTTPS信息,可以在以下网站查询
https://www.ssllabs.com/ssltest/
或者直接替换链接中的域名获取HTTPS信息
https://www.ssllabs.com/ssltest/analyze.html?d=ChangeToYourDomain&hideResults=on
自动更新证书
证书有效期为90天,如果嫌手动更新麻烦,可以添加执行脚本到计划任务,自动更新证书有效期,脚本来自digitalocean官方,更新时间为每周一的2:30,如果检测到有效期在30天内则自动续期
1 2 3 4 5 |
sudo curl -L -o /usr/local/sbin/le-renew http://do.co/le-renew sudo chmod +x /usr/local/sbin/le-renew sudo crontab -e # Weekly Update 30 2 * * 1 /usr/local/sbin/le-renew example.com >> /var/log/le-renew.log |
注意:自动更新脚本默认的软件位置为 /opt/letsencrypt ,如果没有将letsencrypt下载到这个位置,需要重新下载或移动至该位置。更新脚本基于域名来过滤证书,所以在生成证书的时候保证第一个域名为根域名。
配额和限制
letsencrypt目前对证书的申请频率做了限制,如果超过限制会返回
1 |
There were too many requests of a given type :: Error creating new cert :: Too many certificates already issued for: minirplus.com |
目前的限制方式有
Registrations/IP:10次/3小时,即单个IP每三小时只能注册10次,所以如非必要不要删除已注册的认证文件,特别是如果主机是共享IP的。
Certificates/Domain:5证书/7天,即单个域名下每隔7天才能申请5张证书,证书是以根域名+1个子域名计数的,也就是说如果像下面这样申请证书虽然只申请了4个,但是也达到了限制数量,因为第三个证书因为有两个子域名占用了两个配额,而第四个证书虽然和第二个证书重复,但是也占用了一个配额
1 2 3 4 |
www.example.com example.com www.example.com webmail.example.com ldap.example.com example.com www.example.com |
因此,在申请证书的时候,避免重复申请证书,否则就浪费了一个配额,也不要随便申请,毕竟一个礼拜只能申请4张。而且就算证书申请错了没有用也不要删除已经申请的证书,因为再次申请要等待7天,而且注销证书并不会释放配额!来源
注意:更新证书也会使用一个配额!!!
其他问题
第一次运行./letsencrypt-auto命令会安装很多依赖包,要花点时间
申请SSL证书的域名必须已经a2ensite启用,否则无法通过所有权认证。
同一个域名下的子域名增加证书不用重复申请,只需用证书更新命令,在原命令后用-d增加子域名刷新证书即可,否则在证书列表里会出现两个一样域名的证书,虽然没什么大问题,但是会影响证书的管理。
/etc/apache2/sites-available里的配置文件名需要和域名保持一致,否则无法自动修改配置。
链接
How to Set Up Let’s Encrypt Certificates for Multiple Apache Virtual Hosts on Ubuntu 14.04
SSL Report: blog.minirplus.com (106.185.32.69)
免费SSL证书Let’s Encrypt安装使用教程:Apache和Nginx配置SSL
https://github.com/letsencrypt/letsencrypt
https://letsencrypt.readthedocs.org/en/latest/index.html
There are no comments yet