Let's Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由HTTP过渡到HTTPS,目前Facebook等大公司开始加入赞助行列。
Let's Encrypt已经得了 IdenTrust 的交叉签名,这意味着其证书现在已经可以被Mozilla、Google、Microsoft和Apple等主流的浏览器所信任,你只需要在Web 服务器证书链中配置交叉签名,浏览器客户端会自动处理好其它的一切,Let's Encrypt安装简单,未来大规模采用可能性非常大。
Let's Encrypt虽然还在测试当中,但是市场需求非常大,已经有非常多的朋友迫不及待地安装并用上了Let's Encrypt。Let's Encrypt向广大的网站提供免费SSL证书,不管是对于网站站长、互联网用户,还是对整个Web互联网,都是非常有利的,它有利于整个互联网的安全。
本篇文章就来为大家讲解一下如何获取Let's Encrypt免费SSL证书,并附上Apache的SSL证书配置方法。
一、 安装Let's Encrypt免费SSL准备
1.Let's Encrypt官网:
官方网站:https://letsencrypt.org/
项目主页:https://github.com/letsencrypt/letsencrypt
2.安装Let's Encrypt脚本依赖环境:(这一部分可以跳过,因为官方提供的Let's Encrypt脚本会自动检测并安装)
1 |
$ apt-get install git |
二、获取Let's Encrypt免费SSL证书
1.获取Let's Encrypt免费SSL证书很简单,你只需要执行以下命令,就会自动在你的VPS上生成SSL证书和私钥。
1 2 3 4 5 |
$ git clone https://github.com/letsencrypt/letsencrypt $ cd letsencrypt $ ./letsencrypt-auto |
如果只想生成证书,则最后一句使用如下命令(貌似我目前只能用下面的命令,用上面的命令会报错):
1 |
$ ./letsencrypt-auto certonly |
2.执行上述命令后,会弹出对话框,同意用户协议。
3.接着会提示让你关闭Nginx或者Apache。
4.Let's Encrypt需要用到80和443端口,所以你需要关闭那些占用这两个端口的应用。
5.当你看以下内容时,就表明你的Let's Encrypt免费SSL证书获取成功了。
1 2 3 4 5 6 7 8 9 |
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/www.mobibrw.com/fullchain.pem. Your cert will expire on 2016-04-25. To obtain a new version of the certificate in the future, simply run Let's Encrypt again. - If you like Let's Encrypt, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le |
注意: 目前阿里云的服务器域名解析不支持DNS Certification Authority Authorization (CAA) Resource Record
,导致在进行签名的时候返回如下错误信息:
1 2 3 4 5 6 7 8 |
Failed authorization procedure. mobibrw.com (tls-sni-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: DNS problem: query timed out looking up CAA for mobibrw.com IMPORTANT NOTES: - The following errors were reported by the server: Domain: mobibrw.com Type: urn:acme:error:connection Detail: DNS problem: query timed out looking up CAA for mobibrw.com |
目前还没有解决方法,具体的讨论参考 DNS query timeout #1610
目前根据提交给阿里云的工单,今天2016年1月26日已经正式支持了Let's Encrypt,目前验证,一切正常了。
三、证书续期
Let's Encrypt有多种方法来验证你是否是域名的所有人,而acme-tiny
这个小工具用的是最简单的方法,也就是利用http
文件验证。
简单来说,就是生成一个验证文件,放在http://www.mobibrw.com/.well-known/acme-challenge/
下,Let's Encrypt官方验证这个文件是否存在、内容是否正确。如果一切正确,说明域名是你所有。因此我们下面的脚本中会出现创建,删除.well-known/acme-challenge/
这个目录的动作。
1.生成证书自动化请求脚本
1 |
$ sudo vim /root/renew-ssl.sh |
里面内容如下:
1 2 3 4 5 6 7 8 9 |
#!/bin/bash mkdir -p /var/www/wordpress/.well-known/acme-challenge /root/letsencrypt/letsencrypt-auto --renew-by-default certonly --email wangqiang1588@sina.com -d www.mobibrw.com -d mobibrw.com --webroot -w /var/www/wordpress --agree-tos service apache2 reload rm -rf /var/www/wordpress/.well-known |
2.赋予脚本执行权限
1 |
$ sudo chmod +x /root/renew-ssl.sh |
3.脚本添加到计划任务,每隔60天执行一次
1 |
$ sudo crontab -e |
在文件的最后增加
1 |
0 3 */60 * * /root/renew-ssl.sh |
4.查看是否添加成功
1 |
$ sudo crontab -l |
5.重启cron
服务
1 |
$ sudo service cron restart |
四、需要注意的问题
目前(2022/02/27)最新的1.23.0版本,在生成/更新证书的时候,会提示用户是否全站都迁移到HTTPS。如果不小心同意了这个选项,对于Apache服务器来说,会在配置文件中增加如下内容:
1 2 3 4 5 6 |
RewriteEngine on RewriteCond %{SERVER_NAME} =www.xxx.com [OR] RewriteCond %{SERVER_NAME} =xxx.com [OR] RewriteCond %{SERVER_NAME} =xxxxx.com [OR] RewriteCond %{SERVER_NAME} =www.xxxxx.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] |
这个配置会覆盖我们在网站目录下的HTTPS相关设置(.htaccess),如果我们配置网站某个目录下的文件可以不通过HTTPS进行访问,那么需要手工移除这些自动生成的配置信息,然后重启Apache服务。