申请 Let’s Encrypt 泛域名证书 及 Nginx/Apache 证书配置
什么是 Let’s Encrypt?
部署 HTTPS 网站的时候需要证书,证书由 CA (Certificate Authority )机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于推动 HTTPS 协议的使用。Let’s Encrypt 也是一个 CA 机构,但这个 CA 机构是免费的!!!也就是说签发证书不需要任何费用。
什么是通配符证书?
在没有出现通配符证书之前,Let’s Encrypt 支持两种证书。
1)单域名证书:证书仅仅包含一个主机。
2)SAN 证书:一张证书可以包括多个主机(Let’s Encrypt 限制是 20),也就是证书可以包含下列的主机:www.example.com、www.example.cn、blog.example.com 等等。
证书包含的主机可以不是同一个注册域,不要问我注册域是什么?注册域就是向域名注册商购买的域名。
对于个人用户来说,由于主机并不是太多,所以使用 SAN 证书完全没有问题,但是对于大公司来说有一些问题:
- 子域名非常多,而且过一段时间可能就要使用一个新的主机。
- 注册域也非常多。
读者可以思考下,对于大企业来说,SAN 证书可能并不能满足需求,类似于 sina 这样的网站,所有的主机全部包含在一张证书中,而使用 Let’s Encrypt 证书是无法满足的。
Let’s Encrypt 通配符证书
通配符证书就是证书中可以包含一个通配符,比如 .example.com、.example.cn,读者很快明白,大型企业也可以使用通配符证书了,一张证书可以防止更多的主机了。
这个功能可以说非常重要,从功能上看 Let’s Encrypt 和传统 CA 机构没有什么区别了,会不会触动传统 CA 机构的利益呢?
为什么选择Let’s Encrypt?
Let’s Encrypt和其他认证机构的区别:
如何申请 Let’s Encrypt 通配符证书
安装Certbot
从官方源安装最新版certbot(最新版为0.22.0,从0.22.0版本才开始支持泛域名申请)
wget https://dl.eff.org/certbot-auto chmod a+x ./certbot-auto
初始化
./certbot-auto
获取证书
因为目前大多数国内的DNS服务商不在API支持的列表里,所以以下使用手动方式进行DNS认证,只要将下方命令中的*.thinkbig.com
替换为自己的域名即可。注意!域名的 minirplus.com
解析记录必须以 A记录
方式指向当前运行命令的服务器IP,而不能使用CNAME记录。
./certbot-auto certonly --manual -d *.thinkbig.com --agree-tos --no-bootstrap --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
输入邮箱
,用于接收证书过期通知:Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):
接着会出现一段广告,大意是收集客户邮箱给赞助商,Y
或 N
均可
------------------------------------------------------------------------------- Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about EFF and our work to encrypt the web, protect its users and defend digital rights. ------------------------------------------------------------------------------- (Y)es/(N)o:
接着重要的部分来了,在域名注册商的网站,解析记录中添加一个 _acme-challenge
前缀的域名 TXT记录
,记录的内容为中间显示的随机码_MdwehUGJ_qSMWNy7acNo_QzuS1YnV8_772JZUGmqQY
我用的是阿里云,找到对应的域名,添加解析记录即可
------------------------------------------------------------------------------- Please deploy a DNS TXT record under the name _acme-challenge.thinkbig.com with the following value: _MdwehUGJ_qSMWNy7acNo_QzuS1YnV8_772JZUGmqQY Before continuing, verify the record is deployed. ------------------------------------------------------------------------------- Press Enter to Continue
接着确保当前域名的根记录 thinkbig.com 为 A记录
并且指向当前服务器IP(这条原本不成问题,因为国外的服务商的DNS根域名只能添加A记录,但是国内的DNSPOD则更加灵活,可以添加CNAME记录,所以会在认证的时候出现问题)
按回车,进行认证
等待片刻,出现如下信息,说明认证成功
申请操作成功后, 会在界面中输出证书的存放路径, 以及证书的到期时间 (90天)
Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/thinkbig.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/thinkbig.com/privkey.pem Your cert will expire on 2019-02-19. To obtain a new or tweaked version of this certificate in the future, simply run certbot-auto again. To non-interactively renew *all* of your certificates, run "certbot-auto renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
证书的存放路径
( 这里以thinkbig.com为例 )
生成证书中会创建 /etc/letsencrypt
文件夹, 证书文件默认存放在 /etc/letsencrypt/live/thinkbig.com
文件夹中, 其中 thinkbig.com 取自第一个域名
在 thinkbig.com 文件夹中包含 4 个文件 ./cert.pem ./chain.pem ./fullchain.pem ./privkey.pem
- cert.pem 域名证书
- chain.pem 根证书及中间证书
- fullchain.pem 由 cert.pem 和 chain.pem 合并而成
- privkey.pem 证书私钥
创建一个 2048 位的 Diffie-Hellman 文件
(nginx 默认使用 1024 位的 Diffie–Hellman 进行密钥交换, 安全性太低)
openssl dhparam -out /etc/letsencrypt/live/dhparams.pem 2048
nginx TSL 配置 (强制http重定向到https)
( 这里以thinkbig.com为例 )
首先对 http 协议进行 301 重定向到 https 协议
server { listen 80; server_name example.com www.thinkbig.com; return 301 https://thinkbig.com$request_uri; }
Nginx Https 相关配置( 这里以thinkbig.com为例 )
server { listen 443 ssl; server_name thinkbig.com www.thinkbig.com; # 配置站点证书文件地址 ssl_certificate /etc/letsencrypt/live/thinkbig.com/fullchain.pem; # 配置证书私钥 ssl_certificate_key /etc/letsencrypt/live/thinkbig.com/privkey.pem; # 配置 Diffie-Hellman 交换算法文件地址 ssl_dhparam /etc/letsencrypt/live/dhparams.pem; # 配置服务器可使用的加密算法 ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; # 指定服务器密码算法在优先于客户端密码算法时,使用 SSLv3 和 TLS 协议 ssl_prefer_server_ciphers on; # ssl 版本 可用 SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2 # ie6 只支持 SSLv2,SSLv3 但是存在安全问题, 故不支持 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 配置 TLS 握手后生成的 session 缓存空间大小 1m 大约能存储 4000 个 session ssl_session_cache shared:SSL:50m; # session 超时时间 ssl_session_timeout 1d; # 负载均衡时使用 此处暂时关闭 详情见 https://imququ.com/post/optimize-tls-handshake.html # 1.5.9 及以上支持 ssl_session_tickets off; # 浏览器可能会在建立 TLS 连接时在线验证证书有效性,从而阻塞 TLS 握手,拖慢整体速度。OCSP stapling 是一种优化措施,服务端通过它可以在证书链中封装证书颁发机构的 OCSP(Online Certificate Status Protocol)响应,从而让浏览器跳过在线查询。服务端获取 OCSP 一方面更快(因为服务端一般有更好的网络环境),另一方面可以更好地缓存 以上内容来自 https://imququ.com/post/my-nginx-conf-for-wpo.html # 1.3.7 及以上支持 ssl_stapling on; ssl_stapling_verify on; # 根证书 + 中间证书 ssl_trusted_certificate /etc/letsencrypt/live/thinkbig.com/fullchain.pem; # HSTS 可以告诉浏览器,在指定的 max-age 内,始终通过 HTTPS 访问该域名。即使用户自己输入 HTTP 的地址,或者点击了 HTTP 链接,浏览器也会在本地替换为 HTTPS 再发送请求 相关配置见 https://imququ.com/post/sth-about-switch-to-https.html add_header Strict-Transport-Security max-age=60; # 在此填写原本 http 协议中的配置 }
以上配置完成后, 重启 nginx 即可完成对 https 的切换
service nginx restart
Apache Https 相关配置( 这里以thinkbig.com为例 )
进入/etc/apache2/sites-available,修改泛域名配置文件(这里以000-default.conf为例),添加SSL配置,将下面配置中的SSL证书地址,替换为之前成功获取的证书地址(如直接使用以下配置,请修改DocumentRoot和Directory目录为泛域名指向的目录)
<VirtualHost *:80> ServerAdmin admin@thinkbig.com DocumentRoot /var/www/vps ServerSignature Off <Directory /var/www/vps > Options -Indexes </Directory> </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> ServerAdmin admin@thinkbig.com DocumentRoot /var/www/vps ServerSignature Off <Directory /var/www/vps > Options -Indexes </Directory> SSLEngine on SSLCertificateFile /etc/letsencrypt/live/thinkbig.com/fullchain.pem; SSLCertificateKeyFile /etc/letsencrypt/live/thinkbig.com/privkey.pem </VirtualHost> </IfModule>
更新证书:
certbot生成的证书是有90天期限的。
使用以下命令即可进行 续期, 续期成功后需要服务器
./certbot-auto renew
该命令只会对快到期的证书才会进行更新, 如果希望强制更新, 可以增加 --force-renewal
参数
自动更新证书:
crontab中加上下边这句:
0 0 1 */2 * certbot-auto renew --quiet --force-renewal
了解更多,https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au