Let's Encrypt的SSL证书使用

Let's Encrypt 官网https://letsencrypt.org

Let's Encrypt 开源https://github.com/certbot/certbot

Let's Encrypt是国外一个公共的免费、开源、自动续期的SSL项目,由 Linux 基金会托管,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由HTTP过渡到HTTPS,目前Firefox、Chrome、Facebook、思科等大公司开始加入赞助行列。

Encrypt已经得了 IdenTrust 的交叉签名,这意味着其证书现在已经可以被Mozilla、Google、Microsoft、Apple等主流的浏览器所信任,你只需要在Web 服务器证书链中配置交叉签名,浏览器客户端会自动处理好其它的一切,Let's Encrypt安装简单,未来大规模采用可能性非常大。

目前Let's Encrypt免费SSL证书默认是90天有效期,但是官方提供脚本命令,到期自动续约,不影响正常的尝试和使用。

Let's Encrypt 支持一个SSL证书用于多个DV域名,前提是在同一台服务器上,即IP地址相同,

例如 mimji.com、mimji.net、mimji.cn,在同一台服务器上,都共享同一个SSL证书 mimvp.com.cert 

若是不同服务器,scp拷贝预计也可以,每次定时任务更新SSL证书后,定时拷贝到其它服务器上(设想,没测试过)

 

验证网站使用了 SSL HTTPS

https://cryptoreport.websecurity.symantec.com/checker/

验证米扑代理: https://proxy.mimvp.com

 

HTTPS看起来很美丽,但是存在很多的问题得解决:

1、访问速度

HTTPS会使网站访问速度变慢,这个问题也是很多站长纠结不上HTTPS的原因,

其次是SSL大多收费且还不便宜。网站上HTTPS之前,

最好先把服务器系统CentOS、PHP、Nginx等LNMP升级,方便支持最新的特性,提高网站性能。

比如:

1) 操作系统升级到CentOS 7.3,采用SSD固态硬盘

2) PHP版本升级到7.1.9,并开启opcache加速,推荐:PHP 开启优化加速模块 Opcache

3) Nginx升级到了1.11.1,因为Nginx1.9.5版本以上开始支持http2,所以才能用上了http2

nginx 支持 http2,参见 Module ngx_http_v2_module,需要加上编译参数 --with-http_v2_module

米扑科技搭建的云服务器编译命令如下:

./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module

详见米扑博客:LNMP(CentOS+Nginx+Mysql+PHP)服务器环境配置 (Nginx 编译命令部分)

http2需要浏览器配合,Chrome和Firefox浏览器都已经在2015年就支持了http2,http2给https加速不少。

例如,米扑科技的域名:https://mimvp.com   或  米集财富: https://mimji.com

1)FireFox 火狐浏览器查看

浏览器打开米扑科技首页 https://mimvp.com —> F12 开发者工具  —>  网络   —> 消息头,如下图

let-s-encrypt-jia-mi-ssl-zheng-shu-bing-qiang-zhi-qi-yong-https-fang-wen-31

 

2)Chrome 谷歌浏览器查看

打开链接:chrome://net-internals/#http2

let-s-encrypt-jia-mi-ssl-zheng-shu-bing-qiang-zhi-qi-yong-https-fang-wen-32

经过服务器硬件和软件的升级,米扑科技及其产品都开启https后,访问速度提高很多、网页打开速度很快。

 

2、代码兼容

开启HTTPS后,网页里不能再调用http的资源了,包括js、iframe框架都不行,甚至调用远程的http图片地址也会导致浏览器的绿色标识消失。很多第三方用户登录后的头像地址却是http的,不同的登录用户支持https的情况也不一样,目前发现微博和QQ登录是支持https,而其它的社交网站用户很多不支持https,最终要修改js,兼容判断http和https后,才能正常显示https头像。

https 和 http 不兼容检测及解决方案,请见米扑博客:HTTPS 和 HTTP 站点的优劣

 

3、浏览器兼容

很多的SSL证书对浏览器兼容不好,经过测试各大浏览器都很友好。

目前WoSign的免费SSL证书已经被Apple不信任(WoSign也已经在2016年9月停止了免费证书服务),

WoSign和StartSSL的一年之内签发的所有证书也会被Mozilla不信任,这2家的免费证书就不要考虑了。

米扑博客推荐:

十大免费SSL证书:网站免费添加HTTPS加密

