【问题标题】:What to put for a commonName when making an OpenSSL key?制作 OpenSSL 密钥时为 commonName 放置什么?
【发布时间】:2010-01-27 20:34:33
【问题描述】:

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

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

有没有办法概括 commonName?

【问题讨论】:

    标签: python ssl m2crypto


    【解决方案1】:

    因此,根据您对我的第一个答案的评论,我决定提供另一种可能适用于您的情况的解决方案。创建您自己的 CA 证书和密钥。然后在您的同行中告诉 M2Crypto 仅接受由该 CA 签名的证书(请参阅这个旧的 stackoverflow 问题以供 API 使用:What is the difference between M2Crypto's set_client_CA_list_from_file() and load_verify_info() and when would you use each?)。

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

    from M2Crypto import SSL
    SSL.Connection.clientPostConnectionCheck = None
    

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 谢谢,但问题是不断添加许多对等点,并且在安装应用程序时会生成它们的证书。这是否意味着我必须让每个对等方都知道所有其他潜在对等方的指纹?
      • 啊,使用这种方法,是的。所以,我上面写的对你不起作用。
      • 你确定你真的在做任何身份验证吗?
      • 是的,您要确保只有您知道的特定对等方(证书)才能与您通信。这当然取决于散列算法的强度。不要使用 MD5 或更弱的。
      猜你喜欢
      • 2017-04-17
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      相关资源
      最近更新 更多