TLS 与 mTLS 的私钥交换过程

不管是 HTTPS, SSH, SFTP, SCP 等都涉及到 SSL(Secure Sockets Layer) 或 TLS(Transport Layer Security),以及使用非对称加密交互私钥的过程。

很久很久以前傻傻的认为所谓的非对称加密是像 MD5 那样内容加密后,无法从 MD5 码中还原出原始内容,其实那不就加密,是摘要(Digest)。非对称指的是加密与解密使用是不一样的密钥,即用公钥加密,私有解密。

提到 SSL 和 TLS, 顺便了解一下它们的极简史

SSL 由 Netscape 于 90 年代开发,SSL1.0(94 年,未公开), SSL 2.0(95 年发布), SSL 3.0(96 年发布), 后来 IETF 出了个 TLS 1.0 作为 SSL 3.0 的继承者,再就是后面的 TLS 1.1(2006), 1.2(2008), 1.3(2018)。2015 年 TLS 正式的取代了 SSL,从此江湖不再有 SSL 了,而我们习惯说的 SSL 只是在向曾经的 Netscape 致敬,其实指代的就是 TLS。

HTTPS 并非一直使用非对称加密进行数据通信,而只是用 TLS 安全的交换密钥,而后的数据通信使用私钥进行对称加密。如果数据通信都用非对称的方式性能是不允许的,所以只用非对称的方式进行密钥交换。

说到公钥(public key) 私钥(private key),必须清楚两个关系:

  1. 公钥加密的数据只能用私钥解密
  2. 私钥加密码的数据也只能用私服钥解密

TLS 触及了三个概念:公钥,私钥,密钥。公私钥的产生可以用命令 ssh-keygen -t rsaopenssl genrsa, 或第三方的证书颁发机构(CA)。公钥之所谓之公钥,可以明文传输,被截取了问题也不大,因为用它加密的数据只有掌握了私钥的一方才能解密读出来

关于非对称加密可参考本人之前写过的一篇 Python 实现 RSA 非对称加解密

TLS 单向与 mTLS 多向认证过程,从网络上 基于证书的双向认证(mTLS)技术方案 找了两张容易理解的过程图

TLS 单向认证过程

 

要点

  1. 只需要客户端单向信任服务端的证书,以获服务端公钥
  2. 服务端确定好的对称加密方案是以明文的方式发送给客户端
  3. 客户端生成随机密钥,用从服务端得来的公钥对密钥加密送给服务端
  4. 服务端用本地私钥解开密钥,用于将来的对称加密通信

mTLS 双向认证过程

 

要点

  1. 服务端与客户端需互相信息证书,及交换各自的公钥
  2. 服务端确认的加密方式用客户端的公钥进行加密后发送给客户端
  3. 客户端用本地私钥解开获知加密方式,生成随机密钥,用服务端的公钥对密钥加密传给服务端
  4. 服务端用本地私钥解开密钥,用于将来的对称加密通信

TLS 与 mTLS 的主要区别

除了客户端要信息服务端的证书外,mTLS 客户端也有自己的证书和公钥需发送给服务端,让服务端信任。服务端确定要加密方式后用客户外公钥进行加密,更安全的方式发送给客户端。与 TLS 单向认证相比,不仅要求客户端的密钥用非对称的方式确定,而且加密方式也是用非对称的方式确定的,这进一步增加了破解的难度,因为对称加密方式在当前的 Linux, mac OS 下都有 60 种之多。

在 Linux/mac OS 下用命令 openssl ciphers -v 可列出所有支持的对称加密方式

接下将使用自签证书和可信任的证书颁发机构(CA)签发的证书来体验 HTTPS 单向 TLS 和双向(mTLS) 认证的实际就用场景。

链接:

  1. 基于证书的双向认证(mTLS)技术方案
  2. What is mutual TLS (mTLS)?
  3. HTTPS双向认证(Mutual TLS authentication)
  4. NGINX 配置本地HTTPS(双向认证)
  5. nginx 自签证书实现配置 https 双向认证

本文链接 https://yanbin.blog/tls-and-mtls-private-key-exchange/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments