最近,在网上火透半边天的,非 Let’s Encrypt 的免费SSL证书莫属了。Let’s Encrypt 是一个将于2015年末推出的数字证书认证机构,将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的SSL/TLS证书,同时,它还是免费、自动化、开放的证书签发服务。Let’s Encrypt的证书申请和续期都非常方便,默认的证书有效期是90天,通过cron的定时任务可以实现自动化的续期,所以,能通过自动的方式解决的问题都不是问题,这也是这次折腾起https支持的原因。此篇blog主要记录一下申请证书,配置证书到nginx,以及自动续期的实现步骤,供有兴趣的同学参考。
Certbot 是一个简单易用的 SSL 证书部署工具,由 EFF 开发,前身即 Let’s Encrypt 官方(Python)客户端。简单来说,certbot 就是一个简化 Let’s Encrypt 部署,和管理 Let’s Encrypt 证书的工具。certbot的开源项目在GitHub上,所以,我们的第一步,是clone certbot项目到本地:
|
|
现在,可以通过脚本来申请证书了,以我的域名为例:
|
|
出现如下的证书申请与安装界面:
选择第二个选项,OK并继续。界面会提示证书申请成功的信息,表示证书已经成功生成。
需要注意的是,在申请证书之前,如果本机有运行Nginx,需要先停掉。并确认本机的443端口能被公网所访问
申请好的证书,包含四个文件,默认会放在这里:
|
|
有了这些证书文件,我们就可以去配置我们的Nginx了,实际上,我们用两个证书文件就行了,一个是带私钥的文件,一个是带公钥的文件。拿我的Nginx配置文件举个栗子:
|
|
配置好之后,直接用Nginx reload配置即可。
证书配置好了,我们就可以直接用浏览器通过https地址来访问和验证证书了,比如:https://www.xiaozhou.net
我们会看到地址栏的前面有一把小锁,嗯,咱是有证书的人了!
点击查看证书,还可以看到申请到的证书的详细信息,Let’s Encrypt签发的,货真价实:
最后一步,就是证书的自动续期了。Let’s Encrypt的证书,默认的有效期是90天,不过官方推荐每60天续期。到期之后,我们需要用命令来为证书续期,不过我们是懒人,这种体力活还是交给机器来完成比较合适。所以,我们可以用Linux的cron job来完成这类的任务,配置cron job,每两个月的第一天,执行下面的命令:
|
|
注意在cron job里面需要用绝对路径
简单的六步,我们轻轻松松的就申请了证书,并给blog开启了https访问,还给证书设置了自动续期,嗯,多亏了certbot这个工具,相比起当初申请StarSSL的各种繁琐,一切实在是来得太方便了。
另一种解决方案:
1,git clone https://github.com/letsencrypt/letsencrypt 此命令会在目录下生成一些信息/etc/letsencrypt/
2,关闭apache /nginx
sudo /etc/init.d/apache2 stop
3,再次检查是否占用了80和443端口
netstat -ap | grep 80 netstat -ap | grep 443 如果占用了会输出内容,如果没有就不会输出内容
4,开始执行获取SSL证书和私钥
cd letsencrypt ./letsencrypt-auto
执行以上代码会出现以下步骤:
选择第2个 secure
选OK
看到这步已经申请成功了
SSL证书和私钥就在目录中/etc/letsencrypt/live/xgllseo.com,同时在目录/etc/apache2/sites-available/
也帮我们创建了一个ssl文件xgllseo-le-ssl.conf,如果没有请参考avalon123-le-ssl-conf并自己创建,还要创建一个软连接
sudo ln -s /etc/apache2/sites-available/xgllseo-le-ssl.conf /etc/apache2/sites-enabled/xgllseo-le-ssl.conf
(如果自动帮我们生成好了xxx-le-ssl.conf,也会自动帮我们创建软连接的,也会帮我们自动获取证书和私钥路径)
5,编辑apache2.conf
//直接在最底部加上这代码 Listen 443 AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLProxyCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLHonorCipherOrder on SSLProtocol all -SSLv2 -SSLv3 SSLProxyProtocol all -SSLv2 -SSLv3 SSLPassPhraseDialog builtin #SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_scache(512000)" #SSLSessionCacheTimeout 300 #SSLMutex "file:/usr/local/apache/logs/ssl_mutex" 将其中的: AllowOverride None 修改为: AllowOverride All 6,检查是否开启了Mod_rewrite 模块,一般情况下都是默认开启了的,不过检查下也好。
在终端中执行 sudo a2enmod rewrite 指令后,即启用了 Mod_rewrite 模块。 另外,也可以通过将 /etc/apache2/mods-available/rewrite.load 连接到 /etc/apache2/mods-enabled/rewrite.load 来打开 Mod_rewrite 模块。用指令操作就是: sudo ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load
7,重启apache
sudo /etc/init.d/apache2 restart
输入地址https://www.xgllseo.com 看能否访问,如果可以那就成功了。
不过直接输入域名时候是会直接跳转到http的而不是https,其实我们要把80端口自动跳转到443端口,也就是要做301跳转。
8,编辑/etc/apache2/sites-available/xgllseo.conf,加入以下这3句话,(注意要看位置)
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^(.*) https://www.xgllseo.com/$1 [L,R=301] # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
9,重启apache
sudo /etc/init.d/apache2 restart
10,Let's Encrypt免费SSL证书续期
Let's Encrypt免费SSL证书有效期是90天,也就是每三个月你就得续期一次。采用官方的方法获取到的免费SSL证书,你不需要更改Apache和Nginx配置代码,执行以下代码即可自动替换证书为新的(注意修改域名和邮箱):
./letsencrypt-auto certonly --renew-by-default --email [email protected] -d freehao123.org -d www.freehao123.org //没有邮箱就把--email [email protected]删除
要更新之前要停止mysql、apache2 、nginx
sudo /etc/init.d/mysql stop sudo /etc/init.d/apache2 stop sudo /etc/init.d/nginx stop
(到目录/etc/letsencrypt/找./letsencrypt-auto在执行一次)步骤是:
1,选择要续期的域名
2,选择第二个选择,相当于重装
3,选择第一个
更新完成重新开启mysql、apache2 、nginx
sudo /etc/init.d/mysql restart sudo /etc/init.d/apache2 restart sudo /etc/init.d/nginx restart
查看续期是否成功:
如何查看过期时间:
谷歌浏览器查看
点击“锁头”----点击“详细信息”
点击“view certificate”
就会自动弹出证书信息。
也可以按F12---切换到“Security”选项卡---点击“View certificate”
------------------------------------------------------------------------------------
注意一些细节:
如果之前你网站是http://xxxx,使用了https://xxx了之后,发现能访问但是锁头并不是绿色的,或者有些页面是绿色锁头有些不是,并且在控制台还有报错,如:
那么有可能就是你首页或者其他页面加载的时候使用了之前的http://的地址。统一修改就好了
批量修改图片地址:
UPDATE wp_posts SET post_content = replace(post_content, 'https://www.xgllseo.com', 'https://www.xgllseo.com'); //注意表前缀
对于wordpress还有3处地方要改
UPDATE wp_posts SET pinged = replace(pinged, 'https://www.xgllseo.com', 'https://www.xgllseo.com') UPDATE wp_posts SET guid = replace(guid, 'https://www.xgllseo.com', 'https://www.xgllseo.com')
注:Wordpress数据库里面几个重点替换的表和字段:
表wp_posts里面的post_content (文章内容)
表wp_posts里面的pinged (ping内容)
表wp_posts里面的guid (WordPress默认链接结构)
表wp_comments里面的comment_author_url (留言作者URL地址 )
----------------------------------------------------------------------------------------
多域名申请
多域名申请如果重复执行不能成功,如:
git clone https://github.com/letsencrypt/letsencrypt //再次执行,不能成功。
这时候在/etc/letsencrypt/目录下在创建一个letsencrypt/目录,切换到/etc/letsencrypt/letsencrypt/目录下,在执行以下命令
git clone https://github.com/letsencrypt/letsencrypt
就会发现出现了2个以上的域名让你选择,选择要为申请证书的域名即可,一切按照以前步骤来即可。