【教程】Let’s Encrypt免费HTTPS SSL证书获取教程

Let’s Encrypt是EFF、Mozilla、Cisco、Akamai、IdenTrust与密西根大学研究人员共同创立的组织,这是一个免费的凭证中心(Certification Authority,CA),目的在于推动全球所有的网站都使用HTTPS加密传输,并由非营利的网际网路安全研究组织Internet Security Research Group(ISRG)负责营运。

对于开发者来说,部署HTTPS是一个双赢的选择,用户可以借此获得更加安全的使用体验,而站点也能够抵御恶意软件的注入或广告追踪。Let’s Encrypt已于2015年12月3日进入公测(Public Beta),所有网站都可以免费获取Let’s Encrypt的证书。

据说Google优先收录带HTTPS加密的网站。

获取Let’s Encrypt证书
项目GitHub地址:https://github.com/letsencrypt/letsencrypt – > https://github.com/certbot/certbot

官方教程:https://certbot.eff.org/docs/using.html

2016年5月更新:

最近官方做了调整,简化了获取证书的难度,并将项目名改为了certbot,以下为全新安装方法:

wget https://dl.eff.org/certbot-auto
chmod a+x ./certbot-auto
./certbot-auto –help
等待安装依耐环境并初始化,然后直接看第四步。
4.运行客户端获取证书

获取证书有几种方案,官方已经开发了用于Apache服务器的插件,而Nginx的插件还是实验性功能。本文不探讨使用插件的方式,读者可以自行阅读官方的User Guide。

下面是两种通用获取方法,推荐使用 方案二。

方案一)获取证书时会使用80端口,如果你的服务器可以关闭,可以使用如下方式:

关闭占用80端口的服务器,比如Apache或者Nginx

service nginx stop
输入以下命令来获取证书:

./certbot-auto certonly –standalone –agree-tos -v -t –email [email protected] -d sabia.cc -d www.sabia.cc
-d 后面为需要获取证书的域名,申请完成后所有域名共用一个证书。

如果申请成功,会显示以下信息,可惜的是获取一次有效期只有90天,到期后需要续签:

IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/sabia.cc/fullchain.pem. Your cert
will expire on 2016-03-08. To obtain a new version of the
certificate in the future, simply run Let’s Encrypt again.
证书文件放在了/etc/letsencrypt/live下。

方案二)如果你不想关闭服务器,也可以指定webroot来获取证书:

–server: 指定 letsencrypt 服务器,-w: 指定网站根目录,-d: 指定网站域名。用 , 分开同一个网站绑定的所有域名

./certbot-auto certonly –webroot –agree-tos -v -t –email [email protected] -w /home/wwwroot/sabia.cc -d sabia.cc,www.sabia.cc
PS:如果你的域名使用的是国内的NS服务商,比如:hichina、dnspod、cloudxns,可能不能正常通过验证,见这条 Issue:DNS CAA query timeout

错误提示类似于:

connection :: The server could not connect to the client for DV :: DNS query timed out
解决方案是将域名的NS服务商换为国外的,例如namecheap、linode、cloudflare、google cloud DNS。
你可以先尝试是否能正常获取,如果不能的话,可以选择切换域名的NS服务器。我在操作的时候将域名的NS换到了https://www.cloudflare.com,但是换了NS需要等几个小时才能生效。

配置Nginx添加Https
listen 443 ssl;
server_name sabia.cc;
index index.html index.htm index.php;
root /home/wwwroot/sabia.cc;

ssl_certificate /etc/letsencrypt/live/sabia.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sabia.cc/privkey.pem;
添加一个网站:

server {
listen 80;
server_name sabia.cc www.sabia.cc;
return 301 https://$server_name$request_uri;
}
以上设置会将所有的 Http 请求通过301重定向到 Https。
更新证书的时候,letsencrypt 会通过 http 协议访问你网站目录下的一个文件,请求类似于:

66.133.109.36 – – [05/Jan/2016:20:11:24 -0500] “GET /.well-known/acme-challenge/HGr8U1IeTW4kY_Z6UIyaakzOkyQgPr_7ArlLgtZE8SX HTTP/1.1” 200 87 “-” “Mozilla/5.0 (compatible; Let’s Encrypt validation server; +https://www.letsencrypt.org)”

而通过上述设置,可以让服务器上的所有网站证书更新时使用同一个目录,而不用分别去配置每个网站的目录。
打开网站看看,已经加上绿色锁头了,可是如果网页上存在有没走Https的链接,就不能全绿。

Let’s Encrypt续签
新版续签只需要一条命令:

./certbot-auto renew -v

或者:
./certbot-auto renew –standalone –pre-hook “service nginx stop” –post-hook “service nginx start”

你可以选择添加一个计划任务,自动续签。
优化Https安全性
各服务器推荐配置可以参考:https://cipherli.st/

1.首先生成dhparam.pem:

cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 2048
我用的是2048bit加密,当然如果你服务器配置够好,可以选4096bit。

2.生成HTTP Public Key Pinning 参考:Public Key Pinning

openssl rsa -in privkey.pem -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
writing RSA key
FankyFNJUnHYf737yBalLqkC8bWTxZGTCeoMezFgNX0=

openssl x509 -in chain.pem -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
writing RSA key
YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=

在这里直接贴上我的配置:
listen 80;
listen 443 ssl http2;
server_name sabia.cc www.sabia.cc;
index index.html index.htm index.php;
root /home/wwwroot/sabia.cc;

if ($scheme = http) {
return 301 https://$server_name$request_uri;
}

ssl_certificate /etc/letsencrypt/live/sabia.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sabia.cc/privkey.pem;

ssl_ciphers “ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4”;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/sabia.cc/chain.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
server_tokens off;
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;

fastcgi_hide_header X-Powered-By;

add_header Strict-Transport-Security “max-age=63072000; includeSubDomains; preload”;
add_header Public-Key-Pins ‘pin-sha256=”FankyFNJUnHYf737yBalLqkC8bWTxZGTCeoMezFgNX0=”; pin-sha256=”YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=”; max-age=2592000; includeSubDomains’;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
配置完之后可以测试一下现在的安全级别:https://www.ssllabs.com/ssltest/

HTTP Security Report:https://httpsecurityreport.com/

配置参考地址:

1.Configuring Let’s Encrypt for nginx with Automatic Renewal

2.Strong SSL Security on nginx

3.使用 Nginx 构建优化的 https 服务

将网站加入HSTS preload list
HSTS preload list是什么?
HSTS preload list是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也会采用这个列表。

加入地址:https://hstspreload.appspot.com

加入条件:

有效的证书;
将所有HTTP流量重定向到HTTPS;
确保所有子域名启用HTTPS,特别是www子域名;
同时,HSTS响应头需要满足以下条件。

max-age至少需要18周,10886400秒;
必须指定includeSubdomains参数;
必须支持preload参数。
例如:

add_header Strict-Transport-Security “max-age=63072000; includeSubDomains; preload”

从申请到审核通过,时间在几天到几周不等。申请后,你可以在https://hstspreload.appspot.com网站中查询最新的状态, 也可以在Chrome浏览器的地址框中输入“chrome://net-internals/#hsts”查看。
从审核通过到正式加入到 Chrome 的 stable release 版本中还需要一段时间,因为要经过 canary、dev、beta 以及 stable。

这个文件就是 Chrome 的预加载列表文件:transport_security_state_static.json