2011-04-19 67 views
6

对于我正在编写的程序,我想使用TLS(或类似的东西)来封装我的应用程序的协议。这将尽量减少我必须做的工作量以及我可能意外创建的漏洞数量。通过TLS与Java中的Web of Trust进行加密和身份验证

我的程序设计为点对点,尽管一个或多个服务器提供一些服务来帮助一个用户找到另一个(它注册IP地址/端口组合),但除此之外别无其他。我想让这个系统非常容错,因此让这些服务器充当证书颁发机构是不可接受的,因为妥协服务器或其密钥会影响太多用户。因此我计划使用信任网。

使用TLS的主要问题是原始TLS 1.2规范(RFC 5246)没有规定使用OpenPGP证书。它似乎非常以x.509为中心。 RFC 6091废弃了RFC 5081并且扩展了RFC 5246,为我所需要的TLS的扩展做了规定。问题是我不认为BouncyCastle实现了这个扩展,我找不到一个Java加密库。我也不想写我自己/为卑诗省做出贡献,因为我不会犯错,而且我也很懒。

此问题的另一个问题是BouncyCastle提供了“轻量级客户端TLS API”,但由于该软件是P2P,服务器端API也是必需的,因此我可以使用TLS使其相信对等发起连接是客户端。我非常肯定,一旦握手完成,它就是一样的。

问题: 有没有什么办法可以使用TLS(我非常怀疑)?是否有像TLS这样的协议是为P2P设计的,或者至少可以以这种方式运行(比如我相信TLS可以),但是可以与OpenPGP证书一起使用?如果两者都不是这样,我是否应该追求在this question中解释的想法,并实施我自己的层从TLS的概念?

链接的RFC:RFC 5246RFC 6091

回答

1

在TLS中,X.509的部分实际上是不透明的斑点处理:

  • 服务器发送其证书(以及一些辅助证书,如果它希望所以)作为(一列)不透明的字节字符串(三字节长度,随后是作为任意字节的编码证书)。
  • 当服务器要求公钥客户端身份验证时,它会发送一个“名称”列表,该列表应该是服务器将识别的根CA的编码X.500名称 - 在那里再次出现不透明blob(二维)字节长度)。
  • 客户端在(如果)发送证书(链)时使用与服务器相同的格式。

由于TLS的定义,客户端和服务器都应该使用peer的公钥,他们得到以任何方式,他们认为合适而这大多是出于TLS规范的范围:证书交换了电线被视为仅仅帮手。因此,在这些blob中实际发送OpenPGP编码的公钥时,只要客户端和服务器都期望它,那么就没有问题了 - 既然您控制了两者的代码,这应该不成问题。

然后,您的问题“简单”成为一个让TLS实现接受给你的blobs而不窒息他们。我知道没有现成的纯Java TLS实现可以适合账单,因此您可能需要编写一些代码 - 但我强烈建议您除了处理证书blob之外,不要提供TLS协议详细信息。这些东西都是微妙的,弱点很容易创建...

+0

不幸的是,这是不正确的。 TLS握手需要解析证书。这是RFC 6091扩展到TLS的原因。 – Nikos 2011-04-20 07:52:28

+0

实际上我实现了TLS客户端和服务器,它们本身并没有解析证书。所以这是可能的。当客户端收到服务器证书时,它将blob交给一个外部回调函数,后者发回公钥以供使用 - 在我的情况下,回调函数将blob解释为X.509证书(它被解析和验证),但它确实可以解释它们,否则甚至将它们丢弃并使用硬编码的服务器公钥,这在一些设置中是有效的。 – 2011-04-20 11:54:36

+0

那么,您的实现将证书作为blob处理的事实并不能消除TLS解析这些证书的要求。你只是把它委托给一个回调,但仍然需要解析来完成协议。 – Nikos 2011-04-20 12:07:40

4

我知道支持RFC 6091(即TLS与openpgp证书)唯一的库是GnuTLS,但我不知道你是否可以使用类似的东西在Java中。或者,您可以复制SSH语义,您可以使用自签名的 X.509证书存储对等方的公钥。

1

据我所知,太阳/ Oracle的JSSE实现只与X.509 TrustManagers交易(你可以自定义处理某些扩展,但仍期望结构有效的X.509证书。

它可能有可能使用Java的安全API来实现RFC 6091,但我不知道如何,它肯定比调整TrustManagers更多的工作,因为你必须深入研究Java的TLS实现

或者,如果是用于定制服务器,则可以将PGP证书中的密钥材料重新用于X.509证书,并将初始PGP证书(及其所有签名)作为Blob存储在客户中tom X.509扩展(因为它或多或少已完成here)。这里的问题是互操作性,因为这样的扩展不是标准。在Java中实现能够理解扩展的TrustManager是绝对可行的,您不需要深入研究Java的TLS堆栈的内部,您只需处理自定义TrustManagers以初始化您的SSLContext。

+0

我也将被迫使用这种方法(定制X509扩展中的blob),否则我将不得不编写自定义的TLS实现或者破解已经存在的东西 - 而且这不是我现在可以做的事情。 – 2013-10-12 10:06:46

相关问题