HTTPS 运行原理与项目配置

HTTPS 协议 = HTTP + TLS/SSL 协议

它是一个可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。

设计目标主要有三个:

  • 数据保密性:保证数据内容在传输的过程中不会被第三方查看。就像快递员传递包裹一样,都进行了封装,别人无法获知里面装了什么。
  • 数据完整性:及时发现被第三方篡改的传输内容。就像快递员虽然不知道包裹里装了什么东西,但他有可能中途掉包,数据完整性就是指如果被掉包,我们能轻松发现并拒收。
  • 身份校验安全性:保证数据到达用户期望的目的地。就像我们邮寄包裹时,虽然是一个封装好的未掉包的包裹,但必须确定这个包裹不会送错地方,通过身份校验来确保送对了地方。

HTTP 与 HTTPS 区别

(1)HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
(2)使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
(3)HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
(4)http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
(5)HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。

为什么需要加密?

因为http的内容是明文传输的,明文数据会经过中间代理服务器、路由器、wifi热点、通信服务运营商等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉,这就是中间人攻击。所以我们才需要对信息进行加密.

前面说了,HTTPS 协议 = HTTP + TLS/SSL 协议

http TCP三次握手

SSL证书

SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书;

SSL证书就是遵守SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能;

一个有效、可信的SSL数字证书包括一个公共密钥和一个私用密钥(即非对称加密,具体采用的是RSA方式)。公共密钥用于加密信息,私用密钥用于解译加密的信息;

如果你的网站使用SSL证书,客户就知道他们的交易安全可靠,并且充分信赖你的网站。

HTTPS 的工作原理

另外,这篇文章写的很好,https://zhuanlan.zhihu.com/p/43789231

为网站配置 https

Nginx 配置 https (适用nginx 1.15.0 之前)

  • 需要对方提供nginx的证书
  • 拿到证书后,把证书放置到某目录下
  • 复制下文####号中间的内容
  • 把ssl_certificate成你第二步放置的目录
  • 把ssl_certificate_key改成你第二步放置的目录
  • 重启nginx

注意:如果你是docker环境,注意证书放置的路径是否映射正确!

server {
    ################################
    listen       443;
    # 你的域名
    server_name  www.demo1024.com;
    # 你配置的路径
    ssl_certificate /data/nginx/cert/363342222_fx.demo1024.com.pem;
    # 你配置的路径
    ssl_certificate_key /data/nginx/cert/3633480_fx.demo1024.com.key;
    # 固定内容,无需调整
    ssl on;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ################################
    charset utf-8;
    location /wechat_mini/{
        alias /data/nginx/apps/wechat_mini/;
    }
}

Nginx 配置 https (适用nginx 1.15.0 之后)

nginx1.15.0更新日志:

Changes with nginx 1.15.0 05 Jun 2018
Change: 
the "ssl" directive is deprecated; 
the "ssl" parameter of the "listen" directive should be used instead.

意思就是:

ssl 不建议作为一个指令使用,而只是 listen 指令的一个参数

所以应该这样配

server {
    ################################
    listen       443 ssl;
    # 你的域名
    server_name  www.demo1024.com;
    # 你配置的路径
    ssl_certificate /data/nginx/cert/363342222_fx.demo1024.com.pem;
    # 你配置的路径
    ssl_certificate_key /data/nginx/cert/3633480_fx.demo1024.com.key;
    # 固定内容,无需调整
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ################################
    charset utf-8;
    location /wechat_mini/{
        alias /data/nginx/apps/wechat_mini/;
    }
}

Tomcat 配置 https

暂略

证书更新

两种方式:
1、上传新证书,因为新证书和旧证书名字不同,因此还需要修改配置
2、上传新证书,删除老证书,命名新证书为老证书名字(推荐这种方式)

注意:无论哪种方式,更新完毕后,记得重启 nginx\tomcat !!!

https 故障集合

1、新证书替换失败,依旧是旧证书

网站配置新的 https 证书后,在浏览器地址栏左上角依旧显示不安全,通过鼠标点击查看发现,依旧是旧证书。

这个时候

除了 确认我们的web容器新证书替换无误 外,

你还需 确认是否在你的服务器外部架设了运营商的防火墙\反向代理服务器等

如果是的话,需要把新申请的证书发给运营商配置到防火墙上!


转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:HTTPS 运行原理与项目配置

字数:1.5k

本文作者:夏来风

发布时间:2020-11-04, 22:22:21

原始链接:http://www.demo1024.com/blog/https/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。