没有证书的SSL/TLS

Eth*_*han 8 ssl openssl

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

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

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

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

任何人都可以建议任何可能帮助我弄清楚如何实现这一目标的文章或文档吗?

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

Bru*_*uno 4

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

使用FOAF+SSL 项目(后来更名为 WebID)完成此类操作后,坚持使用 X.509 证书可以使实施变得更容易,因为大多数 SSL/TLS 堆栈都是在设计时考虑到它们的(并且它们的 API 反映了这一点)。

上次我检查FOAF+SSL时,客户端仍然使用传统的PKI检查来检查服务器证书。另一种选择与 SSH 类似,是在第一次遇到公钥/证书时接受它,并在其更改时警告用户。无论如何,这或多或少就是 SSH 的工作方式(特别是,我猜很少有人在第一次看到密钥指纹时会真正检查它)。

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

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

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