Openssl 无证书的SSL/TLS

Openssl 无证书的SSL/TLS,openssl,ssl,Openssl,Ssl,我正在做一个pet项目,它将(最终,当它完成时)允许安全的文件传输(不仅仅是这样,其余的并不特别相关)。我想使用OpenSSL库,因为它似乎是最完整的免费加密库(除了SSL/TLS之外,我还需要对基本对称加密和散列的支持) 我希望实现一个类似于SSH的安全方案。基本上,用户可以使用TLSv1(SSLv3.1)连接到我的计算机。无论安全性如何,我都希望连接成功。然后,我希望能够检查用户使用的公钥(而不是整个证书)。该密钥将与已知的公钥进行比较,如果匹配,则允许用户访问特定的命令集。如果不匹配,用户

我正在做一个pet项目,它将(最终,当它完成时)允许安全的文件传输(不仅仅是这样,其余的并不特别相关)。我想使用OpenSSL库,因为它似乎是最完整的免费加密库(除了SSL/TLS之外,我还需要对基本对称加密和散列的支持)

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

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

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

有人能推荐一些文章或文档来帮助我解决这个问题吗


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

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

进一步介绍Eugene的答案(我会将此作为注释,但有点长)

使用(后来改名为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的工具很少,我不确定是否有任何工具能够将其用作客户端证书的形式。)
  • 由于没有外部检查,您将无法信任证书,因此证书是否为自签名(即发行人和主题是否相同)无关紧要,至少假设用户不会向您发送其不同意的证书(因此不必用自己的密钥密封)。这样做的结果是,您可以构建一个服务来非常轻松地颁发证书。例如,对于不想使用
    openssl
    keytool
    命令的用户来说,在浏览器中生成密钥非常方便。是一个示例服务,它将使用用户想要的SAN颁发证书(如果您使用FOAF+SSL/project进行检查,可能会有更新的版本)。无论这种服务使用哪种私钥或颁发者名称都无关紧要,但由于浏览器是围绕传统PKI设计的,因此使用真正的自签名证书并不容易
在请求特定的客户端证书时,也存在一些问题。TLS 1.1规范明确允许空的
认证机构
(请参阅),而TLS 1.0对此没有说明。实际上,即使使用TLS1.0,大多数客户机工具似乎对空列表感到满意(它们只会提供更多选择)。如果您希望您的系统证书易于识别,您可以对所有这些证书使用相同的颁发者DN,即使它们实际上没有使用相同的私钥签名(同样,因为您会忽略签名)。

因此答案是“根本没有不使用证书的简单方法。只使用自签名证书更容易。”?我想这是可行的。但我仍然可以跳过加载任何根证书,对吗?我想明显的后续问题是:我可以强制OpenSSL只接受s吗