前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你还没有迁移到 HTTPS 吗?

你还没有迁移到 HTTPS 吗?

作者头像
somenzz
发布2020-11-25 10:26:09
6300
发布2020-11-25 10:26:09
举报
文章被收录于专栏:Python七号Python七号

阅读本文大概需要 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技术分享

欢迎订阅、在看、转发

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python七号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、HTTP 与 HTTPS
  • 2、不迁移能行吗?
  • 3、如何迁移
  • 4、重定向问题
  • 写在最后
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档