首页 文章

SSL证书验证

提问于
浏览
0

我想知道HTTP上的证书身份验证的确切步骤是什么 . 我知道以前曾经问过这个问题,但从我所看到的情况来看,它仍然不清楚它是如何工作的 .

  • 首次联系安全站点时,客户端将发送其证书

  • 这将是他的公钥(假设一个public_key.pem文件请求---- BEGIN PUBLIC KEY ----)

  • Server将查看此证书是否已由受信任的CA签名 .

  • 服务器只有一个它信任的证书列表(在配置SSL时配置此密钥库) . 这是存储所有私钥的地方 . 这相当于服务器的所有可信CA吗?

  • 现在的下一步是获取public_key.pem并检查密钥库中的任何证书是否已对其签名 .

如果上述过程准确:

First question :'certificate'是由另一个证书(或自签名)签名的私钥

Second question :服务器如何验证公钥是否使用特定私钥(证书)进行签名?

Third question :'certificate' A 可用于签署另一个'certificate' B ,因此'certificate' B 可用于签署证书 C 等 . 如果我的服务器在其信任库中具有证书 A ,则意味着它还将信任来自证书 BC 的公钥?

Edit based on answer below

我的服务器有 cert.pemprivkey.pem . cert.pem (x509证书)已由受信任的CA使用其私钥进行签名('signing'进程涉及CA使用其私钥执行'something'并签署我的证书签名请求) .

当SSL被协商时,我的服务器会将 cert.pem 发送到客户端(以某种形式) . 客户端如何确定我的公共证书是由受信任的CA签署的 . 我的信任库pb仅包含受信任CA的其他公共证书,因此它最终会检查我的 cert.pem 是否仅使用受信任CA的公共证书进行签名 . 这是不明确的部分 - 我可能会误解整个过程 - 客户可以通过拥有x509可信CA证书列表来检查我的x509证书是否有效吗?

1 回答

  • 2

    首次联系安全站点时,客户端将发送其证书

    客户端不必发送证书 . 从您的问题来看,这听起来并不像您在具体询问客户端证书身份验证 . 在许多网站中,如果你去google,stackoverflow,facebook等,客户端/浏览器将不会发送证书 .

    '证书'是由另一个证书(或自签名)签名的私钥

    不完全的 . 证书包含由与另一个证书对应的私钥签名的公钥 .

    我认为这值得清理 . 证书本身只会包含公钥,或x509用语中的“主题公钥信息” . 该公钥有一个对应的私钥,与x509证书分开存储 .

    有些格式将证书和私钥“组合”到一个文件中,但此时它不再是证书,它是一个包含证书的文件 - 这是PKCS#12的一个例子 . 这种格式可以根据需要存储尽可能多的证书和私钥 .

    私钥可能甚至不一定是磁盘上的文件 - 它可能位于硬件安全模块,智能卡等中 .

    '证书'A可用于签署另一个'证书'B,因此'证书'B可用于签署证书C等 . 如果我的服务器在其信任库中有证书A,这意味着它还会信任来自证书B和C的公钥?

    是 . 这称为证书链 . A是“根”证书,B是“中间”,C是“终端实体”或“叶子”证书 .

    这在CA的HTTPS证书中非常常见 . 证书永远不会直接从根发布,它们是从中间版发出的 .

    服务器如何验证公钥是否使用特定私钥(证书)进行签名?

    那么这就假设证书是私钥,而不是 .

    服务器,如服务于HTTPS的服务器,不会直到客户端,以决定它是否应该信任服务器提供的证书 .

    服务器具有证书和相应的私钥 . 服务器可以验证公钥和私钥属于一起 . 如何完成这取决于密钥类型,但它的要点是,如果您知道私钥,您可以从中完全重建公钥 . 服务器将验证私钥的“公共部分”是否与证书的公钥匹配 .

    服务器将证书提供给客户端,如浏览器 . 浏览器会检查很多东西,但至少它会检查两件重要的事情:

    • 浏览器是否可以构建链回到信任库中的证书 . 因此,浏览器将查看证书的签名者,称为颁发者,并检查颁发者是否在其信任库中 . 如果是,则证书是可信的 . 如果不是,它将查看该证书是否具有Issuer,并一直循环到链中,直到它到达链的末尾,或者当它在信任库中找到某些内容时 . 如果它到达终点,则证书不是由它信任的任何人发出的 .

    • 证书对该域有效 . 证书包含主题备用名称(SAN),指示证书有效的域 .

    还有许多其他事情需要检查,例如到期,撤销,证书透明度,证书的“强度” - 列出太多 .

    客户端如何确定我的公共证书是由受信任的CA签署的 .

    每个客户都有自己的信任商店 . Windows上的Internet Explorer使用Windows信任存储,macOS上的Google Chrome和Windows使用操作系统信任存储(Keychain,Windows Trust Store等) .

    浏览器/客户端需要构建信任路径,如上所述 . 它是如何做的有点复杂,但它适用于 Authority Key ID 属性 - 如果它存在,并且证书的 Issuer 属性 . 它使用这些值来查找颁发它的证书 .

    一旦找到颁发证书,它就会使用颁发者的证书公钥检查证书上的签名 .

    颁发证书可以位于“根”信任库中,并使用颁发证书中的公钥来验证签名证书 .

    您的Web服务器可能(可能)发送中间证书以及"main"(叶)证书 . 客户端可能使用这些中间体来构建返回根信任库中的证书的路径 . 中间体只能用作中间体 - 您不能发送额外的证书"here's the root certificate, trust it" .

    客户可以通过拥有x509可信CA证书列表来检查我的x509证书是否有效吗?

    是 . 那是信托商店 . 每个浏览器都有/使用一个 . Firefox拥有自己的名为NSS的信任存储 . 操作系统通常也有自己的信任存储 .

相关问题