Let's Encrypt

Wednesday, March 29, 2017

这两天成功将我的博客 悟禅小书童 启用了 Https,终于在网站域名前面加上了小绿锁,中间经历了一些坑,特记录下。

站点启用 Https 分为两个部分:

  1. VirtualHost 启用 Https
  2. 站点内容启用 Https

VirtualHost 启用 Https

概述

在开始操作前需要先解释下 HttpsLet's Encrypt

HTTPS(也称为TLS over TLS,HTTP over SSL,和HTTP Secure)是一种用于通过互联网广泛使用的计算机网络进行安全通信的协议。 HTTPS由传输层安全加密的连接中的超文本传输协议(HTTP)或其前身Secure Sockets Layer进行通信。 HTTPS的主要动机是访问网站的身份验证和交换数据的隐私和完整性的保护。

Let's Encrypt 是2016年4月12日推出的认证机构,通过自动化过程为传输层安全(TLS)加密提供免费的X.509证书,旨在消除当前手工创建,验证的复杂过程 ,签署,安装和更新安全网站的证书。

简单说,Let's Encrypt 会帮我们生成 免费 的 Https 证书,并且会根据我们的服务器环境和操作系统,提供一系列的软件,来帮我们自动将我们的 Virtual Host 启用 Https 证书。

开始安装

打开 Certbot 官网 ,选择我们的服务器环境和操作系统,我使用的是 ApacheCentOS 6

下载 certbot-auto 并赋予相应的权限

$ wget https://dl.eff.org/certbot-auto
$ chmod a+x certbot-auto

安装相应的依赖并更新客户端代码

$ ./certbot-auto

安装apache插件

$ ./certbot-auto --apache

设置证书到期自动更新

$ ./certbot-auto renew --dry-run

安装过程中可能碰到的问题:

  1. Python 版本的问题导致 certbot-auto 依赖安装失败,解决办法是:升级Python到2.7

  2. 生成证书时需要设置域名、邮箱等信息

  3. 生成的证书存放在 /etc/letsencrypt/live/yourdomain ,包含四个证书文件

[root@iZkp6laZ blog.lerzen.com]# pwd /etc/letsencrypt/live/blog.lerzen.com [root@iZkp6laZ blog.lerzen.com]# ll total 4

Apache服务器端证书

lrwxrwxrwx 1 root root cert.pem

Apache根证书和中继证书

lrwxrwxrwx 1 root root chain.pem

Nginx所需要ssl_certificate文件

lrwxrwxrwx 1 root root fullchain.pem

安全证书KEY文件

lrwxrwxrwx 1 root root privkey.pem

4. 证书配置完成后,如果访问失败,记得检查对应的 `VirtualHost` 中项目的路径

	```shell
	<VirtualHost _default_:443>
	DocumentRoot "/var/www/html/blog/public"

	ErrorLog logs/ssl_error_log
	TransferLog logs/ssl_access_log
	LogLevel warn

	SSLEngine on

	SSLProtocol all -SSLv2

	SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES

	SSLCertificateFile /etc/letsencrypt/live/blog.lerzen.com/cert.pem

	SSLCertificateKeyFile /etc/letsencrypt/live/blog.lerzen.com/privkey.pem

	<Files ~ "\.(cgi|shtml|phtml|php3?)$">
		SSLOptions +StdEnvVars
	</Files>
	<Directory "/var/www/cgi-bin">
		SSLOptions +StdEnvVars
	</Directory>

	SetEnvIf User-Agent ".*MSIE.*" \
			 nokeepalive ssl-unclean-shutdown \
			 downgrade-1.0 force-response-1.0

	CustomLog logs/ssl_request_log \
			  "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

	ServerName blog.lerzen.com
	SSLCertificateChainFile /etc/letsencrypt/live/blog.lerzen.com/chain.pem
	</VirtualHost>
	```

## 站点内容启用 Https

我的博客内容中使用到 Https 的地方有两个:

