将 OpenSSL 添加到现有应用中
如果您只需要 SSL/TLS 客户端示例,请查看 OpenSSL 的 wiki 和 TLS Client 示例。
我的第一个困惑是关于证书和私钥,以及如何管理它们。
是的,密钥管理和分发是 crpyto 中最难的问题。
公共 CA 具有涵盖这些做法的具有法律约束力的文件。它们被称为认证实践声明 (CPS)。您可以和他们一起玩得很开心,因为公司的律师会告诉您您不想听到的内容(或者营销部门拒绝告诉您)。
例如,这里是Apple Inc. Certification Authority Certification Practice Statement的摘录:
2.4.2. CA disclaimers of warranties
To the extent permitted by applicable law, Subscriber agreements,
if applicable, disclaim warranties from Apple, including any
warranty of merchantability or fitness for a particular purpose.
2.4.3. CA limitations of liability
To the extent permitted by applicable law, Subscriber agreements,
if applicable, shall limit liability on the part of Apple and shall
exclude liability for indirect, special, incidental, and
consequential damages.
因此,Apple 向您出售的产品没有保修且不承担任何责任!!!他们希望你信任他们并给他们钱……真是个骗局!而且它不仅仅是 Apple - 其他 CA 也有同样淫秽的 CPS。
我应该有一个随应用一起安装的证书吗?
这取决于。如果您正在运行自己的 PKI(即您是 CA 并控制根证书),则将根 X509 证书与您的应用程序一起分发,仅此而已。无需信任任何其他 CA,例如 Verisign 或 Startcom。
如果您使用其他人的 PKI(或 RFC 5280 中指定的 Internet 的 PKI),则仅分发验证链所需的根 X509 证书。在这种情况下,您将分发一个 CA 的根 X509 证书以进行验证。但是,您几乎可以信任由该特定 CA 签名的任何证书(如果您不小心,它可能会达到数千个)。
如果您事先不知道,那么您必须像浏览器一样选择一堆 CA 来信任并为您的应用程序携带它们的根证书。例如,您可以从 Mozilla 获取它们的列表。但是,您几乎可以信任所有 CA 签署的任何证书(如果您不小心,它可能会达到数百万)。
使用公共 CA(如浏览器)还有很多其他内容,您应该阅读 Peter Gutmann 的 Engineering Security。特别注意安全多元化战略。
当客户端连接到您的服务器时,您的服务器应将其 X509 证书(叶证书)和构建有效链所需的任何中间证书发送回您分发的根证书。
最后,您可以通过 Startcom 的 Eddy Nigg 获得大多数主要浏览器(包括移动设备)信任的免费 SSL/TLS 证书。他收取撤销费用(如果需要),因为这就是成本所在。其他 CA 会预先向您收费,并在不需要时将收益收入囊中。
是否应该为每个最终用户生成自己的证书?
这也是可能的。这称为客户端证书或客户端身份验证。理想情况下,您将运行自己的 PKI,因为 (1) 您控制一切(包括 CA 操作)并且不需要信任组织之外的任何人; (2) 让商业 CA 签署每个用户的证书可能会很昂贵。
如果您不想使用客户端证书,请查看 PSK(预共享密钥)和 SRP(安全远程密码)。两者都使用 RSA 密钥传输击败了经典 X509。 PSK 和 SRP 这样做是因为它们提供相互身份验证和通道绑定。在这些系统中,客户端和服务器都知道秘密或密码,并且设置了通道;或其中一个(或两者)不知道并且通道设置失败。纯文本用户名和密码永远不会像在 RSA 传输和basic_auth 方案中那样在线上。 (我更喜欢 SRP,因为它基于 Diffie-Hellman,并且已经在一些系统中实现了它。
私钥呢?
是的,您需要管理与证书关联的私钥。您可以 (1) 将它们存储在具有权限或 ACL 的文件系统中; (2) 将它们存储在 Android、Mac OS X、iOS 或 Windows 等 Keystore 或 Keychain 中; (3) 将它们存储在硬件安全模块 (HSM) 中;或 (4) 远程存储它们,同时使用Key Management Interop Protocol (KMIP) 保持在线。
注意:服务器上无人值守的密钥存储是一个没有解决方案的问题。例如,参见 Peter Gutmann 的 Engineering Security,第 368 页的“Wicked Hard Problems”和“Problems without Solutions”。
我是否将私钥烘焙到服务器二进制文件中?
没有。您可以在需要时生成它们,然后以您可以提供的最佳保护来存储它们。
或者应该有一个带有私钥的文件?
是的,类似的。见上文。
我确定这是一个已解决的问题,但我不太确定去哪里寻找或搜索什么。
由于密钥分配问题,我不确定我是否真的将其称为已解决。
有些实现真的很糟糕,所以您可能想知道代码是如何通过生产的。
您可能想要的第一件事(因为您专注于密钥管理)是对“密钥管理”和“密钥层次结构”的处理。
您可能还需要一些参考资料。从安全工程的角度来看,请阅读 Gutmann 的 Engineering Security 和 Ross Anderson 的 Security Engineering。从实现的角度来看,获取Network Security with OpenSSL 和SSL and TLS: Designing and Building Secure Systems 的副本。