没有证书的SSL / TLS

时间:2011-12-23 18:41:03

标签: openssl ssl

我正在研究一个宠物项目(最终,当它完成时)允许安全的文件传输(除此之外还有更多,但其余的并不是特别相关)。我想使用OpenSSL库,因为它似乎是最完整的免费加密库(我需要支持基本的对称加密和散列,以及SSL / TLS)。

我正在寻求为SSH实现类似的安全方案。基本上,用户将使用TLSv1(SSLv3.1)连接到我的计算机。无论安全性如何,我都希望连接成功。然后,我希望能够检查用户使用的公共密钥(而不是整个证书)。该密钥将与已知公钥进行比较,如果匹配,则允许用户访问某组命令。如果它不匹配,用户可以选择使用连接申请将他/她的公钥添加到我的集合中,但除此之外将无法访问我的服务。

我对证书没有特别需要。如果我可以跳过所有证书详细信息并仅使用原始加密密钥,那对我来说会简单得多。这是因为该模型遵循Web信任模型,而不是大多数SSL / TLS连接使用的分层模型,因此我不需要任何CA或签名证书。

不幸的是,大多数OpenSSL的文档都不存在。我发现的所有相关文章似乎都在设置“标准”SSL / TLS连接,其中服务器的证书一直到一组根证书进行验证。这可能很有用,但我很难弄清楚如何启动和运行这些非传统的SSL连接。

任何人都可以建议任何可能帮我弄清楚如何完成此任务的文章或文档吗?

(OpenSSL的使用不是一成不变的,如果能提供更好的实现方法,我可以切换到另一个库,以及散列[SHA-512]和对称加密[AES]。我是旨在针对Linux,但如果最终产品可以移植到Windows,那么我的朋友们也可以使用它,这样会很好。)

2 个答案:

答案 0 :(得分:3)

扩展Eugene的答案(我会把它作为评论,但它有点长)...

使用FOAF+SSL project(稍后重命名的WebID)完成此类操作后,坚持使用X.509证书可以简化实现,因为大多数SSL / TLS堆栈都是考虑到它们而设计的(以及它们的API反映这一点)。

上次我检查了FOAF + SSL时,传统的PKI检查仍然存在,客户端检查服务器证书。与SSH类似的另一个选择是在您第一次遇到公钥/证书时接受公钥/证书,并在用户更改时发出警告。这或多或少都是SSH工作的方式(特别是,我猜很少有人在他们第一次看到它时实际检查了键的指纹)。

仅考虑客户端证书的使用(尽管其中一些可能以类似的方式应用于服务器证书):

  • 大多数服务器库似乎都能够处理X.509证书,但允许您更改它们的验证方式(例如Java中的X509TrustManager)。
  • 虽然在您以其他方式验证之前,您将无法信任客户证书所说的任何内容,但能够嵌入一些额外信息(例如主题DN或主题备用名称以查看用户声称是谁)可以帮助(a)用户组织他们的证书和(b)提示验证者知道要查找什么。公共密钥很难管理。
  • 许多现有客户端工具(尤其是浏览器)在执行SSL / TLS客户端身份验证时使用X.509证书。配置客户端以使用自签名X.509证书(而不是PKI的证书)并不需要做太多工作。 (支持OpenPGP for TLS的工具很少,我不确定是否能够将其用作客户端证书的形式。)
  • 由于您无法在没有外部检查的情况下信任证书,因此无论是否自签(无论发行人和主题是否相同)都无关紧要,至少假设用户不愿意向您发送不同意的证书(因此不必用自己的密钥密封)。这样做的结果是,您可以非常轻松地构建服务以颁发证书。例如,浏览器内密钥生成对于不想使用opensslkeytool命令的用户来说非常方便。 Here是一个示例服务,它将使用用户想要的SAN颁发证书(如果您使用FOAF + SSL / WebID项目检查,可能会有更新的版本)。无论这种服务使用哪种私钥或发行者名称都很重要,但由于浏览器是围绕传统的PKI设计的,因此使用真正的自签名证书并不容易。

在要求特定的客户证书方面也存在问题。 TLS 1.1规范明确允许空certification authorities(参见RFC 4346),而TLS 1.0对此主题保持沉默。实际上,即使使用TLS 1.0,大多数客户端工具似乎也对空列表感到满意(他们只会提供更多选择)。如果您希望系统的证书易于识别,则可以对所有这些证书使用相同的颁发者DN,即使它们在实践中未使用相同的私钥签名(同样,因为您将忽略签名)。

答案 1 :(得分:2)

使用自签名证书 - 这与“原始”密钥相同,但更易于管理(有关如何接受或不接受openssl中的自签名证书,请参阅this question。)