Let's Encrypt一个于2015年三季度推出的数字证书认证机构,提供免费的ssl证书,Let's Encrypt的证书颁发机制基于ACME协议(ACME protocol),ACME协议是什么不用梳理的很清楚,简单点来说就是一种用于快速认证、颁发ssl证书的处理流程和认证机制。
通常获取ssl证书都有一步需要验证域名拥有者的过程,避免证书颁发给了非域名拥有者或管理者,通常的做法是数字证书认证机构向拟申请ssl证书的域名为后缀的特定邮箱发送一封验证码邮件,或者让你在域名记录中添加一条特定的记录(txt记录、mx记录等等不一而同);而ACME协议则简化了这个过程,可以直接通过http(或https)自主认证,简单点来说就是:证书颁发机构能够通过域名直接访问到你服务器上特定的标识文件,就证明你是该域名的拥有者。能够证明你是该域名的拥有者或者说管理者,就可以直接向该域名颁发ssl证书了。
letsencrypt基于ACME协议自助颁发证书的过程由letsencrypt提供一个工具完成,工具名称现在叫做:certbot,在linux下certbot工具安装后也就是certbot命令。
letsencrypt官方网站:https://letsencrypt.org/
certbot有个英文教程网站:https://certbot.eff.org/
一、安装certbot工具
Certbot是用Python写的,官方建议Python2.7及其以上环境。建议嘛!不是非得2.7的。CentOS6系列默认的Python是2.6.6,实际测试发现也是可以使用的,不要惊慌的升级CentOS6系列下的Python结果搞死一堆软件。
开始之前有一个点要留意:拟申请ssl证书的域名(包括主机名部分)需要解析到公网能访问到的机器上,并且整个操作过程均在该机器上执行;本次示例仅申请单域名ssl证书。
本次部署使用的生产环境为centos6.5_x86,centos的6系列和7系列安装certbot还是有稍许差异的。6系列yum的epel库中尚未收录certbot,所以建议使用github下载源码的方式安装。以下分centos7系列和centos6系列讲解安装certbot的方法,其目的就是将certbot工具正确安装上。
1、centos7系列安装certbot
##安装epel-release扩展包 yum install epel-release ##更新yum缓存 yum makecache ##直接yum安装certbot yum install certbot
默认yum源里的epel-release工具版本太低,直接rpm安装:
1、打开网页 https://dl.fedoraproject.org/pub/epel/7/x86_64/e/ 2、查找该网页中列出的epel-release软件包,找到该软件包的url,本次试验为:https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm 3、rpm安装epel-release包 rpm -vih https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm 或者 wget https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm rpm -ivh epel-release-7-8.noarch.rpm 4、yum makecache 5、yum install certbot
2、centos6系列安装certbot
这也是本次试验的安装方法,centos6系列的epel库里没有收录certbot这个rpm包,只能从github下载release包或者直接git克隆certbot项目的源代码。所以又有2种安装方法,选择一种即可:
2.1、了解git版本库工具和git这个命令的安装方法
直接使用git的克隆命令,将github上certbot项目的代码克隆至本地就可以使用:
##使用git命令克隆certbot这个项目到当前目录 git clone https://github.com/certbot/certbot
请先确保你的服务器环境支持git,也就是git这个命令可以正常跑起来。天朝由于众所周知的原因,git命令从github克隆项目,有时候会比较耗时。该克隆命令执行完毕,当前工作目录下将会自动生成一个名为certbot的文件夹。
2.2、直接下载release包的方法
github上每个项目都有不同版本的release包提供下载,直接下载certbot项目已release的包,本次试验之时certbot在github上的最新release为0.9.3
##wget命令下载最新的release包并在当前工作目录下重新命名为certbog.tgz wget -O certbog.tgz https://codeload.github.com/certbot/certbot/tar.gz/v0.9.3 ##解压certbog.tgz这个要所报 tar zxvf certbog.tgz ##为了便于统一叙述将解压出来的certbot-0.9.3文件夹重命名为certbot mv certbot-0.9.3 certbot
无论你使用2.1还是2.2中的方法得到certbot的源码后,目前在你的工作目录下将产生一个名为certbot的文件夹,进入该文件夹会发现有一个certbot-auto的可执行文件,并没有发现名为certbot的可执行文件;其实呢这个certbot-auto和certbot是同一回事。
centos7系列通过yum安装后环境变量里就可以直接使用certbot命令了,而centos6系列则需要使用完整路径的certbot-auto命令,要是嫌麻烦可以将当前工作目录下的certbot路径加入环境变量。
安装完certbot,主要就是为了使用certbot或者(certbot-auto)这个命令,分为centos7和centos6两个系列讲解安装方法是因为本次我的示例环境是centos6系列。这里假设你对环境变量、软链接已熟悉,并可以在命令行下正常使用certbot或(certbot-auto)命令。
二、使用certbot工具申请letsencrypt的免费ssl证书
申请ssl证书之前,先梳理几个要点:
1、确定好拟申请ssl证书的域名,这里为了便于说明假设申请ssl的域名为:c1c2.test.com,你也可以申请www.test.com、account.test.com等其他域名(和主机),没有本质上的区别,仅名称上的差异;
2、确定拟申请ssl证书的域名正确解析到当前主机,本例也就是通过https://c1c2.test.com能够正确解析到当前主机(注意是正确解析,至于是不是能正确访问依据certbot的模式不同要求也不同);
3、确定好拟申请ssl证书域名解析到当前主机后的web根目录,假设为:/var/www
certbot申请ssl有多种模式和方法可选,而且certbot试图成为一个集申请ssl证书、安装ssl证书于一体的智能化工具,这也导致了certbot目前有多种使用方法;将ssl证书申请和自动化安装集成于一体当然是好事儿,但由于当前市面服务器软件多种多样,必然导致兼容性要得到保障的话certbot工具还需要较长一段时间来完善。所幸理解清楚certbot工具到底能做些什么,分哪些过程和步骤,哪些是不需要certbot帮我自动完成的就可以了。本文仅仅将certbot当做一个申请ssl证书的工具,并不需要certbot来帮我们自动完善nginx下启用https访问的配置文件。
2.1、standalone模式申请ssl证书
standalone模式不需要上述梳理出的3个要点中的第三条,也就意味着如果你的主机需要关停80端口(或和443端口)的web服务,譬如正在运行的nginx、Apache需要关停。
##standalone模式,其中-d参数指定拟申请ssl证书的域名 #可以通过多个-d参数指定多个域名,但你得确保这些指定的多个域名均能正常解析到当前主机 ./certbot-auto certonly --standalone -d c1c2.test.com
2.2、非standalone模式申请ssl证书
这种模式需要使用-w
参数(或者--webroot-path
参数)指定当前正在运行的web服务器的根目录。--webroot-path
参数指定web根目录后,certbot工具会自动在该目录下生成.well-known
的隐藏目录,以及用于效验域名所有者的特定文件,此文件Let's Encrypt的服务器会主动发起http请求去读取从达到效验域名所有者或者管理者就是本次操作certbot工具的人;certbot工具自动生成的完整目录为:-w参数指定的根目录/.well-known/acme-challenge
,对于nginx而言web根目录下的隐藏目录默认情况下是不允许访问的,所以nginx情况下再执行非standalone模式申请ssl证书之前,需要将nginx网站根目录下的.well-known
隐藏目录设置成允许访问。
##nginx对应主机的配置文件中添加允许.well-known隐藏目录的访问 #注意配置文件中禁止浏览隐藏文件的相关代码引起冲突 location ~ /.well-known { allow all; }
如果熟悉nginx,甚至可以为.well-known
隐藏目录指定单独的root入口;这就是nginx有关的合理利用了,不再补充。
给出命令的参考格式:
##--webroot指定当前正在运行的web server的根目录 certbot certonly --webroot -w /var/www/ -d c1c2.test.com
测试申请的截图:
这样在/etc/letsencrypt/live/你的域名作为目录名的目录
这个目录下会自动生成ssl证书私钥和公匙,下图所示:
4个pem文件,ssl里常见的证书文件,nginx用到fullchain.pem
、privkey.pem
这两个文件,一个公钥链,一个私钥。也就是nginx中ssl_certificate
指令指定的就是fullchain.pem
,而ssl_certificate_key
指令指定的就是privkey.pem
,当然如果不做移动的话,需要是完整路径,具体nginx配置就不墨迹了,关键的ssl证书和key都有了,就比较简单了。
三、证书更新
Let's Encrypt的证书有效期是90天,时间短了点儿,不过Let's Encrypt支持证书更新,到期前更新证书即可。certbot 提供了更新证书的命令cerbot renew
,会自动更新所有已申请的ssl证书。
想要实现到期前自动更新的话,做个crontab任务,就不再多吧唧了。
博主提示 virtualenv: command not found