【问题标题】:self-signed certificate issue自签名证书问题
【发布时间】:2009-03-15 13:43:49
【问题描述】:

我在我的测试环境中做自签名证书。这里有更多关于我在做什么的细节。

http://www.hanselman.com/blog/SigningPowerShellScripts.aspx

我的简单步骤是(目的是基于证书在计算机C和计算机A之间建立信任连接),

  1. 使用 makecert.exe 使计算机 A 成为根 CA;
  2. 自签名证书 B,由计算机 A 作为根 CA 颁发;
  3. 在计算机A上安装证书B作为通信证书;
  4. 在计算机 C 中安装/信任根 CA(计算机 A);
  5. 然后计算机 C 将信任计算机 A 使用证书 B 进行的通信。

我的困惑是,计算机 C 在没有安装证书 B 的情况下信任计算机 A?我认为根CA的证书和对方的证书都需要安装。有什么想法或想法吗?

提前致谢, 乔治

【问题讨论】:

    标签: certificate root self-signed ca


    【解决方案1】:

    至少在语义上,您的第 2 步不正确。如果您正在生成由 CA 签名的证书,那么它根本不是自签名的,而是由 CA 签名的。

    因此,在机器 C 上,您只需将生成的 CA 证书放在受信任的 CA 存储中。通过这样做,您表示您信任它签署的任何内容,在您的情况下是证书 B。

    但是您说您使用它进行通信 - 请注意,如果您使用 WCF 之类的东西来检查撤销,您将需要关闭它,因为您生成的 CA 不支持它。

    【讨论】:

    • 感谢 blowdart,“至少在语义上,您的第 2 步不正确。如果您正在生成由 CA 签名的证书,那么它根本不是自签名的,而是由 CA 签名的。” ——这是我的错,我的意思是由自建的 CA 签名。 :-)
    • 感谢blowdart,在您的解决方案中,我想确认您的意思是我只需要将B的证书安装到机器C的受信任的发布者中吗?如果是,我不同意,因为证书 B 是由根 CA 计算机 A 颁发的,默认情况下不受计算机 B 信任。
    • (续)所以,我认为我必须安装整个信任链——将根 CA 的证书(在我的示例中,机器 A 的根 CA 证书)安装到机器 B 的受信任的根证书颁发机构中。有没有cmets?
    • 不,你没有。安装自己的 CA,证书 A 就足以建立链式信任。
    • 你的意思是安装根CA的证书可以吗?不需要自己安装发布者的证书吗?
    【解决方案2】:

    计算机 C 必须信任根 CA(在计算机 A 上)。然后,由同一根 CA 颁发的另一台计算机(例如计算机 D)提供的任何证书都将被自动信任。

    例如,在 Windows 中,您(默认情况下)已经拥有并信任 Verisign 的根 CA 证书。当您导航到使用 Verisign 证书的 HTTPS 站点时,您将自动信任它 - 因为您信任 Verisign,并且 Verisign 将证书颁发给 HTTPS 站点。

    IOW - 你只需要信任 CA 并安装它的证书。

    【讨论】:

    • 谢谢马克,安装根CA的证书就可以了,不需要安装根CA颁发的发布者或个人的证书吗?
    • 正确。通过在机器上安装根 CA 的证书,您将指示该机器信任该 CA 颁发的任何内容
    【解决方案3】:

    计算机 A 实际上并没有成为“根 CA”。您需要创建一个根证书,然后将其安装在目标计算机上。

    这并不像在目标计算机上安装根证书那么简单,因为不同的应用程序可能使用不同的证书存储。例如,您需要在 Firefox 和 Explorer 中安装根证书。

    然后您可以创建“子”证书 - 由根证书签名 - 目标系统将接受子证书为有效,因为它已由受信任的根证书签名。

    证书只是验证某人的公钥的一种方式。该证书既包含您的纯文本公钥,也包含由签名者的私钥加密的公钥。要验证证书中发布的公钥,您需要使用签名者的公钥解密公钥的加密版本,并检查它是否与公钥的纯文本版本相同。

    在自签名证书中,您使用您的私钥加密您的公钥。所以自签名证书也是根证书,因为链中没有更高的签名权限。

    中间证书也可用于签署其他证书。通过这种方式,证书可用于构建“信任链”,返回到某些(至少理论上)受信任的根证书。

    Bruce Schneier 在他的《应用密码学》一书中对此进行了合理的描述。 Peter Gutman 在此链接中对证书的描述更加丰富多彩:

    http://www.cs.auckland.ac.nz/~pgut001/pubs/pkitutorial.pdf

    【讨论】:

    • 感谢 billmcc,我对您提到的证书存储问题感兴趣。据我所知,Windows 按前两个类别管理证书——当前用户或本地机器,在这两个类别下,有子命名存储。那是对的吗?如果是,有什么工具可以查看所有本地命名商店?
    • "然后将其安装到目标计算机上。" -- 你是指我的示例中的目标计算机,计算机 A 还是计算机 C?
    • 在您的示例中,目标计算机是计算机 C。
    • 在证书存储方面,我特别考虑的是 FireFox 不使用 Windows 证书存储,而其他应用程序(尤其是跨平台)可能会做同样的事情。
    • certmgr.exe 随 Visual Studio 一起提供。这使您可以访问 Windows 商店中的证书。