对于我正在编写的程序,我想使用TLS (或类似的东西)封装我的应用程序的协议。这将减少我必须做的工作量以及我可能意外创建的漏洞的数量。
我的程序被设计成点对点,虽然一个或多个服务器提供了一些服务来帮助一个用户定位另一个用户(它注册IP地址/端口组合),但是没有做其他的事情。我想让这个系统非常容错,所以让这些服务器充当证书颁发机构是不可接受的,因为服务器或其密钥的妥协会影响太多的用户。因此,我计划使用信任网。
使用TLS的主要问题是,最初的TLS1.2规范(RFC 5246)不允许使用OpenPGP证书。它似乎非常以x.509为中心。RFC 6091淘汰了RFC 5081并扩展了RFC 5246,它为TLS的扩展做了我想做的事情。问题是,我认为BouncyCastle没有实现这个扩展,也找不到这样的Java库。我也不想为BC写我自己的文章,因为我不擅长不犯错误,而且我也很懒。
这方面的另一个问题是,BouncyCastle提供了“重量轻的客户端TLS”,但由于该软件是P2P,因此服务器端API也是必要的,这样我就可以通过使它相信发起连接的对等方是客户端而使用TLS。我很肯定,一旦握手完成,它是一样的。
问题:是否还可以使用TLS (我对此非常怀疑)?是否有为P2P设计的类似TLS的协议,或者至少可以以这种方式工作(我相信TLS可以),但可以使用OpenPGP证书?如果这两种情况都不是这样,那么我是否应该遵循这个问题中解释的思想,并实现我自己的层--从TLS中获取概念?
发布于 2011-04-20 08:00:37
我所知道的唯一支持RFC 6091 (即带有openpgp证书的TLS )的库是GnuTLS,但我不知道您是否可以在Java中使用类似的东西。或者,您可以复制SSH语义,使用自签名的X.509证书存储对等方的公钥。
发布于 2011-04-19 21:24:52
在TLS中,X.509部件实际上是作为不透明块处理的:
正如TLS所定义的那样,客户机和服务器都应该使用对等公钥,它们以任何他们认为合适的方式获得该公钥,这基本上超出了TLS规范的范围:通过有线交换的证书被认为仅仅是帮助者。因此,在这些blobs中实际发送OpenPGP编码的公钥是没有问题的,只要客户机和服务器都期待它--既然您控制了这两个方面的代码,这就没有问题了。
那么,您的问题“简单”就变成了让TLS实现接受给您的blobs而不被阻塞的问题。我不知道现有的Java --只有TLS实现--符合要求,所以您可能需要编写一些代码--但我建议您不要篡改TLS协议的细节,只需处理证书块。那些东西很微妙,弱点很容易制造.
发布于 2011-05-28 21:52:49
据我所知,Sun/Oracle实现只处理X.509 TrustManagers (您可以定制X.509来处理某些扩展,但仍然需要一个结构上有效的X.509证书。
也许可以使用Java的安全API来实现RFC 6091,但我不确定如何实现。这肯定不仅仅是调整TrustManagers,因为您必须深入了解Java的TLS实现。
或者,如果是针对定制服务器,您可以将来自PGP证书的关键材料重用到X.509证书中,并将初始的PGP证书(及其所有签名)作为blob放在自定义X.509扩展中(因为它或多或少已经完成了这里)。这里的问题是互操作性,因为这样的扩展不是标准。在Java中实现一个能够理解扩展的TrustManager绝对是可行的,而且您不需要深入了解Java的TLS堆栈的内部,您只需处理自定义TrustManagers就可以初始化SSLContexts。
https://stackoverflow.com/questions/5721607
复制相似问题