1

我有一个应用程序框架,它在网络上的未命名主机之间以对等方式工作。我想让流量被加密,所以我用 M2Crypto 实现了一个设置,但我遇到了一个障碍。我不知道在创建证书时要为“commonName”写什么。它似乎想要一个域名,但运行它的计算机都没有。我只是将“temphost”作为 commonName,但显然这是一个重要参数。我在尝试测试时得到了这个:

M2Crypto.SSL.Checker.WrongHost:对等证书 commonName 与主机不匹配,预期为 127.0.0.1,得到 temphost

有没有办法概括 commonName?

4

2 回答 2

1

因此,根据您对我的第一个答案的评论,我决定提供另一种可能适用于您的情况的解决方案。创建您自己的 CA 证书和密钥。然后在您的同行中告诉 M2Crypto 仅接受由该 CA 签名的证书(请参阅这个较旧的 stackoverflow 问题以供 API 使用:M2Crypto 的 set_client_CA_list_from_file() 和 load_verify_info() 之间有什么区别,以及何时使用它们?)。

然后在你的脚本早期这样做:

from M2Crypto import SSL
SSL.Connection.clientPostConnectionCheck = None

或者如果您需要能够建立其他类型的 SSL 连接,请查看您是否可以控制 SSL.Connection 对象的创建并使用合适的检查器调用它们的 set_post_connection_check_callback() 。

在此之后,只要对等方的证书仅使用您的 CA 签名,您的对等方就应该接受任何其他对等方。

如果您能想到可以在连接后检查中验证的任何额外信息,您可以将该信息放入证书中(可能在 commonName 中)并编写您自己的检查器以使用(而不是上面的 None)。

于 2010-01-28T01:39:23.347 回答
1

在您的用例中,默认主机名检查不合适。您可能想尝试只进行证书指纹检查。首先,获取每个证书的指纹(openssl x509 -fingerprint)。假设您有对等点 A 和对等点 B,分别具有指纹 A 和指纹 B。

在对等方 A 方面,您将在脚本的早期进行以下调用:

from M2Crypto import SSL
SSL.Connection.clientPostConnectionCheck = SSL.Checker(peerCertHash='fingerprint B')

在对等方 B 侧,您也这样做,除了使用指纹 A。现在证书检查器只会检查以确保指纹匹配,而不会做进一步的检查。

这种方法确实意味着它将覆盖所有SSL 连接的连接后检查,因此它并不适合所有用例。如果您可以控制 SSL.Connection 对象的创建,您还可以为每个实例调用 set_post_connection_check_callback(),这将允许在需要时使用不同的检查器。

于 2010-01-27T21:46:54.880 回答