×

Let's Encrypt SSL证书配置

96
saxieyu
2016.01.02 22:03* 字数 1911

HTTPS 那些事

鹅厂Bugly公众号这篇《全站HTTPS来了》写得比较全面了,不再废话。

Let's Encrypt 介绍

Let's Encrypt 是一个免费、开放,自动化的证书颁发机构,由 ISRG(Internet Security Research Group)运作。

ISRG 是一个关注网络安全的公益组织,其赞助商从非商业组织到财富100强公司都有,包括 Mozilla、Akamai、Cisco、Facebook,密歇根大学等等。ISRG 以消除资金,技术领域的障碍,全面推进加密连接成为互联网标配为自己的使命。

Let's Encrypt 项目于2012年由 Mozilla 的两个员工发起,2014年11年对外宣布公开,2015年12月3日开启公测。

Let's Encrypt 目前处于公测期间,文档,工具还不完善,请谨慎用于生产环境。

Let's Encrypt 指南

Let's Encrypt 安装

Let's Encrypt 目前仅支持 Unix-like 系统,需要 Python 2.6 或 2.7,暂不支持 Python 3。

可以使用 pip 安装 Let's Encrypt 客户端,或到其 wiki 上查看已打包的各操作系统安装方式。

下面以官方推荐的 letsencrypt-auto 脚本为例进行安装:

$ git clone https://github.com/letsencrypt/letsencrypt

$ cd letsencrypt

$ ./letsencrypt-auto --help

Let's Encrypt 验证方式

Let's Encrypt 使用两种方式对申请的域名进行验证:

1、 手动验证 按照提示在申请证书的服务器上使用一个指定的URL提供一个指定的文件内容来进行验证,进行手动验证的服务器IP地址会被 Let's Encrypt 服务端记录在案。

2、 自动验证 在 目标服务器 (指域名解析对应的IP地址的服务器,下同)上运行客户端,并启动一个 80443 端口进行自动验证。包括独立模式和其他web sever验证模式,在 Plugins 中详细解释

Let's Encrypt Plugins

Let's Encrypt 使用不同的 Plugins 来进行证书的获取和安装

Manual

当你在非 目标服务器 上申请证书,或希望进行手动验证时,可以使用 manual 插件,运行命令:

$ ./letsencrypt-auto certonly --manual -d test.example.com

会得到提示:


manual-log-ip

选择 Yes 继续后,便会提示创建一个指定内容的 URL 用来验证对域名及服务器的所有权,注意这个URL仍然需要部署在 目标服务器 上:

Make sure your web server displays the following content at

http://test.example.com/.well-known/acme-challenge/N4mCfskoOSX_7ikZDoEH3iyIqFAUg4Kdg36ecpeUwkw before continuing:

N4mCfskoOSX_7ikZDoEH3iyIqFAUg4Kdg36ecpeUwkw.J7NHjRSPwMW99A2XJv49FTnNu-MSCCebRjccMFZVRic

If you don't have HTTP server configured, you can run the following

command on the target server (as root):

mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge

cd /tmp/letsencrypt/public_html

printf "%s" N4mCfskoOSX_7ikZDoEH3iyIqFAUg4Kdg36ecpeUwkw.J7NHjRSPwMW99A2XJv49FTnNu-MSCCebRjccMFZVRic > .well-known/acme-challenge/N4mCfskoOSX_7ikZDoEH3iyIqFAUg4Kdg36ecpeUwkw

# run only once per server:

$(command -v python2 || command -v python2.7 || command -v python2.6) -c \

"import BaseHTTPServer, SimpleHTTPServer; \

s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \

s.serve_forever()"

Press ENTER to continue

Standalone

使用独立模式进行自动验证,需要在 目标服务器 上运行 Let's Encrypt 客户端,并指定 certonly--standalone参数。本模式需要绑定 80443 端口进行域名验证,所以如果服务器上已有web server运行并侦听这2个端口,则需要先关闭web server。

