为你的网站配置免费的HTTPS支持

为你的网站配置免费的HTTPS支持

另一篇相关文章:https证书自动续订(renew)问题

一、什么是HTTPS协议?

HTTPS协议是HTTP协议的安全版,S就是Secure(安全)的意思。常称为HTTP over TLS,HTTP over SSL或HTTP Secure。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。
注:关于SSL与TLS的区别请看:TLS与SSL之间关系

二、为什么要用HTTPS协议?

  1. 传输过程中对用户的关键信息进行加密,防止类似Session ID或者Cookie内容,登录时提交的密码,证件号等被攻击者捕获造成的敏感信息泄露等安全隐患。
  2. 传输过程中对数据进行完整性校验,防止DNS或内容遭第三方劫持(使用HTTPS防止流量劫持)、篡改等中间人攻击(MITM)隐患。
  3. 浏览器会显示安全标记(一把锁),用户看到这个用起来也比较放心(实际上也确实是比较安全):

Chrome显示安全标记
Xnip2018-09-30_03-17-22.png

Firefox显示安全标记
Xnip2018-09-30_03-17-53.png

Safari显示安全标记
Xnip2018-09-30_03-18-50.png

三、配置免费的HTTPS服务器

https协议的默认端口是443,要使用https协议,需要在网页服务器(nginx或apache httpd)把原来监听80端口改监听443端口,并配置ssl支持,这样你的网站就支持https协议了,这里我用nginx作为示例:

1、修改nginx配置文件

未配置ssl

server {
    listen 80;
    server_name www.xiebruce.top xiebruce.top;
    access_log /data/wwwlogs/www.xiebruce.top_nginx.access.log combined;
    error_log /data/wwwlogs/www.xiebruce.top_nginx.error.log error;
    index index.html index.htm index.php;
    root /data/wwwroot/wordpress;

    location / {
      try_files $uri $uri/ /index.php?$args;
    }
}

配置了ssl支持

server {
    listen 443;
    server_name www.xiebruce.top xiebruce.top;
    access_log /data/wwwlogs/www.xiebruce.top_nginx.access.log combined;
    error_log /data/wwwlogs/www.xiebruce.top_nginx.error.log error;
    index index.html index.htm index.php;
    root /data/wwwroot/wordpress;

    #ssl start
    ssl on;
    ssl_certificate /etc/letsencrypt/live/xiebruce.top/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xiebruce.top/privkey.pem;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHellA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    #ssl end

    location / {
      try_files $uri $uri/ /index.php?$args;
    }
}

不同网站具体需配置规则可能不一样,你不需要看我的具体配置,你只要在你原来的配置基础上,把listen 80改成listen 443,然后添加以下ssl支持语句即可:

ssl on;
ssl_certificate /etc/letsencrypt/live/www.xiebruce.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.xiebruce.top/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHellA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

其中ssl_certificate为数字证书(相当于公钥)路径,ssl_certificate_key为私钥路径,直接使用以上配置是不行的,因为数字证书文件和私钥文件并不存在,我们需要获取才可以,那这个数字证书和私钥文件从哪里来呢?其实数字证书(包括私钥,因为它们是一对的)是由证书授权机构颁发的,这是全球10大数字证书颁发机构:全球10大SSL证书品牌对比, 通过对比,我最后选用了Let's Encrypt这个证书授权机构,也就是说,我们要从Let's Encrypt这个证书授权机构中获取数字证书和私钥文件。

2、获取数字证书

我们可以使用ACME(Automatic Certificate Management Environment )自动证书管理环境工具——certbotLet's Encrypt这个证书授权机构里免费获取证书并管理证书,如果要了解Let's Encrypt证书授权原理请查看:How It Works

2.1 安装certbot

sudo yum install certbot

如果yum找不到安装包,请先使用以下语句安装epel,再回过头去安装certbot

sudo yum -y install epel-release

2.2 获取指定域名证书

certbot certonly --webroot -w /data/wwwroot/wordpress -d www.xiebruce.top -d xiebruce.top

实例截图
Xnip2018-10-04_15-49-59.png
其中-w后面的参数为表示网站根目录,-d后的参数为域名,这句命令会从Let’s Encrypt里获取证书和私钥,最后会打印出证书和私钥存储在什么路径。

生成的证书文件如下:

总用量 28K
drwxr-xr-x 2 xiebruce xiebruce 4.0K 11月 25 23:09 .
drwx------ 4 xiebruce xiebruce 4.0K 2月  14 15:41 ..
-rw-r--r-- 1 xiebruce xiebruce 1.9K 11月 25 23:09 cert.pem
-rw-r--r-- 1 xiebruce xiebruce 1.7K 11月 25 23:09 chain.pem
-rw-r--r-- 1 xiebruce xiebruce 3.5K 11月 25 23:09 fullchain.pem
-rw-r--r-- 1 xiebruce xiebruce 1.7K 11月 25 23:09 privkey.pem
-rw-r--r-- 1 xiebruce xiebruce  682 11月 25 23:09 README

