在制作OpenSSL密钥时,commonName应该填写什么?

1 投票
2 回答
2248 浏览
提问于 2025-04-15 18:33

我有一个应用框架,它可以在网络上不同的主机之间进行点对点的通信。我想让这些通信变得安全,所以我使用了M2Crypto来加密流量,但遇到了一些问题。我不知道在创建证书时应该把'commonName'填成什么。它似乎需要一个域名,但运行这个程序的电脑都没有域名。我随便填了' temphost'作为commonName,但这个参数好像很重要。在测试的时候,我收到了这样的错误信息:

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

有没有办法让commonName变得更通用一些呢?

2 个回答

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(),这样在需要的时候就可以使用不同的检查器。

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)。

撰写回答