你还没有迁移到 HTTPS 吗?

2020-11-25 10:26:09 浏览数 (1)

阅读本文大概需要 3.6 分钟。

我看到很多项目开发的网站,都是以 HTTP 方式进行访问,不过都是在公司内部使用,就算不安全也影响不大。但是一旦接入互联网,那就是另一回事了,只要你的网站需要用户注册,传输卡号、密码等敏感信息,建议都迁移到 HTTPS,下面就来具体聊一聊迁移到 HTTPS 的必要性及相关迁移的方法。

1、HTTP 与 HTTPS

超文本传输协议即 HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 WEB 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP 协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

为了解决 HTTP 协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议 HTTPS,为了数据传输的安全,HTTPS 在 HTTP 的基础上加入了 SSL 协议,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

虽然 HTTPS 比 HTTP 多了一个 S,但在具体的通信过程是比较复杂的,如下图所示:

具体有以下步骤:

1、客户使用 HTTPS 的 URL 访问 WEB 服务器,要求与 WEB 服务器建立 SSL 连接。

2、WEB 服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

3、客户端的浏览器与 WEB 服务器开始协商 SSL 连接的安全等级,也就是信息加密的等级。

4、客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

5、WEB 服务器利用自己的私钥解密出会话密钥。

6、WEB 服务器利用会话密钥加密与客户端之间的通信。

2、不迁移能行吗?

如果网站仅做信息展示,不传输敏感信息,迁移不迁移都影响不大。但是大部分网站都需要用户留存,这就需要传输用户信息,用户信息基本都是敏感信息,需要加密传输,防止中间人截获,这就需要用到 HTTPS。

另外,如果你的网站不是 HTTPS,主流的浏览器都会提示用户,这是一个不安全的网站,给用户一定的访问心理压力,胆小的就不在访问你的网站了。谷歌等主流搜索引擎也会降低非 HTTP 网站的搜索结果排名,导致你的网站几乎搜索不到。

因此,迁移到 HTTPS 已经势在必行。

3、如何迁移

首先,要申请一个证书,至于为什么非要申请证书,请查看博客: https://blog.csdn.net/fangqun663775/article/details/55189107,这里不多说。

大型网站,出于形象考虑,可以向传统证书颁发机构申请证书,如 CA,DigiCert 等。中小型网站可以使用 Let’s Encrypt 这样的免费证书。 Let’s Encrypt 一直在推动证书的自动化部署,为此还实现了专门的 ACME 协议(RFC8555)。有很多的客户端软件可以完成申请、验证、下载、更新的一条龙操作,比如 Certbot、acme.sh 等等,都可以在 Let’s Encrypt 网站上找到,用法很简单,相关的文档也很详细,几分钟就能完成申请。

其次,配置 HTTPS,这里贴下 nginx 的配置。

代码语言:javascript复制
listen                443 ssl;

ssl_certificate       xxx_rsa.crt;  #rsa2048 cert
ssl_certificate_key   xxx_rsa.key;  #rsa2048 private key

ssl_certificate       xxx_ecc.crt;  #ecdsa cert
ssl_certificate_key   xxx_ecc.key;  #ecdsa private ke

这在 Nginx 上非常简单,只要在 listen 指令后面加上参数 ssl,再配上刚才的证书文件就可以实现最基本的 HTTPS。

为了提高 HTTPS 的安全系数和性能,你还可以强制 Nginx 只支持 TLS1.2 以上的协议,打开 Session Ticket 会话复用:

代码语言:javascript复制
ssl_protocols               TLSv1.2 TLSv1.3;

ssl_session_timeout         5m;
ssl_session_tickets         on;
ssl_session_ticket_key      ticket.key;

密码套件的选择方面,建议是以服务器的套件优先。这样可以避免恶意客户端故意选择较弱的套件、降低安全等级,然后密码套件向 TLS1.3 看齐,只使用 ECDHE、AES 和 ChaCha20,支持 False Start。

代码语言:javascript复制
ssl_prefer_server_ciphers   on;


ssl_ciphers   ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE AES128:!MD5:!SHA1;

更具体详细的优化配置还可以参考 nginx 官方文档。

配置完成后可以访问 https://www.ssllabs.com/ 来测试你的网站的安全程度,它会模拟多个客户端发起测试,给出一个综合的评分。

4、重定向问题

新的 HTTPS 站点配置好后,原来的 HTTP 站点还不能立即关闭,还有不少用户的书签中存的就是 HTTP 的链接。这就需要由 HTTP 自动跳转到 HTTPS 的技术,nginx 中的配置也非常简单。

代码语言:javascript复制
return 301 https://$host$request_uri;             # 永久重定向
rewrite ^  https://$host$request_uri permanent;   # 永久重定向

但这种方式有两个问题。一个是重定向增加了网络成本,多出了一次请求;另一个是存在安全隐患,重定向的响应可能会被中间人窜改,实现会话劫持,跳转到恶意网站。

不过有一种叫 HSTS 的技术可以解决这个问题(HTTP 严格传输安全,HTTP Strict Transport Security),HTTPS 服务器需要在发出的响应头里添加一个 Strict-Transport-Security 的字段,再设定一个有效期,例如:

代码语言:javascript复制
Strict-Transport-Security: max-age=15768000; includeSubDomains

这相当于告诉浏览器:我这个网站必须严格使用 HTTPS 协议,在半年之内(182.5 天)都不允许用 HTTP,你以后就自己做转换吧,不要再来麻烦我了。

有了 HSTS 的指示,以后浏览器再访问同样的域名的时候就会自动把 URI 里的 http 改成 https ,直接访问安全的 HTTPS 网站。这样中间人就失去了攻击的机会,而且对于客户端来说也免去了一次跳转,加快了连接速度。

写在最后

你的网站服务是基于 HTTPS 么?从 HTTP 到 HTTPS 是大势所趋,如果你们还在用 HTTP 提供服务,是时候进行迁移了。

(完)

专注于Python技术分享

欢迎订阅、在看、转发

0 人点赞