1 HTTP 和 HTTPS

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。(引用自:百度百科)

HTTP协议是一个被用于在浏览器和服务器之间传输信息的应用层协议,HTTP协议以明文的方式发送信息,不对数据进行加密。 这就会带来安全隐患,如果信息在传输过程中被拦截,那么就可以直接得到发送的信息,所以很多敏感数据不适合用这种协议传输,比如一些卡号、密码等。

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。(引用自:百度百科)

「安全」就是HTTPS协议的最大特性之一,它解决了HTTP协议的不安全问题。除此之外,还可以确保网站的「真实性」,它是如何做到的呢?

简单来说,就是把先前的明文传输换成密文传输,具体可以看这篇文章「HTTPS为什么安全」

2 Let’s Encrypt

要想的网站上启用 HTTPS,就需要从证书颁发机构(CA)获取证书(一种文件)。而Let's Encrypt是由非营利性互联网安全研究组(ISRG)提供的免费,自动化和开放的证书颁发机构。

3 实战

使用 letsencrypt 添加 https 证书,这里的演示基于Ubuntu 16.04

3.1 安装 letsencrypt

sudo apt install letsencrypt

3.2 生成 key

sudo letsencrypt certonly --standalone -d www.example.com

3.3 可能碰到的问题

  • 问题1:

    domain names was not valid, has an _ (underscore) in the name or equested domain domain is not a FQDN.

    解决方案:二级域名中不能包含下划线_,请修改二级域名。

  • 问题2:

    Problem binding to port 443: Could not bind to IPv4 or IPv6.

    解决方案:先关闭 Nginx,再生成 key。

3.4 自动续期

letsencrypt 的有效期只有两个月,使用 Linux 定时任务corntab完成每月1日自动检查续期。

sudo crontab -e
# 在最后一行添加
0 0 1 * * service nginx stop; letsencrypt renew; service nginx reload