Let’s Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由HTTP过渡到HTTPS,目前Facebook等大公司开始加入赞助行列。
Let’s Encrypt虽然还在测试当中,但是市场需求非常大,已经有非常多的朋友迫不及待地安装并用上了Let’s Encrypt。Let’s Encrypt向广大的网站提供免费SSL证书,不管是对于网站站长、互联网用户,还是对整个Web互联网,都是非常有利的,它有利于整个互联网的安全。
本篇文章就来为大家讲解一下如何获取Let’s Encrypt免费SSL证书,并附上Nginx的SSL证书配置方法。
使用 HTTPS 前的一些疑惑
现在是 2017 年,使用 HTTPS 已经不像几年前是一件昂贵的事情。当然我也是自己了解了一圈才消除了自己的疑惑,主要是:
要回答这些问题,推荐大家去看一下 Google I/O 2016 的视频(Youtube):https://www.youtube.com/watch?v=YMfW1bfyGSY
视频里把所有问题都详细一一解答,强烈推家把视频看完。
我简单总结:
有哪些靠谱的免费 HTTPS 证书提供商?
选择证书提供商有3个主要考量:
1、浏览器和操作系统支持程度
基本你能查到的热门证书提供商,支持程度都不会太差。例如 Let’s Encrypt 的支持可以访问:Which browsers and operating systems support Let’s Encrypt
可以看到,Android 2.3.6 以上,Firefox 2.0 以上,Windows Vista 以上,iOS 3.1 以上,Google Chrome全平台都是支持的。这一点就不用太担心了,看你你的网站受众情况来决定。对于我来说,我完全不在乎 Windows XP 的 IE 用户。
2、证书类型
HTTPS 证书分为3类, 1. DV 域名验证证书 2. OV 组织机构验证证书 3. EV 增强的组织机构验证证书。每类证书在审核和验证方面要求严格程度不同,浏览器会在地址栏给予不同证书不一样的展现。
一般个人使用DV证书完全够了,浏览器表现为地址栏前会有绿色的小锁。下面聊到的免费证书都是 DV 域名验证证书。
3、维护成本
我调研不多,使用过 StartSSL,现在用 Let’s Encrypt。StartSSL 的免费证书有效期是1年,1年后需要手动更换。配置过程还挺麻烦的。
更推荐 Let’s Encrypt,虽然有效期只有3个月,但可以用 certbot 自动续期,完全不受影响。而且 Let’s Encrypt 因为有了 certbot 这样的自动化工具,配置管理起来非常容易。
4、如何安装
第一种办法:通过官网申请安装:
官方网站:https://letsencrypt.org/
项目主页:https://github.com/letsencrypt/letsencrypt
Let’s Encrypt 证书生成不需要手动进行,官方推荐 certbot 这套自动化工具来实现。3步轻松搞定:
你可以在 certbot 网站上,选择你的 Web Server 和 操作系统,就能看到对应的安装和配置教程。
(本文主要介绍下面的安装办法)
第二种办法:手动申请安装(由于 CentOS的复杂性,我使用的这种办法)
安装Let’s Encrypt脚本依赖环境:(这一部分可以跳过,因为官方提供的Let’s Encrypt脚本会自动检测并安装)
# Debian
apt-get install git
# CentOS 7
yum install epel-release
cd /root/
wget https://dl.eff.org/certbot-auto --no-check-certificate
chmod +x
./certbot-auto
./certbot-auto -n
./certbot-auto -n只是用来安装依赖包的,也可以跳过直接到下面的生成证书的步骤,国内VPS或服务器上使用的话建议先修改为国内的pip源。
单域名生成证书:
./certbot-auto certonly --email admin@www.smusic.win --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.smusic.cc -d www.smusic.cc
多域名单目录生成单证书:(即一个网站多个域名使用同一个证书)
./certbot-auto certonly --email admin@www.smusic.win --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.smusic.cc -d www.vpser.net -d bbs.smusic.cc
多域名多目录生成一个证书:(即一次生成多个域名的一个证书)
./certbot-auto certonly --email admin@www.smusic.win --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.smusic.cc -d www.smusic.cc -d bbs.smusic.cc -w /home/wwwroot/smusic.cc -d www.smusic.cc -d smusic.cc
提示:
IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/www.vpser.net/fullchain.pem. Your cert will
expire on 2016-10-01. 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”
– 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
就是生成 成功。
生成的证书会存在:/etc/letsencrypt/live/www.smusic.cc/ 目录下
cerrbot的续期比原来的更加简单,因为证书只有90天,所以建议使用crontab进行自动续期:
crontab 里加上如下规则:0 3 */5 * * /root/certbot-auto renew –renew-hook “/etc/init.d/nginx reload” 这样每5天就会执行一次所有域名的续期操作。当然时间也可以自行进行调整,建议别太频繁,因为他们都有请求次数的限制,如果需要强制更新可以在前面命令上加上 –force-renew 参数。
具体方法参考:www.smusic.cc/2094.html
1、因为默认LNMP的虚拟主机里是禁止 . 开头的隐藏文件及目录的,所以访问http://abc.com/.well-known/acme-challenge/**** 这个链接的话返回403错误,所以必须要将对应虚拟主机配置文件里的
location ~ /\.
{
deny all;
}
这段配置删掉或注释掉或在这段配置前面加上
location ~ /.well-known {
allow all;
}
以上配置代码,然后重启nginx。
2、如果要启用http2的话,建议编辑lnmp.conf,将里面的Nginx_Modules_Options的单引号里加上 –with-openssl=/root/openssl-1.0.2h
并执行:
cd /root && wget -c https://www.openssl.org/source/openssl-1.0.2h.tar.gz && tar zxf openssl-1.0.2h.tar.gz
然后使用升级脚本 ./upgrade.sh nginx 升级nginx至1.9.5或更高版本。
3、国内有些用户反映会卡在Installing Python packages…这个地方不动,因为pip的默认源是国外的,国内可能会有点慢,可以执行下面命令来修改pip源为国内的:
mkdir ~/.pip
cat > ~/.pip/pip.conf <<EOF
[global]
index-url = https://pypi.doubanio.com/simple/
[install]
trusted-host=pypi.doubanio.com
EOF
执行完,再重新运行certbot的命令应该正常安装python的包了。
配置文件地址: /usr/local/nginx/conf/vhost/www.smusic.cc.conf (根据自己的环境确认)
接下来进行配置Nginx虚拟主机文件,完整配置如下:
server
{
listen 443 ssl; #lnmp1.3+版本默认支持http2,可以加上http2,lnmp1.2版本默认支持spdy,可以加上spdy
server_name www.smusic.cc; ##这里是你的域名
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/www.smusic.cc; #网站目录
ssl_certificate /etc/letsencrypt/live/www.smusic.cc/fullchain.pem; #前面生成的证书,改一下里面的域名就行
ssl_certificate_key /etc/letsencrypt/live/www.smusic.cc/privkey.pem; #前面生成的密钥,改一下里面的域名就行
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
include wordpress.conf; #这个是伪静态根据自己的需求改成其他或删除
#error_page 404 /404.html;
location ~ [^/]\.php(/|$)
{
# comment try_files $uri =404; to enable pathinfo
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf; #lnmp 1.0及之前版本替换为include fcgi.conf;
#include pathinfo.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
access_log off;
}
需将上述配置根据自己的实际情况修改后,添加到虚拟主机配置文件最后面。
添加完需要执行:/etc/init.d/nginx reload 重新载入配置使其生效。
重启Nginx:/etc/init.d/nginx restart
如果需要HSTS,可以加上add_header Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”; 前面参数里的数值是秒。 开启后有效期内必须只能https访问,不确定的话不要开启。
LNMPA模式下只需要在Nginx上设置,只需要将php解析部分替换为 include proxy-pass-php.conf; 即可。
1、国内DNS服务商可能会不行,目前已知dnspod、cloudxns不行dnspod、cloudxns目前已经可以
Namecheap、Route 53的都可以。
2、Linode福利或IPv6用户福利
可能目前Linode用户应该遇到了
An unexpected error occurred:
There were too many requests of a given type :: Error creating new registration :: Too many registrations from this IP
Please see the logfiles in /var/log/letsencrypt for more details.
这个不一定是因为IP注册的次数过多,可能是因为IPv6的事,具体解决方法如下:
执行:sysctl -w net.ipv6.conf.all.disable_ipv6=1 来临时禁用IPv6
再生成证书后执行:sysctl -w net.ipv6.conf.all.disable_ipv6=0 再来解除禁用IPv6
3、如果启用了防火墙需要将443端口加入允许规则,一般iptables可以参考:https://www.vpser.net/security/linux-iptables.html
4、如果LNMP下访问http://abc.com/.well-known/acme-challenge/**** 这个链接403的话是因为默认LNMP 1.3的虚拟主机里是禁止.开头的隐藏文件及目录的。
需要将
location ~ /\.
{
deny all;
}
这段配置删掉或注释掉或在这段配置前面加上
location ~ /.well-known {
allow all;
}
以上配置代码,然后重启nginx。
5、同时这里提醒一下如果设置了http 301跳到https的用户,再续期前还需要在nginx设置如下:
让启用 Nginx 启用 SSL,两种方法,单一支持HTTPS,或者同时支持 HTTP 和 HTTPS 两种协议。
备注 Nginx 默认没有安装 SSL 模块,安装时需要手动添加 –with-http_ssl_module 参数。(如果您使用LNMP安装包,可以忽视,默认已安装了)
80端口的虚拟主机上需要添加上,不加的话会无法验证的
location /.well-known/ {
add_header Content-Type 'text/plain;';
root /网站目录完整路径;
}
附完整的nginx下301 http跳到https的配置:
server
{
listen 80;
server_name www.vpser.net;
location /.well-known/ {
add_header Content-Type 'text/plain;';
root /网站目录完整路径;
}
location / {
return 301 https://www.vpser.net$request_uri;
}
}
用专业在线工具测试你的服务器 SSL 安全性
Qualys SSL Labs 提供了全面的 SSL 安全性测试,填写你的网站域名,给自己的 HTTPS 配置打个分。
如果你完全按照我上面教程配置,遵循了最佳实践,你应该和我一样得分是 A+
这意味着你启用了HTTPS,现在足够的安全,并且使用了最新技术,保证了性能。