免费SSL证书

根据 Let’s Encrypt CA 统计,截至 2018 年 1 月,Firefox 加载的网页中启用 HTTPS 的比例占 67%,比去年底的 45% 有巨大提升,单年增长21个百分点。浏览器开发商如 Mozilla, Google 准备采取下一步措施:将所有 HTTP 网站标记为不安全。
随着 HTTPS 的普及,给网站加个 SSL 证书已经是大势所趋而且很有必要了。

目前已经存在不少的免费又好用的SSL证书,以下介绍几个。

Let’s Encrypt

Let’s Encrypt 是国外一个公共的免费SSL项目,它由 ISRG(Internet Security Research Group,互联网安全研究小组)提供服务,而 ISRG 是来自于美国加利福尼亚州的一个公益组织。Let’s Encrypt 由 Linux 基金会托管,它的来头不小,由 Mozilla、Cisco、Akamai、IdenTrust、Electronic Frontier Foundation(EFF)等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由 HTTP 过渡到 HTTPS ,目前 Facebook 等大公司开始加入赞助行列。

Let’s Encrypt 已成为目前使用范围最广泛的免费 SSL 证书,目前不支持通配符SSL证书。但根据 官方博客 宣布,2018年2月27号 将开始提供通配符证书,这是相当不错的利好消息。唯一遗憾的是,Let’s Encrypt 发行的证书有限期只有三个月,虽然可以通过任务计划来自动续期。

申请并生成证书

网上申请

可通过以下在线申请网站,手动申请证书。

在线申请地址(中文)

在线申请地址(英文)

shell 申请

使用该方法的前提是:拥有 shell 权限
官方推荐使用自动化工具 Certbot 来完成全自动化的申请,Certbot 支持所有 Unix 内核的操作系统。详情请看 Certbot的项目地址

本系统是 CentOS6.5 和 Nginx 环境,根据环境获取到相应的 安装教程

下载 Certbot-auto 脚本,并修改权限

1
2
3
# wget https://dl.eff.org/certbot-auto
# chmod a+x certbot-auto
# mv certbot-auto /usr/local/bin/

获取证书

1
# certbot-auto certonly --webroot -w /var/www/html --email admin@xxx.com -d xxx.com -d www.xxx.com

1、该命令会为 xxx.comwww.xxx.com 两个域名生成一个证书。
2、certonly 子命令作用:生成SSL证书,但不去修改 Nginx或Apache 的配置,需要你手动添加。
3、使用 --webroot 模式会在网站根目录 /var/www/html 中创建 .well-known 目录,该目录包含一些验证文件,certbot 会通过访问 http://xxx.com/.well-known/acme-challenge 来验证你的域名是否绑定的这个服务器。这个验证是 Let’s Encrypt 为了验证你是否拥有域名的控制权,避免其他人随意来申请证书。
4、--email 指定邮箱,在证书将要过期后,会有邮件提醒发到这个邮箱。不用 --email 指定邮箱的话,脚本运行过程中会有交互,让你填写邮箱,不利于自动化安装。
5、-d 指定要申请SSL证书的域名。

但有时候,一些域名并没有根目录,如一些微服务,这时候使用 --webroot 就行不通了。Certbot 提供了另外一种模式 --standalone,这种模式不需要指定网站根目录,它会自动启动服务器的 80或者443 端口,来验证域名的归属。若还有其他服务(如 nginx )占用了 80或者443 端口,就必须先停止这些服务,等证书生成后,再启用。

1
# certbot-auto certonly --standalone --email admin@xxx.com -d xxx.com -d www.xxx.com

证书生成后,在 /etc/letsencrypt/live/ 目录下会看到对应域名的文件夹,里边存放了指向证书的快捷方式。

每个域名一个目录,主要包含以下文件:

  • cert.pem :申请的服务器证书文件
  • chain.pem :除服务器证书外,浏览器解析所需的其他全部证书,比如根证书和中间证书
  • fullchain.pem :包含服务器证书的全部证书链文件
  • privkey.pem :服务器证书对应的私钥

Nginx配置启用HTTPS

修改Nginx配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
server_name xxx.com www.xxx.com;
listen 443;
ssl on;
# 公钥路径
ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;
# 私钥路径
ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem;
...
...
}

使配置生效:

1
2
# nginx -t
# nginx -s reload

自动更新 SSL 证书

Let’s Encrypt 提供的证书只有90天的有效期,必须在证书到期之前续期,Certbot 提供了一个很方便的子命令 renew 用于续期 SSL 证书(重新生成证书),他会自动检查系统内的证书,并且自动更新这些证书。

测试 renew 子命令运行,即重新生成证书是否报错(注意,这只是测试,还没真正重新生成证书):

1
# certbot-auto renew --dry-run

对于 --webroot 模式生成的证书,编写任务计划如下:

1
2
# 每隔两个月,凌晨2点,重新生成证书
0 2 * */2 * certbot-auto renew

对于 --standalone 模式生成的证书,重新生成证书还得占用80或者443端口,得提前关闭Nginx服务,编写任务计划如下:

1
2
# 每隔两个月,凌晨2点,重新生成证书
1 2 * */2 * certbot-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start"

--pre-hook 执行更新之前要做的操作
--post-hook 执行更新后要做的操作