1. 第三方样式、字体及脚本
	
	我的博客中使用到了第三方的字体服务商 [有字库](https://www.youziku.com/),它支持 `Https` 链接,所以只需要在代码中将 `Http` 替换成 `Https` 即可。
	
2. 云存储图片

	我的博客使用的是 [七牛云存储图片](http://www.qiniu.com/?utm_campaign=baiduSEM&utm_source=baiduSEM&utm_medium=baiduSEM&utm_content=baiduSEM),默认是 `Http` 链接,幸好七牛提供了 [免费的 `Https` 证书](https://developer.qiniu.com/fusion/manual/qiniu-free-certificate?from=draft) , 具体的操作流程如下:
	
### 申请免费证书

1. 打开 [七牛免费证书页面](https://portal.qiniu.com/ssl?tab=crt),点击 [申请证书],填写要申请证书的域名及自己的一些信息,这里需要注意的是,七牛的证书是 `一个证书对应一个域名`。

2. 填写完成后会跳转到 [证书订单页面](https://portal.qiniu.com/ssl?tab=order),复制刚才生成订单的 `TXT Key` 和 `TXT Value`。

	![](https://blog.cdn.lerzen.com/7d2364e0-13f5-11e7-8b6a-0b9cbc4f6c84.jpg)
	
3. 打开自己购买的域名的解析页面,新建解析记录,记录类型选择 `TXT`,主机记录填写上一步复制的 `TXT Key`,记录值填写上一步复制的 `TXT Value`。

	![](https://blog.cdn.lerzen.com/408a5880-13f6-11e7-94ee-2d69536d59a9.jpg)
	
	> 注:万网和DNSpod平台TXTkey不需要复制主域名部分

4. 域名解析记录配置好后,七牛会自动开始验证,一般十来分钟二十分钟就会出结果,通过后证书订单记录后面会显示 `已完成`,证书列表就会出现对应的证书信息。

	> 我第一次申请时,订单列表一直显示 `循环验证中`,一天后还是这样显示,尝试重新申请了一个,十来分钟后就通过了。
	
### 创建存储空间
	
打开 [存储空间页面](https://portal.qiniu.com/bucket/create),点击[新建存储空间],根据表单要求填写相应信息并创建
	
### 创建融合CDN

1. 打开 [融合CDN页面](https://portal.qiniu.com/domain/),点击[新建加速域名]

2. 根据要求填写相应信息,[加速域名]填写刚才申请证书的域名,[通信协议]选择 `HTTPS`,下方的证书选择刚才申请的证书,[源站配置]选择刚才创建的存储空间名称,填写完成后点击[创建]。
	
	![](https://blog.cdn.lerzen.com/789e6a90-13f7-11e7-acbc-0de4803b9746.jpg)
	
	> 七牛提示创建HTTPS域名需要最多一周时间,但实际测试中只需要十几分钟即可。
	
3. 域名创建好后需要配置下 CDN解析,这一步需要打开自己的域名解析页面,修改之前该域名的解析记录,将记录类型修改为 `CNAME`,记录值修改为七牛为你提供的CNAME值,点击保存即可。

	> 七牛提供的CNAME值可以在七牛融合CDN域名详情中找到。
	
4. 打开 [存储空间页面](https://portal.qiniu.com/bucket/create),找到自己刚创建的存储空间,点击内容管理,在外链默认域名处选择自己刚创建的域名,点击保存即可。

	![](https://blog.cdn.lerzen.com/d24001d0-13f8-11e7-8f2a-dda48cd0cab3.jpg)
	
## 小结
至此,网站的 `Https` 就正式启用了,当时启用时,碰到了两个问题:

1. 阿里云的CentOS 默认的 Python 版本是 `2.6`,需要升级到 `2.7`,但我升级后发现使用的 `pip`的版本还是之前的版本,解决办法是:重新安装pip。

2. 申请七牛SSL证书,一天多的时间一直显示 `循环验证中`,解决办法是:重新申请证书。
SSL Let's Encrypt

CentOS6升级PHP7.0及安装ZIP扩展Homestead使用问题及解决方式