CentOS 7系统Nginx申请免费SSL安全证书Let’s Encrypt教程

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 已经不像几年前是一件昂贵的事情。当然我也是自己了解了一圈才消除了自己的疑惑,主要是:

  • 我的网站(一个简单的博客)可能没必要使用 HTTPS
  • HTTPS 会不会让网站速度变慢?
  • HTTPS 需要花钱吧?证书好像不便宜
  • 配置和维护 HTTPS 代价很高

要回答这些问题,推荐大家去看一下 Google I/O 2016 的视频(Youtube):https://www.youtube.com/watch?v=YMfW1bfyGSY

视频里把所有问题都详细一一解答,强烈推家把视频看完。

我简单总结:

  • 每个网站都应该用 HTTPS,就算是全静态站点也同样如此,运营商劫持严重干扰访问者的体验
  • 有几项技术可以提高 HTTPS 的性能,包括 Strict Transport Security,TLS False Start 和 HTTP/2 ,这些技术让 HTTPS 速度不慢,某些情况下会甚至更快
  • HTTPS 针对个人单个(或者几个)域名的使用来说,已经是免费的
  • 配置和维护 HTTPS 异常简单,Let’s Encrypt 这个项目通过自动化把事情简单化了

有哪些靠谱的免费 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、如何安装

第一种办法:通过官网申请安装:

  • Let’s Encrypt官网:

官方网站:https://letsencrypt.org/
项目主页:https://github.com/letsencrypt/letsencrypt

  • 生成 Let’s Encrypt 证书

未分类

Let’s Encrypt 证书生成不需要手动进行,官方推荐 certbot 这套自动化工具来实现。3步轻松搞定:

  • 下载安装 certbot (Let’s Encrypt项目的自动化工具)
  • 创建配置文件
  • 执行证书自动化生成命令

你可以在 certbot 网站上,选择你的 Web Server 和 操作系统,就能看到对应的安装和配置教程。

(本文主要介绍下面的安装办法)

第二种办法:手动申请安装(由于 CentOS的复杂性,我使用的这种办法)

一、 安装Let’s Encrypt免费SSL准备

安装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源。

二、Let’s Encrypt免费证书生成

单域名生成证书:

./certbot-auto certonly --email [email protected] --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.smusic.cc -d www.smusic.cc

多域名单目录生成单证书:(即一个网站多个域名使用同一个证书)

./certbot-auto certonly --email [email protected] --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.smusic.cc -d www.vpser.net -d bbs.smusic.cc

多域名多目录生成一个证书:(即一次生成多个域名的一个证书)

./certbot-auto certonly --email [email protected] --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

四、SSL证书注意事项:

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的包了。

五、Nginx虚拟主机的设置

配置文件地址: /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,现在足够的安全,并且使用了最新技术,保证了性能。