Webroot

如果 目标服务器 已有web server运行,并且不能够关闭服务来获取和安装证书,可以使用 Webroot plugin。在运行 Let's Encrypt 客户端时指定 certonly--webroot 参数,并使用 --webroot-path-w 参数来指定 webroot 目录,比如 --webroot-path /usr/share/nginx/html

Apache

Apache plugin 可以用来为 Apache 2.4 服务器自动获取和安装证书,需要运行在基于 Debian 的操作系统上,并且要求1.0+以上版本的 libaugeas0。如需要运行 Apache plugin,在运行客户端时指定 --apache 参数。本 plugin 仍处在 Alpha 阶段。

Nginx

Nginx plugin 用于为 Nginx 服务器自动获取和安装证书,仍然处在实验阶段,并且 letsencrypt-auto 没有安装这个 plugin,如需使用,运行 pip install letsencrypt-nginx 进行安装后,通过 --nginx 参数调用 plugin。

证书位置

所有版本已申请的证书放在 /etc/letsencrypt/archive下,/etc/letsencrypt/live是指向最新版本的符号链接。web server中关于证书的配置建议指向 live 目录下的文件,以免证书更新后还需要更改配置。

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

  • cert.pem 申请的服务器证书文件

  • privkey.pem 服务器证书对应的私钥

  • chain.pem 除服务器证书外,浏览器解析所需的其他全部证书,比如根证书和中间证书

  • fullchain.pem 包含服务器证书的全部证书链文件

证书更新

Let's Encrypt 颁发的服务器证书有效期为90天,官方表示此为出于安全原因,降低错发证书,证书泄漏的危害。通过自动续期来解决有效期短的问题,官方建议每2个月更新证书。

如果到期没有更新证书,CA会向申请证书时提交的邮件地址发送提醒email。

自动续期可以使用 crontab 实现。注意更新证书后重启 web server !

申请频率限制

  • 注册IP限制:每IP每3个小时不超过10次

  • 域名数量限制:每个域名(包含子域名)每7天不超过5个

安装实践

系统环境

  • Ubuntu 14.04.3 LTS x86_64

  • Nginx 1.9.3

  • Python 2.7.6

  • www.saxieyu.com

获取证书

由于 www.saxieyu.com 的 nginx 已在运行中,故使用 webroot 模式来获取证书,使用命令:

$ ./letsencrypt-auto certonly --webroot --webroot-path /usr/share/nginx/html -d www.saxieyu.com --agree-tos --email admin@saxieyu.com

证书申请成功后会提示证书的文件路径,以及证书到期时间:

IMPORTANT NOTES:

- Congratulations! Your certificate and chain have been saved at

/etc/letsencrypt/live/www.saxieyu.com/fullchain.pem. Your cert will

expire on 2016-04-01. 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

配置Nginx

生成2048位 DH parameters:

$ sudo openssl dhparam -out /etc/ssl/certs/dhparams.pem 2048

接下来,修改 nginx 配置文件:

server {

    listen 443 ssl;

    server_name www.saxieyu.com;

    ssl_certificate /etc/letsencrypt/live/www.saxieyu.com/fullchain.pem;

    ssl_certificate_key /etc/letsencrypt/live/www.saxieyu.com/privkey.pem;

    ssl_dhparam /etc/ssl/certs/dhparams.pem;

    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

    ssl_prefer_server_ciphers  on;

    ……

}

配置 http 强制跳转到 https:

server {

    listen 80;

    server_name www.saxieyu.com;

    return 301 https://$server_name$request_uri;

}

验证服务器证书

如上修改过 nginx 配置,并 reload 过 nginx 服务后,使用浏览器访问 https://www.saxieyu.com,验证服务器证书是否正确生效


https

查看服务器证书信息


cert-info

使用 ssllabs 在线测试服务器证书强度及配置正确性


ssllabs

参考资料

日记本
Web note ad 1