使用OpenSSL CLI从x509证书获取链或CA颁发者

使用OpenSSL CLI从x509证书获取链或CA颁发者,openssl,x509certificate,x509,x509certificatevalidator,Openssl,X509certificate,X509,X509certificatevalidator,我正在尝试使用OpenSSL从证书构建一个链(或者只是从某处获取),最好使用命令行界面 我在互联网上找到了一些例子,但我一直在问“我从何处获得证书颁发者?” 例如,检查此网站,您将找到该命令 openssl s_客户端-showcerts-host example.com-端口443 去拿链子。您可以使用www.google.com而不是example.com进行尝试。 输出应该为您提供链。其他网站迟早会使用相同的命令 因此,我无法直接从证书中获取链,但我应该向某个地方索取链 现在我的问题是:从

我正在尝试使用OpenSSL从证书构建一个链(或者只是从某处获取),最好使用命令行界面

我在互联网上找到了一些例子,但我一直在问“我从何处获得证书颁发者?”

例如,检查此网站,您将找到该命令

openssl s_客户端-showcerts-host example.com-端口443 去拿链子。您可以使用
www.google.com
而不是
example.com
进行尝试。 输出应该为您提供链。其他网站迟早会使用相同的命令

因此,我无法直接从证书中获取链,但我应该向某个地方索取链

现在我的问题是:从哪里获得主机名,从哪里可以发送链请求

我看了两张证书

  • stackexchange.com
  • 谷歌网站
  • 使用
    OpenSSL
    ,我可以使用命令询问发卡机构

    openssl x509-在certFile-noout-issuer中

    我分别得到

  • issuer=C=US,O=Let's Encrypt,CN=Let's Encrypt Authority X3
  • 发卡机构=C=美国,O=谷歌信托服务,CN=GTS CA 1O1
  • 老实说,我不知道如何处理这些结果

    然后,指挥调查,

    openssl x509-文本-证书文件中

    我已经找到了AIA扩展:

  • CA发行人-URI:
  • CA发行人-URI:
  • 在第一个例子中,我终于可以使用这个命令了

    openssl s_客户端-showcerts-主机-端口443 但是对于谷歌,我不知道如何使用
    openssl
    …我可能会使用
    wget
    ,但我没有从stackexchange获得的相同格式

    最后,我的问题是:

    • 我应该如何处理这些差异
    • 有没有更好的方法从证书中获取链,而无需询问CA颁发者
    • CA发行人是友邦保险的延伸,我认为它不是强制性的,我可以依赖它吗
    • 如何使用
      OpenSSL
      获取CA颁发者,而不必自己解析输出?(类似于openssl x509-caIssuer-in-certFile)

    PS:我在最后尝试实现的是验证证书,完成整个链,检查链中每个证书的所有OCSP或CRL……如果你在C++中有工作实例,或者仅仅使用OpenSSL CLI,我将非常感激: 编辑:

    我现在正在做的是自己创建链

    使用AIA扩展,我获得CA颁发者URI,下载CA颁发者证书(如果需要,转换为PEM),等等,直到我再也找不到CA颁发者为止。那么,可能是根CA


    之后,我手动收集所有pem并创建链。

    似乎互联网上的许多示例都考虑了SSL证书。在SSL证书中,您只需连接到网站并下载完整的链。我认为服务器应该在SSL协议本身中为您提供完整的链

    我是为SMIME证书这样做的,这就是为什么我感到困惑,因为我不能使用与SSL证书相同的方法

    在与我的同事们交谈之后,并将我正在做的事情与互联网上的一些类似项目进行了比较,看来AIA扩展是正确的做法。也许X509标准中没有强制要求,但它似乎被广泛使用(我从未见过没有AIA扩展的SMIME证书)

    然后,我手动创建链,使用AIA扩展返回,直到找到没有此类扩展的证书

    此时,这应该是一个根证书,我将尝试使用机器中安装的证书验证它

    (当然,不要忘记通过CRL或OCSP检查吊销状态)


    到目前为止,一切正常:)

    您可以使用
    opensslx509-in cert.pem-noout-issuer
    获取证书的本地颁发者。例如:
    echo'| openssl s_client-connect google.com:443 2>/dev/null | openssl x509-noout-issuer
    。是的,关于
    权限信息访问
    ,您是对的,它是一个x509扩展,不是强制性的。嗨,皮卡努。谢谢你的评论,但问题是:在你的例子中,你是从哪里得到“google.com”主机名的?不是每个证书的主题中都有主机名,我也不知道该证书来自何处……嗨,n3mo,我对此有点困惑,您至少需要一个CN证书才能开始。如果它是CN,那么您可以获得证书。如果您有证书,您可以从主题或SAN名称获得CN。要回答这个问题,如果您不需要询问CA就可以获得整个链,这取决于服务器呈现的内容,理想情况下,服务器应该呈现整个链直到根CA,但是如果没有,您需要解析最后一个证书并获取它的颁发者,可能还有它的URL。嗨,pikaynu,问题是,它们并不总是SSL证书。在SSL证书中,CN通常是一个网站,但在我的情况下,CN可以只是一个名称…或一封电子邮件…例如,在电子邮件的情况下,我有CN个人的姓名…或像我写的示例一样,公司的名称或代码…最后,在与同事讨论后,我们决定使用AIA扩展(即使不是强制性的,它们似乎总是存在的)并使用CA颁发者URI构建我们自己的链,直到我们到达根CA(没有CA颁发者URI)