各文件作用:

文件名 内容
cert.pem 服务端证书
chain.pem 浏览器需要的所有证书但不包括服务端证书,比如根证书和中间证书
fullchain.pem 包括了cert.pem和chain.pem的内容
privkey.pem 证书的私钥

把这两个路径复制到前面的nginx配置文件中的ssl_certificate和ssl_certificate_key参数中,nginx -s reload,然后用https访问你的域名试试吧:

/etc/letsencrypt/live/www.xiebruce.top/fullchain.pem
/etc/letsencrypt/live/www.xiebruce.top/privkey.pem

如果你同一个服务器中有多个网站,你还可以同时设置多个域名,示例如下:

sudo certbot certonly --webroot -w /var/www/abc -d abc.com -d www.abc.com -w /var/www/xyz -d xyz.cn -d m.xyz.cn

此命令将获得abc.com,www.abc.com,xyz.cn和m.xyz.cn的单个证书; 它会将文件放在/var/www/abc下面以证明前两个域的控制,并在/var/www/xyz下放置第二对。

2.3 获取通配符证书

这一步不是必须的,这是用通配符的方法配置https证书,有些童鞋可能需要匹配通配符证书,而不是每个域名都要自己手动写,特别要注意的是,通配符证书无法匹配无www的域名解析,比如我的博客域名,有www的是www.xiebruce.top,无www的是xiebruce.top,那么通配符解析*.xiebruce.top只能解析有www的,这很好理解,因为就算*可以为空,但后面还有个点呀,.xiebruce.topxiebruce.top还是无法匹配的,并且这个点是不能去掉的,也就是通配符你不可以写成*xiebruce.top

下面开始配置通配符证书,在配置之前,请先打开你的添加域名解析记录的窗口,比如我是阿里云的域名,我就在阿里云里打开准备添加解析记录的窗口,并且记录类型选TXT,注意是TXT,不是A:

Xnip2018-11-29_15-38-05.jpg

然后执行以下命令:

sudo certbot certonly  -d '*.xiebruce.top' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

特别注意!!!到了Please deploy a DNS TXT record under the name这一步,不要直接按回车,前面不是打开了添加解析记录的窗口吗?现在你要做的就是把下图显示的这个域名和记录值填到那里,然后点确定添加这条解析记录:
Xnip2018-10-04_16-44-25.png

看,就是这么填:
Xnip2018-10-04_16-54-45.png

记录类型:TXT
主机记录:_acme-challenge.xiebruce.top,这是我的域名,你的域名肯定不一样,但前面的『_acme-challenge』这个应该是一样的
记录值:这个填给出的记录值即可

添加完域名解析以后,用以下命令检查是否已经解析成功(注意,这个命令不用在服务器运行,在你自己电脑上,或者服务器重新开一个窗口运行就行,千万别断掉你前面正在运行的certbot),另外注意换成你的域名:

dig  -t txt  _acme-challenge.xiebruce.top @8.8.8.8

通过上边的dig命令检测,如果出现以下红框中的内容,则说明解析成功,现在你可以回到刚才用certbot申请通配符证书那里按回车了,按回车后,正常的话,数字证书和私钥路径会显示出来,还是像前面那样,把它粘到你的nginx的ssl配置对应的ssl_certificate和ssl_certificate_key里面:修改nginx配置文件 然后sudo nginx -s reload即可。
Xnip2018-10-04_17-01-24.png

  • 实例截图
    Xnip2018-09-26_22-03-37.png

2.4 续订证书

通配符证书自动更新,请看:https证书自动续订(renew)问题

这个证书的有效期为90天,因为第一次弄,我也不知道是90天后才能续订还是第90天就能续订,后面续订之后再来更新吧。

如果你是通配符方式获取的,那重新运行一次那个命令即可。

如果你是用--webroot安装的,使用以下命令测试续订是否正常(dry run是演练、排练的意思):

sudo certbot renew --dry-run

如果以上语句没有问题,则执行以下命令更新(该方式无法更新通配符证书):

sudo certbot renew

另外可安装certbot-auto,其功能与certbot类似,好像比certbot更方便一点:

# 下载
wget https://dl.eff.org/certbot-auto
# 设为可执行权限
chmod u+x certbot-auto

本文参考:轻松上Https | 为你的网站免费配置Let’s Encrypt证书

打赏
订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

为你的网站配置免费的HTTPS支持