2

我想弄清楚客户端和服务器之间的安全连接是如何建立的。我尝试了 boost::asio 库提供的 SSL 示例。我的问题是关于客户端和服务器使用的证书。具体来说,我生成了一个私钥(mykey.pem)。然后我使用这个私钥生成一个自签名证书(mycert.pem),我使用这些文件如下:

服务器端:

1)context_.use_certificate_chain_file("mycert.pem", error);

context_.use_private_key_file("mykey.pem", boost::asio::ssl::context::pem, 错误);

context_.use_tmp_dh_file("dHParam.pem",error);

客户端:

2)ctx.load_verify_file("mycert.pem",error);

有了这段代码,握手就完美地完成了。我的问题是,为什么服务器和客户端在命令 1 和 2 中都使用相同的证书(“mycert.pem”)?通过这种方法,客户端可以轻松地伪装成服务器。对吗?你认为我在这里错过了什么吗?

4

1 回答 1

3

证书是公开信息。

它是允许实体证明其身份的私钥。客户端通过 SSL/TLS 握手保证只有私钥与服务器证书中的公钥匹配的一方才能在另一端拥有合适的主密钥,从而能够解密通信。它解决的问题是远程方是否确实是颁发证书的一方。(这类似于检查带照片的身份证上的照片是否与您面前的人匹配。)

在客户端配置证书(而不是私钥)可以告诉它您愿意信任哪些证书。它解决的问题是是否相信证书所说的内容(特别是它所说的关于服务器身份的内容)。这通常使用 PKI 完成,以便通过第 3 方(CA)建立信任。(这类似于检查带照片的身份证件本身是否真实,并且您可以相信它所说的内容。)

您通过信任这个特定的服务器证书所做的就是绕过使用 CA 来进行例外处理,并表明您愿意相信这个特定的证书是真实的。(这对于少数证书来说很好,但使用 CA 可以让您的信任结构更易于管理并添加其他功能,例如撤销证书的能力。)

于 2013-06-20T18:14:55.447 回答