SSL证书验证

时间:2017-01-27 13:33:44

标签: security ssl https

我想知道通过HTTP进行证书身份验证的确切步骤是什么。 我知道以前曾经问过这个问题,但是从我读过的内容来看,它仍然不清楚它是如何工作的。

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

    • 这将是他的公钥(假设一个public_key.pem文件请求----开始公钥----)
  2. 服务器将查看此证书是否已由受信任的CA签名。

    • 服务器只有一个它信任的证书列表(在配置SSL时配置此密钥库)。这是存储所有私钥的地方。这相当于服务器的所有可信CA吗?
    • 现在的下一步是获取public_key.pem并检查密钥库中的任何证书是否已对其签名。
  3. 如果上述过程准确无误:

    第一个问题:'证书'是由其他证书(或自签名)签名的私钥

    第二个问题:服务器如何验证是否使用特定私钥(证书)签署了公钥?

    第三个问题:'证书' A 可用于签署另一个'证书' B ,因此'证书' B 可用于签署证书 C 等。如果我的服务器在其信任库中有证书 A ,则表示它还会信任来自证书 B C 的公钥?

    根据以下答案进行修改

    我的服务器有 cert.pem privkey.pem cert.pem (x509证书)已由受信任的CA使用其私钥进行签名(“签名”过程涉及CA使用其私钥执行'某事'并签署我的证书签名请求)。

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

1 个答案:

答案 0 :(得分:2)

  

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

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

  

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

不完全。证书包含 public 密钥,该密钥由与另一个证书对应的私钥签名。

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

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

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

  

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

是。这称为证书链。 A是" root"证书,B是"中间人",C将是"终端实体"或" leaf"证书。

这在CA的HTTPS证书中非常常见。证书永远不会直接从根目录下发出,而是从中间人发出。

  

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

这就假设证书是私钥,它不是。

服务器,就像服务于HTTPS的东西一样,并不真正关心证书的有效性。它由客户端决定是否应该信任服务器提供的证书。

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

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

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

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

  3. 还有许多其他事情需要检查,例如到期,撤销,证书透明度,"强度"证书 - 太多无法列出。

      

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

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

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

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

    发证书可以在" root"信任存储,并使用颁发证书中的公钥来验证签名证书。

    您的网络服务器可能(可能)发送中间证书以及" main" (叶)证书。客户端可能使用这些中间体来构建返回根信任库中的证书的路径。中间体只能用作中间体 - 您不能发送额外的证书,说“"这里是根证书,信任它"。

      

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

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