Python 在生成OpenSSL密钥时,要为commonName放置什么?

Python 在生成OpenSSL密钥时,要为commonName放置什么?,python,ssl,m2crypto,Python,Ssl,M2crypto,我有一个应用程序框架,它在网络上的未命名主机之间以对等方式工作。我想对流量进行加密,所以我用M2Crypto实现了一个设置,但遇到了一个障碍。我不知道创建证书时“commonName”应该写些什么。它似乎想要一个域名,但运行该证书的所有计算机都不会有。我只是在commonName中加了'temphost',但显然这是一个重要的参数。我在尝试测试时得到了以下信息: M2Crypto.SSL.Checker.ErrorHost:对等 证书commonName不匹配 主机,预期为127.0.0.1,获

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

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


有没有一种方法可以概括commonName?

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

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

from M2Crypto import SSL
SSL.Connection.clientPostConnectionCheck = SSL.Checker(peerCertHash='fingerprint B')
在对等B端,除了使用指纹A之外,您也可以执行相同的操作。现在,证书检查器只会检查以确保指纹匹配,而不会进行进一步的检查


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

因此,根据您对我的第一个答案的评论,我决定提供另一个可能适用于您的案例的解决方案。创建您自己的CA证书和密钥。然后,在您的对等点中,告诉M2Crypto只接受由该CA签名的证书(请参阅此旧的stackoverflow问题,以便API使用:)

然后在脚本的早期执行以下操作:

from M2Crypto import SSL
SSL.Connection.clientPostConnectionCheck = None
或者,如果您需要能够建立其他类型的SSL连接,请查看是否可以控制SSL.Connection对象的创建,并使用合适的检查器调用它们的set\u post\u Connection\u check\u callback()

在此之后,您的对等方应接受任何其他对等方,只要该对等方的证书仅由您的CA签署


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

谢谢,尽管问题在于不断添加大量对等方,并且在安装应用程序时生成它们的证书。这是否意味着我必须让每个对等方都知道所有其他潜在对等方的指纹?啊,使用这种方法,是的。所以,我上面写的对你来说不起作用。你确定你真的在做任何身份验证吗?是的,你正在确保只有你知道的特定对等方(证书)可以与你通信。这当然取决于哈希算法。不要使用MD5或更弱的。