在Java中使用Web of Trust通过TLS进行加密和身份验证

Hut*_*ut8 6 security encryption ssl bouncycastle

对于我正在编写的程序,我想使用TLS(或类似的东西)来封装我的应用程序的协议.这将最大限度地减少我必须完成的工作量以及我可能意外创建的漏洞数量.

我的程序设计为点对点,尽管一个或多个服务器提供一些服务来帮助一个用户找到另一个(它注册IP地址/端口组合),但几乎没有.我想使这个系统具有容错能力,因此将这些服务器充当证书颁发机构是不可接受的,因为服务器或其密钥的泄露会影响太多用户.因此,我计划使用Web of Trust.

使用TLS的主要问题是原始TLS 1.2规范(RFC 5246)不提供使用OpenPGP证书.它似乎非常以x.509为中心.RFC 6091废弃了RFC 5081并扩展了RFC 5246,它为TLS做了扩展,可以满足我的需要.问题是我不认为BouncyCastle实现了这个扩展,我找不到一个Java加密库.我也不想写我自己的/贡献BC,因为我真的很擅长不犯错误而且我也很懒惰.

另一个问题是BouncyCastle提供"轻量级客户端TLS API"但是因为这个软件是P2P,所以还需要服务器端API,以便我可以使用TLS使其相信发起连接的对等体是客户端.我很确定一旦握手完成它就是一样的.

问题: 有什么方法我仍然可以使用TLS(我非常怀疑)?是否有像TLS这样的协议专为P2P设计,或者至少可以这种方式运行(比如我相信TLS可以),但是可以使用OpenPGP证书吗?如果不是这种情况,我是否应该追求这个问题中解释的想法并实施我自己的TLS概念层?

RFC的链接:RFC 5246RFC 6091

Tho*_*nin 1

在 TLS 中,X.509 部分实际上被处理为不透明的 blob:

  • 服务器将其证书(以及一些辅助证书,如果愿意的话)作为不透明字节字符串(三字节长度,后跟作为任意字节的编码证书)的列表发送。
  • 当服务器请求公钥客户端身份验证时,它会发送一个“名称”列表,这些“名称”应该是服务器将识别的根 CA 的编码 X.500 名称——同样,不透明 blob(两字节长度) 。
  • 客户端在(如果)发送证书(链)时使用与服务器相同的格式。

按照 TLS 的定义,客户端和服务器都应该使用对等公钥,他们可以以任何他们认为合适的方式获得该公钥,但这基本上超出了 TLS 规范的范围:通过线路交换的证书被视为纯粹的助手。因此,只要客户端和服务器都期望,在这些 blob 中实际发送 OpenPGP 编码的公钥就不会出现问题 - 并且由于您控制两者上的代码,因此这应该不成问题。

那么你的问题就“简单地”变成了让 TLS 实现接受向你提供 blob 而不会被它们阻塞的问题。据我所知,目前还没有符合要求的纯 Java TLS 实现,因此您可能需要编写一些代码——但我强烈建议您不要摆弄除证书 blob 处理之外的 TLS 协议细节。这些事情很微妙,弱点很容易创造......