2014-10-31 97 views
0

我的客户端服务器程序使用OpenSSL来处理数据交换并正在工作,但我需要确保我的客户端连接的服务器是正确的服务器而不是假的服务器。安全的服务器 - 客户端握手方法

问题是我的程序生成一个自签名证书,客户端无法验证。如果我嵌入证书,任何人都可以提取它,制作一个假的客户端服务器并尝试窃取信息。 OpenPGP密钥也一样。

因此,即使服务器二进制文件适用于所有人,我是否可以实现一些验证服务器的方法,因为它也是客户端?

+0

“如果我嵌入证书,任何人都可以提取它,制作假客户服务器并尝试窃取信息”是不正确的。这只有在嵌入私钥的情况下才会发生。与往常一样,简单的解决方案是获得由CA签名的证书。 – EJP 2014-10-31 05:01:18

+0

但私钥必须在服务器上,对不对?客户端也充当服务器,就像P2P一样。 – Fusgyus 2014-10-31 14:27:26

回答

0

在这种情况下,安全认证不依赖于实际证书,而是依赖于密钥对。

非对称加密技术依赖于私钥和公钥。私钥必须保密(因此请将其保存在必须进行身份验证的服务器上,即您称为正确的服务器)。公钥可以任意传播,有人可以做的唯一事情就是为私钥持有者加密信息,或者验证他签发的签名。

实际身份验证过程背后的(非常)基本思想是通过身份验证客户端发送加密的随机数,只有正确的服务器可以解密并返回,或者让服务器签署客户端定义的某些内容。实现身份验证的真正过程要防止中间人攻击要复杂一点,但远远超出了这个答案的范围。

因此,即使服务器二进制文件可用于所有人,我是否可以实现一些验证服务器的方法,因为它也是客户端?

依赖已经存在的东西,并且不要自己实现加密代码。无论如何,如果您已经分配了密钥,也许可以考虑using TLS for encrypted communication,认证将在握手阶段完成。

+0

该程序已经在使用TLS 1.2,但假冒的服务器可能会像正确的服务器一样,检查我的协议握手(在TLS连接建立后执行),然后开始窃取信息。我认为任何方法(不涉及第三方)都很容易进行逆向工程,因为服务器二进制文件是已知的。 – Fusgyus 2014-10-31 14:41:53

+0

如果您验证服务器证书的指纹,则不会发生这种情况。如果没有私钥,没有人能够执行TLS握手,您不必(不可以)发布私钥。 – 2014-10-31 14:44:54

+0

对不起,我不明白。到我的服务器(也就是客户端,就像P2P,但不是)执行TLS握手,我必须在其中嵌入私钥(?)。那么,如何通过逆向工程攻击者获得服务器二进制文件不能进入私钥。 – Fusgyus 2014-10-31 16:46:57