将OpenSSL添加到现有应用程序中

将OpenSSL添加到现有应用程序中,ssl,openssl,Ssl,Openssl,我正在向现有应用程序添加SSL支持(目前正在推进OpenSSL)。在阅读大量文章和观看视频之前和之后,我从来没有做过任何关于密码学的事情。对于如何针对我的具体情况实现它,我仍然有点困惑 我们的软件是客户机/服务器,最终用户购买这两种软件,并将在其场所安装 我的第一点困惑是关于证书和私钥,以及如何管理它们。我应该有一个随应用程序一起安装的证书吗?每个最终用户是否应该生成自己的证书?私钥呢?我是否将私钥烘焙到服务器二进制文件中?还是应该有一个带有私钥的文件 我确信这是一个已解决的问题,但我不太确定该

我正在向现有应用程序添加SSL支持(目前正在推进OpenSSL)。在阅读大量文章和观看视频之前和之后,我从来没有做过任何关于密码学的事情。对于如何针对我的具体情况实现它,我仍然有点困惑

我们的软件是客户机/服务器,最终用户购买这两种软件,并将在其场所安装

我的第一点困惑是关于证书和私钥,以及如何管理它们。我应该有一个随应用程序一起安装的证书吗?每个最终用户是否应该生成自己的证书?私钥呢?我是否将私钥烘焙到服务器二进制文件中?还是应该有一个带有私钥的文件

我确信这是一个已解决的问题,但我不太确定该去哪里寻找,或者搜索什么

谢谢你的帮助和建议

将OpenSSL添加到现有应用程序中

如果您只需要一个SSL/TLS客户机示例,请查看OpenSSL的wiki和示例


我的第一点困惑是关于证书和私钥,以及如何管理它们

是的,密钥管理和分发是crpyto中最难解决的问题

公共CA拥有涵盖这些实践的具有法律约束力的文件。它们被称为认证实践声明(CPS)。你可以从他们那里得到很多乐趣,因为公司律师告诉你你不想听的(或者营销部门拒绝告诉你)

例如,这里有一段摘录自:

所以,苹果向你出售的产品没有保修,也没有责任!!!他们希望你信任他们,给他们钱。。。多吵啊!而且不仅仅是苹果,其他CA也有同样淫秽的CP


我应该有一个随应用程序一起安装的证书吗

视情况而定。如果您正在运行自己的PKI(即,您是CA并控制根证书),则将根X509证书与应用程序一起分发,而不分发其他内容。不需要信任任何其他CA,如Verisign或Startcom

如果您正在使用其他人的PKI(或RFC 5280中指定的Internet PKI),则仅分发验证链所需的根X509证书。在这种情况下,您将分发一个CA的根X509证书进行验证。但是,您可能只信任由该特定CA签署的任何证书(如果您不小心的话,它很可能是成千上万个证书)

如果您事先不知道,那么您必须像浏览器一样选择一组CA来信任,并为您的应用程序携带它们的根证书。例如,您可以从Mozilla中获取它们的列表。但是,您可能只信任由所有CA签署的任何证书(如果您不小心的话,它可能会达到1000万)

使用类似于公共CAs的浏览器还有很多,您应该阅读Peter Gutmann的文章。特别注意安全多样化战略

当客户端连接到服务器时,服务器应将其X509证书(叶证书)和构建有效链所需的任何中间证书发送回您分发的根证书

最后,您可以从Eddy Nigg at获得大多数主要浏览器(包括移动设备)信任的免费SSL/TLS证书。他为撤销(如果需要)收费,因为这是成本所在。其他CAs会提前向您收费,如果不需要,您可以将收入放入口袋


每个最终用户是否应该生成自己的证书

这也是可能的。这称为客户端证书或客户端身份验证。理想情况下,您可以运行自己的PKI,因为(1)您可以控制一切(包括CA操作),不需要信任组织外的任何人;(2)让商业CA为每个用户的证书签名可能会很昂贵

如果您不想使用客户端证书,请查看PSK(预共享密钥)和SRP(安全远程密码)。两者都使用RSA密钥传输击败了经典X509。PSK和SRP这样做是因为它们提供了相互认证和通道绑定。在这些系统中,客户机和服务器都知道秘密或密码,并且建立了通道;或者一个(或两个)不知道,通道设置失败。在RSA传输和
basic_auth
schemes中,纯文本用户名和密码永远不会像在RSA传输和
basic_auth
schemes中那样放在网络上。(我更喜欢SRP,因为它基于Diffie Hellman,并且已经在一些系统中实现了它)


私钥呢

是的,您需要管理与证书关联的私钥。您可以(1)使用权限或ACL将它们存储在文件系统中;(2) 将它们存储在密钥库或密钥链中,如Android、Mac OS X、iOS或Windows;(3) 将其存储在硬件安全模块(HSM)中;或者(4)远程存储,同时使用(KMIP)使其保持在线

注意:服务器上无人参与的密钥存储是一个没有解决方案的问题。例如,参见Peter Gutmann的,第368页“棘手的问题”和“没有解决方案的问题”


我是否将私钥烘焙到服务器二进制文件中

不需要。您可以在需要时生成它们,然后以您所能提供的最佳保护来存储它们


还是应该有一个带有私钥的文件

是的,差不多。见上文


我确信这是一个已解决的问题,但我不太确定该去哪里寻找,或者搜索什么

由于密钥分发问题,我不确定我是否真的会称之为已解决

有些实现非常糟糕,因此您可能想知道代码是如何在生产中传递的

您可能想做的第一件事(因为您关注的是密钥管理)是处理“密钥管理”和“密钥层次结构”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.