我正在从事一个宠物项目(最终,当它完成时)允许安全的文件传输(不仅如此,但其余的并不是特别相关)。我想使用 OpenSSL 库,因为它似乎是最完整的免费加密库(除了 SSL/TLS 之外,我还需要对基本对称加密和散列的支持)。
我正在寻求实现一个与 SSH 类似的安全方案。基本上,用户会使用 TLSv1 (SSLv3.1) 连接到我的计算机。无论安全性如何,我都希望连接成功。然后,我希望能够检查用户使用的公共(public) key (不是整个证书)。该 key 将与已知的公钥进行比较,如果匹配,则用户将被允许访问一组特定的命令。如果不匹配,用户可以选择使用连接申请将他/她的公钥添加到我的集合中,但除此之外将无法访问我的服务。
我对这里的证书没有任何特别的需求。如果我可以跳过所有证书详细信息并仅使用原始加密 key ,那对我来说会简单得多。这是因为此模型遵循信任网络模型,而不是大多数 SSL/TLS 连接使用的分层模型,因此我不需要任何 CA 或签名证书。
不幸的是,大多数 OpenSSL 的文档根本不存在。我发现的所有相关文章似乎都在忙于设置“标准”SSL/TLS 连接,其中服务器证书一直被验证到一组根证书。这可能很有用,但我很难弄清楚如何启动和运行这些非传统 SSL 连接。
任何人都可以推荐任何文章或文档来帮助我弄清楚如何实现这一目标吗?
(OpenSSL 的使用并不是一成不变的,如果它提供了更好的方法来实现这一点,我可以切换到另一个库,以及散列 [SHA-512] 和对称加密 [AES]。我是旨在针对 Linux,但如果最终产品可移植到 Windows,这样我的 friend 也可以使用它,那就太好了。)
最佳答案
扩展 Eugene 的回答(我会把它作为评论,但它有点长)...
用 FOAF+SSL project 完成了这类事情(后来更名为 WebID),坚持使用 X.509 证书使实现更容易,因为大多数 SSL/TLS 堆栈在设计时都考虑到了它们(并且它们的 API 反射(reflect)了这一点)。
我上次查FOAF+SSL的时候,传统的PKI检查还在,客户端查服务器证书。与 SSH 类似的另一种选择是在您第一次遇到公钥/证书时接受它,并在它发生变化时警告用户。这或多或少是 SSH 的工作方式(特别是,我猜想很少有人会在第一次看到 key 指纹时实际检查带外指纹)。
仅考虑客户端证书的使用(尽管其中一些可以以类似的方式应用于服务器证书):
- 大多数服务器库似乎都能够处理 X.509 证书,但您可以更改它们的验证方式(例如 Java 中的
X509TrustManager
)。 - 虽然您无法信任客户端证书所说的任何内容,除非您以其他方式对其进行验证,但能够嵌入一些额外的信息(例如主题 DN 或主题备用名称以查看用户声称是谁) 可以帮助 (a) 用户组织他们的证书和 (b) 提示验证者知道要寻找什么。裸露的公钥可能难以管理。
- 许多现有的客户端工具(尤其是浏览器)在进行 SSL/TLS 客户端身份验证时使用 X.509 证书。配置客户端使用自签名 X.509 证书(与来自 PKI 的证书相对)不需要做太多工作。 (很少有工具支持 TLS 的 OpenPGP,我不确定是否有任何工具能够将其用作客户端证书的一种形式。)
- 由于您无法在没有外部检查的情况下信任该证书,因此它是否是自签名的并不重要(即颁发者和主题是否相同),至少假设用户不会'不会向您发送它不同意的证书(因此不必用自己的 key 密封)。这样做的结果是您可以很容易地构建一个服务来颁发证书。例如,在浏览器中生成 key 对于不想使用
openssl
或keytool
命令的用户来说很方便。 Here是一个示例服务,它将使用用户想要的 SAN 颁发证书(如果您查看 FOAF+SSL/WebID 项目,可能会有更新的版本)。无论此类服务使用哪个私钥或颁发者名称都无关紧要,但由于浏览器是围绕传统 PKI 设计的,因此使用真正的自签名证书并不容易。
在请求特定客户端证书时也存在问题。 TLS 1.1 规范明确允许空证书颁发机构
(请参阅 RFC 4346 ),而 TLS 1.0 对此主题保持沉默。实际上,即使使用 TLS 1.0,大多数客户端工具似乎也对空列表很满意(它们只会提供更多选择)。如果您希望您的系统证书易于识别,您可以对所有这些证书使用相同的颁发者 DN,即使它们在实践中没有使用相同的私钥签名(同样,因为您会忽略签名)。
关于openssl - 没有证书的 SSL/TLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8619528/