https SSL 免费证书服务申请 (推荐

Let's Encrypt 强烈推荐

 

 

Let's Encrypt 安装配置教程

根据官方的要求,在VPS、服务器上部署Let's Encrypt免费SSL证书之前,需要系统支持Python2.7以上版本以及支持GIT工具。

这个需要根据不同的系统版本进行安装和升级,因为有些服务商提供的版本兼容是完善的,尤其是debian环境兼容性比CentOS好一些。

 

 

准备条件

1. 需要有域名,它会生成指定域名的证书 (填IP会报错,不支持)

2. 需要在域名指向的服务器上操作,能访问https (不然会报找不到443端口的错误)

3. 需要 Linux/Unix 环境,Shell 命令

4. Python 2.7版本以上、已安装 git

 

比如CentOS 6 64位环境不支持GIT,可以先执行安装命令:

yum -y install zlib-devel openssl-devel perl cpio expat-devel gettext-devel curl git git-core

Debian环境,运行:  sudo apt-get -y install git

CentOS环境,运行: sudo yum -y install git-core

Python 插件,运行: sudo pip install pyOpenSSL cryptography       (必须安装,否则后面会报错

pyOpenSSL 插件: https://pypi.python.org/pypi/pyOpenSSL             推荐此方式,编译安装

cryptography 插件: https://pypi.python.org/pypi/cryptography           推荐此方式,编译安装

 

1. 安装

本文以 CentOS7 + Nginx 为例

官网教程:https://certbot.eff.org/#centosrhel7-nginx

安装 certbot-nginx

sudo yum -y install certbot-nginx

 

1)如果 nginx 是默认安装,其默认配置如下

nginx 命令:  /usr/sbin/nginx

nginx 配置文件: /etc/nginx/nginx.conf

nginx 配置路径: /etc/nginx/conf.d/*.conf

nginx 网站根目录:/usr/share/nginx/html/

可以直接执行命令:

sudo certbot --nginx               (nginx 默认检查域名,不成功

或者

certbot certonly --manual -d mimvp.com -d www.mimvp.com -d mimvp.cn -d www.mimvp.cn    (manual 手动输入域名,成功,推荐

或者

certbot certonly --manual      (manual 手动输入域名,成功,推荐

如下图,红框部分,是需要手动输入的内容:

let-s-encrypt-jia-mi-ssl-zheng-shu-bing-qiang-zhi-qi-yong-https-fang-wen-03

如上图,每次点击确认 “Press Enter to Continue”之前,先设置验证文件内容,如:

cd /usr/share/nginx/html/

mkdir -p .well-known/acme-challenge/

echo "_xVtyh-YuEaodU8FSDDLrCL_rNCDNwinCMVATuXkSQI.08JQBZxvrn8-I_8RnHCenIVPrpyO4i2Z5hS_wzk1hPk
" > .well-known/acme-challenge/_xVtyh-YuEaodU8FSDDLrCL_rNCDNwinCMVATuXkSQI

确保可以通过对应的链接,获取到指定的文件内容:

http://mimvp.com/.well-known/acme-challenge/_xVtyh-YuEaodU8FSDDLrCL_rNCDNwinCMVATuXkSQI

如上的多个域名 mimvp.com, www.mimvp.com, mimvp.cn, www.mimvp.cn ,都参照如上示例配置、验证

最后,成功验证后的界面如下:

let-s-encrypt-jia-mi-ssl-zheng-shu-bing-qiang-zhi-qi-yong-https-fang-wen-04

存储 letsencrypt 目录文件如下:

# tree /etc/letsencrypt/
/etc/letsencrypt/
├── accounts
│   └── acme-v01.api.letsencrypt.org
│       └── directory
│           └── d56d390f5f403902a7f5d3e0a2b3e43c
│               ├── meta.json
│               ├── private_key.json
│               └── regr.json
├── archive
│   └── mimji.com
│       ├── cert1.pem
│       ├── chain1.pem
│       ├── fullchain1.pem
│       └── privkey1.pem
├── csr
│   └── 0000_csr-certbot.pem
├── keys
│   └── 0000_key-certbot.pem
├── live
│   └── mimji.com
│       ├── cert.pem -> ../../archive/mimji.com/cert1.pem
│       ├── chain.pem -> ../../archive/mimji.com/chain1.pem
│       ├── fullchain.pem -> ../../archive/mimji.com/fullchain1.pem
│       ├── privkey.pem -> ../../archive/mimji.com/privkey1.pem
│       └── README
└── renewal
    └── mimji.com.conf

 

在完成Let's Encrypt证书的生成之后,在"/etc/letsencrypt/live/mimji.com/"域名目录下有5个文件。

# ll /etc/letsencrypt/live/mimji.com/
lrwxrwxrwx 1 root root  33 Sep 25 15:32 cert.pem -> ../../archive/mimji.com/cert1.pem
lrwxrwxrwx 1 root root  34 Sep 25 15:32 chain.pem -> ../../archive/mimji.com/chain1.pem
lrwxrwxrwx 1 root root  38 Sep 25 15:32 fullchain.pem -> ../../archive/mimji.com/fullchain1.pem
lrwxrwxrwx 1 root root  36 Sep 25 15:32 privkey.pem -> ../../archive/mimji.com/privkey1.pem
-rw-r--r-- 1 root root 543 Sep 25 15:32 README

1)cert.pem  - 服务器端证书

2)chain.pem  - 根证书和中继证书

3)fullchain.pem  - Nginx服务器端所需要ssl_certificate文件

4)privkey.pem - 安全证书私有KEY文件

README - 对生成密钥文件的解释说明,查看其内容如下:

# cat /etc/letsencrypt/live/mimji.com/README    
This directory contains your keys and certificates.

`privkey.pem`  : the private key for your certificate.
`fullchain.pem`: the certificate file used in most server software.
`chain.pem`    : used for OCSP stapling in Nginx >=1.3.7.
`cert.pem`     : will break many server configurations, and should not be used
                 without reading further documentation (see link below).

We recommend not moving these files. For more information, see the Certbot
User Guide at https://certbot.eff.org/docs/using.html#where-are-my-certificates.

 

2)如果 nginx 是自定义安装,其自定义配置如下

nginx 命令:  /usr/local/nginx/sbin/nginx

nginx 配置文件: /usr/local/nginx/conf/nginx.conf

nginx 配置路径: /usr/local/nginx/conf/*.conf

nginx 网站根目录:/usr/local/nginx/html/

手动给域名添加SSL证书,执行命令如下:

certbot certonly --manual -d mimvp.com -d www.mimvp.com -d mimvp.cn -d www.mimvp.cn    (manual 手动输入域名,成功,推荐

或者

certbot certonly --manual      (manual 手动输入域名,成功,推荐

剩下的配置文件内容验证,请参考上面的步骤

 

 

2. 配置

Ngnix 服务配置很简单,需要用到 fullchain.pem 和 privkey.pem 两个证书文件

最好不要移动和复制文件,因为续期SSL证书,直接生成到默认的目录文件就可以,不需要再手工复制。

vim /etc/nginx/conf.d/nginx_mimvp_mimji.conf

server
{
	listen 443 ssl http2;   ## 如果需要spdy也可以加上,lnmp1.2及其后版本都默认支持spdy,lnmp1.3 nginx 1.9.5以上版本默认支持http2
	server_name mimji.com mimji.net mimji.cn;     	## 这里是你的域名
	index index.html index.htm index.php;			## 默认解析文件
	root /usr/share/nginx/html/;            		## 网站目录

	ssl_certificate /etc/letsencrypt/live/mimji.com/fullchain.pem;    #前面生成的证书,改一下里面的域名就行
	ssl_certificate_key /etc/letsencrypt/live/mimji.com/privkey.pem;   #前面生成的密钥,改一下里面的域名就行

	ssl_session_cache shared:SSL:10m;
	ssl_session_cache shared:le_nginx_SSL:1m;
	ssl_session_timeout 1440m;

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_prefer_server_ciphers on; 

	ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";
 
     ......
}

 

 

3. 续期

从上面生成的文件中可以看到,Let's Encrypt证书是有效期 90天(三个月有效期),需要我们自己手工更新续期才可以。

Your cert will expire on 2017-12-24 (申请日期为 2017-09-25

1)测试自动更新

certbot renew --dry-run

会提示错误:

Attempting to renew cert (mimji.com) from /etc/letsencrypt/renewal/mimji.com.conf produced an unexpected error: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.',). Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/mimji.com/fullchain.pem (failure)

错误提示原因是:

'An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.'

根据错误提示,在Let's Encrypt 官网查找原因,解决方案 Pre and Post Validation Hooks

Certbot allows for the specification of pre and post validation hooks when run in manual mode. The flags to specify these scripts are --manual-auth-hook and --manual-cleanup-hook respectively and can be used as follows:

certbot certonly --manual --manual-auth-hook /path/to/http/authenticator.sh --manual-cleanup-hook /path/to/http/cleanup.sh -d secure.example.com

于是,根据提示解决步骤如下:

1. 创建手动授权脚本,输入如下命令

vim /etc/letsencrypt/renewal/mimji.com.sh 

#!/bin/bash
echo $CERTBOT_VALIDATION > /usr/share/nginx/html/mimvp_home/.well-known/acme-challenge/$CERTBOT_TOKEN

其中,/usr/share/nginx/html/mimvp_home/ 为您域名验证的网站根目录

使脚本可执行:

chmod +x /etc/letsencrypt/renewal/mimji.com.sh

 

2. 带参数执行命令

certbot renew --dry-run --manual-auth-hook /etc/letsencrypt/renewal/mimji.com.sh      

注意:多试几次,第一次失败,第二次后都成功了

let-s-encrypt-jia-mi-ssl-zheng-shu-bing-qiang-zhi-qi-yong-https-fang-wen-06

 

如果测试一切正常,再手动更新

certbot renew

或    

certbot renew --quiet      // 不会提示任何信息,错误、警告都不会提示

或  

certbot renew --force-renew       // 会提示错误、警告信息,等同于 certbot renew --dry-run

certbot renew --force-renew --manual-auth-hook /etc/letsencrypt/renewal/mimji.com.sh   (推荐

let-s-encrypt-jia-mi-ssl-zheng-shu-bing-qiang-zhi-qi-yong-https-fang-wen-07

以上测试,都通过了,可以添加定时任务自动更新,比如用 cron 或者 systemd

# m h  dom mon dow   command
#SHELL=/bin/sh

30 2 * * 0  /usr/bin/certbot renew 
30 3 1 * *  /usr/bin/certbot renew --force-renewal
50 3 1 * *  /etc/init.d/nginx restart

上述定时任务,表示每周一凌晨2点30分会检查更新;每月的凌晨3点30分,会强制更新;

然后,每月凌晨3点30分,会重启Nginx服务,使SSL证书生效(每月都强制更新重启一次

 

更新证书命令(测试用,不推荐

certbot certonly --renew-by-default --email abc@mimvp.com -d mimji.com -d mimji.net -d mimji.cn

let-s-encrypt-jia-mi-ssl-zheng-shu-bing-qiang-zhi-qi-yong-https-fang-wen-05

 

 

4. 验证

米扑科技  https://mimji.com

let-s-encrypt-jia-mi-ssl-zheng-shu-bing-qiang-zhi-qi-yong-https-fang-wen-08

 

 

总结

通过米扑博客的详细教程,我们肯定学会了利用Let's Encrypt免费生成和获取SSL证书文件,

随着Let's Encrypt的应用普及,SSL以后直接免费不需要购买,

因为大部分主流浏览器都支持且有更多的主流商家的支持和赞助,HTTPS以后看来也是趋势。

 

HTTPS是未来趋势,该不该上https站,米扑博客推荐上https,毕竟是网络时代的发展大趋势,顺势而为。

一些安全性要求比较高的网站,比如电商、支付、金融网站最好上https

一些小型网站,比如新闻、博客、论坛等网站,还是推荐上,最起码代表热爱技术、拥抱变化。

 

https 是时代的发展趋势,目前已经有很多免费、低价的SSL证书提供商,米扑博客总结如下:

十大免费SSL证书:网站免费添加HTTPS加密

 

https SSL 免费证书服务申请

https 免费证书申请与安装

 

 

 

参考推荐

十大免费SSL证书:网站免费添加HTTPS加密

https网站引用http路径的js和css失效解决办法

HTTP 协议的历史进化演变

HTTPS 和 HTTP 站点的优劣

https SSL 免费证书服务申请 (推荐

https 免费证书申请与安装

httpd使用ssl模块配置HTTPS

Nginx使用ssl模块配置HTTPS

LNMP(CentOS+Nginx+Mysql+PHP)服务器环境配置

Apache 和 Nginx 编译、配置、验证 HTTP/2 协议

Mac 安装Nginx with-http_ssl_module