对于我正在编写的程序,我想使用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证书吗?如果不是这种情况,我是否应该追求this question中解释的想法并从TLS实施我自己的层概念?
答案 0 :(得分:4)
我知道支持RFC 6091的唯一库(即带有openpgp证书的TLS)是GnuTLS,但我不知道你是否可以在Java中使用类似的东西。或者,您可以复制SSH语义,使用自签名存储对等方的公钥 X.509证书。
答案 1 :(得分:1)
在TLS中,X.509部件实际上被处理为不透明的blob:
当定义了TLS时,客户端和服务器都应该使用对等公钥,他们以任何他们认为合适的方式获取 并且这大部分超出了TLS规范的范围:证书通过电线交换被认为仅仅是帮助者。因此,实际在这些blob中发送OpenPGP编码的公钥是没有问题的,只要客户端和服务器都期望它 - 并且由于你在两者上都控制代码,这应该没有问题。
然后你的问题“简单地”变成了让TLS实现接受把你的blob交给你而不会窒息它们的问题。我知道没有现有的仅适用于Java的TLS实现,因此您可能需要编写一些代码 - 但我建议您不要处理TLS协议的详细信息,除了处理证书blob。那些东西是微妙的,弱点很容易创造......
答案 2 :(得分:1)
据我所知,Sun / Oracle JSSE实现仅处理X.509 TrustManagers(您可以自定义处理某些扩展,但仍然期望结构有效的X.509证书。
可能使用Java的安全API来实现RFC 6091,但我不确定如何。这肯定比调整TrustManagers更有用,因为你必须深入研究Java的TLS实现。
或者,如果是定制服务器,您可以将PGP证书中的密钥材料重新用于X.509证书,并将初始PGP证书(及其所有签名)作为blob放入自定义X.509扩展中(因为它或多或少地完成了here)。这里的问题是互操作性,因为这样的扩展不是标准。在Java中实现能够理解扩展的TrustManager绝对是可行的,您不需要深入了解Java TLS堆栈的内部,您只需要处理自定义TrustManagers来初始化您的SSLContexts。