【问题标题】:Why are SSL/TLS certificates self-signed if they have no real signature/CA?如果 SSL/TLS 证书没有真正的签名/CA,为什么还要自签名?
【发布时间】:2010-10-26 15:54:47
【问题描述】:

我了解 SSL(或更准确地说是 X.509)证书通常应该由某个认证机构签署以确保其真实性。

在某些情况下不存在这样的签名,例如如果您为测试目的生成证书,或者如果您认证机构(根证书)。在这些情况下,使用自签名证书。

我的问题:为什么要使用这种奇怪的自签名结构?为什么证书不能简单地没有任何签名?包括一个自签名的签名增益是什么意思?

或者仅仅是因为在每个证书中始终都有一个签名在技术上更容易(没有没有签名的特殊情况),即使它是一个无意义的签名?

【问题讨论】:

标签: ssl cryptography ssl-certificate


【解决方案1】:

证书包含三个主要部分

  1. 身份信息
  2. 公钥
  3. 数字签名

通过使用私钥加密前两部分来签署证书,然后将该加密信息附加到证书的末尾。如果您可以使用证书中包含的公钥解密签名,那么您就知道该证书是由持有匹配私钥的人签署的。签名将身份信息与公钥绑定。我用我的私钥签署我的证书,这样你就知道只有我可以阅读你可能用我的公钥加密的消息。

现在,除非您真的亲自见过我,并且我将证书交给您,否则您无法真正知道身份信息是合法的我的。证书的最初目的是通过首先获取您亲自遇到的人的证书来建立信任网络,然后信任拥有这些人签署的证书的人,然后是那些人......

【讨论】:

  • +1 您的回复很好地描述了普通证书的用途。它仍然没有为自签名证书提供充分的理由。
  • 我很惊讶有多少回复完全没有抓住重点。发帖人知道什么是自签名证书,以及为什么要使用它们,但他问的是自签名的意义何在,而不是简单地让它不签名。
  • 我想我确实回答了。自签名证书的签名只不过是断言签名者持有与证书中的公钥匹配的私钥。
  • 真的没那么难。除非签名,否则它不是有效的证书。它可以是自签名的,也可以由其他人签名。没有签名就不是证书。为什么一个字节不能代表 0-300 的范围?太小了。什么东西可以代表0-300?不是一个字节。
  • @Charlie:我认为这个问题比这更深一些。我认为 OP 想知道为什么要这样定义,而不仅仅是定义是什么。
【解决方案2】:

如果您对证书进行自签名,则可以向某人证明您实际上控制了该签名的密钥 - 即,它是您的证书。

否则,您可以创建一个随机数且符合证书格式的公钥,但不是真正的证书。

【讨论】:

    【解决方案3】:

    假设您正在建立自己的证书颁发机构,第一个:谁签署您的证书?

    了解整个认证过程的方法是将其视为一系列含义:您有一个证书呈现给您。你应该相信它吗?您可以信任颁发者,或者查看证书并同意您信任签名者。如果您不知道签名者,您可以按照它回到那个签名者的签名者,依此类推。不过,最终您将获得自签名证书。

    但是,获得证书相对昂贵且可能很复杂,因此有些人直接创建自己的签名授权。由您决定是否可以信任它们。


    一些关于这个的 cmets 已经变得有点傻了。您不能制作没有签名的证书,因为要成为有效的证书,必须有签名。这就是它们的定义方式。您不妨问为什么没有指数就不能有浮点数。证书的存在是为了收集一些身份信息和用于识别发行者以确定信任的加密机制。如果没有签名,对证书的“证书性”至关重要的东西就会丢失。


    好吧,让我们问一些其他问题:

    • 为什么社会安全号码有 9 位数字?为什么不能有 5 位数的社会保险号?
    • 为什么邮寄地址的邮政编码那么愚蠢?
    • 我们真的需要保留一个人的名字姓吗?

    让我们再试一次。什么是证书?它是一种将名称绑定到非对称加密密钥的公共端的数据结构。该结构是“签名的”,这意味着您可以检测它是否被签名密钥所有者以外的任何人更改。因为您可以验证该签名,所以您对证书的真实性有一定程度的信任。因此,有效的证书必须具有可验证的签名。

    在这种情况下,“信任”意味着您愿意冒着在他人的授权下无法执行您负责的事情的风险。如果您拥有由 Verisign 等知名 CA 签署的证书,那么您信任的实体就是 Verisign;您以某种值得信赖的方式使用从他们那里获得的证书来验证他们是否签署了您正在考虑的证书。

    如果您拥有自签名证书,而不是由知名机构签署的证书,那么您就是说如果您接受该证书,您愿意信任自签名者。您愿意接受的唯一权威是您对自签名者的直接信任。但是您至少可以确信证书没有损坏,因为您可以验证签名。

    所以,现在考虑一个没有任何签名的证书。 (从技术上讲,这称为“数据项”。)我可能包含名称和公钥之间的关联,但没有签名,您无法确信它没有被第三人修改派对。

    看到区别了吗?使用签名证书,您就有了双方都接受的双方同意的可信第三方。使用自签名证书,没有第三方,但您可以确信证书没有被第三方损坏。它可以像您信任证书的颁发者一样被信任:您可以验证它是由拥有相应密钥另一方的人颁发的。

    对于未签名的“证书”,您既不能从受信任的第三方保证该证书已颁发给正确的人,也不能保证“证书”一旦颁发,未被修改由恶意的第三方。这就是根据定义证书必须有签名的原因。

    【讨论】:

    • 我不明白这如何回答我的问题。我知道这个过程,问题是,为什么要自签名而不是没有签名?
    • 好的,所以答案是“证书必须始终包含签名,因为 X509 需要它”。那么当然下一个问题是为什么它是这样定义的......
    • @A,你必须走出证书系统。 “暗示链”总是归结为您对根签名者的信任程度。如果您想要一个高保证的证书,您可以向 Verisign 这样的知名 CA 支付一定数量的钱,然后他们会采取措施来验证您的身份。 (谷歌“Verisign Extended Validation”因为他们的营销炒作,URL 太长了,无法发表评论。)当你自签名证书时,你说的是“相信我”。
    • 如果你不能信任一个自签名证书根本那么你就永远不能信任一个证书,因为在进程的根目录的某个地方是一个自签名证书.您的意思是,您只能像信任根签名者一样信任任何证书。至于你的另一点,嗯,这很愚蠢。它不再是没有加密组件的有效证书,就像 IEEE 浮点是没有指数部分的有效浮点一样。您可能会认为我将“必须修改该意见”,但 X509 标准会不同意您的看法。这只是定义的一部分。
    • 非常接近,除了关于自签名证书毫无意义的部分。 任何人都可以伪造没有签名的证书。自签名证书只能由拥有签名密钥私有方的人构建。因此,没有理由信任未签名的“证书”,但您可以完全信任自签名证书,就像信任颁发者一样。
    【解决方案4】:

    我想这是为了确保您不能对证书“撒谎” - 即,除非私钥持有人同意,否则您不能创建证书。这可以通过 CA 验证证书指定的实体是私钥持有者来确保,或者在自签名的情况下,通过让密钥持有者自己签署证书来确保。

    【讨论】:

      【解决方案5】:

      您需要了解 RSA 加密的工作原理。签名者生成两个加密密钥,一个是私有的,一个是公共的。他们为您提供公钥,并使用私钥加密数据。有了公钥,您就可以验证数据是否由正确的人加密,因为没有其他人拥有他们的私钥。在签名证书的情况下,有一个信任网络,您可以在其中验证相对较少的个人(证书颁发机构)的身份,并且在第三方验证方面您信任他们。每个证书都必须根据系统的工作方式进行签名。任何人都可以对证书进行签名,当您不关心签名者的可验证性时,“自签名”证书是最简单的方法。

      【讨论】:

      • 所以问题是:如果您不关心签名者的可验证性,或者您通过其他方式验证公钥属于某个人,为什么需要证书?与一对(公钥、所有者)相比,拥有自签名证书有什么优势?
      • 因为大多数软件只接受证书形式的密钥。您无法为流行的浏览器(没有插件)提供简单的已知密钥环数据并使用它做任何有用的事情,而证书形式的相同数据允许各种各样的事情
      【解决方案6】:

      两者的区别在于谁运行程序来生成证书。某个大公司或某个乔在他的客厅里。整个“签名证书”业务都是无稽之谈。证书允许您加密数据,但有东西出售给您的大公司会让您相信这意味着可信度和身份。加密并不能保证身份,更重要的是,你可以信任发起者。即使假设他们有 100% 的好意,也可以看看新闻。今年有多少大公司发生了数据泄露事件?

      我自己签署了自己的证书,这样我就可以加密我的服务器和任何用户之间的网络流量。我相信所有流量都应该加密,因为没有第三方应该能够看到你在做什么。我认为您应该对隐私有合理的期望。你永远不应该完全信任任何人,尤其是任何想向你推销东西的人。

      【讨论】:

      • 实际上,证书确实可以保证身份。即使是为您提供廉价证书的 CA 也会在为您提供该域名的证书之前以某种方式验证您是域名的所有者(通过自动电子邮件程序)。识别是必要的,因为没有它加密毕竟不是真的安全(因为 MITM 攻击)。不过,我同意你的观点,只要浏览器表明它仍然存在泄漏,无需身份验证的加密应该适用于所有事物。
      【解决方案7】:

      证书包含服务器的公钥。自签名是证明生成证书的人也拥有私钥的证明。

      【讨论】:

        【解决方案8】:

        证书为您提供有关已签名密钥实体的信息,但不会为您提供有关正在签署密钥的实体的信息。因此,自签名证书至少有一个目的:它们告诉您根密钥的所有者是谁,而无需实现特殊的数据结构。

        在我看来,这些东西不应该被称为证书,因为它们有不同的属性。普通证书不需要安全存储/传输。如果攻击者设法用假证书替换合法证书,则证书验证应该失败。自签名证书并非如此。如果攻击者有机会替换自签名证书,他/她可以将该证书替换为使用他/她的私钥签名的证书,并且无法通过验证证书来检测伪造。

        还要注意,自签名证书的逻辑有些倒退。您要做的第一件事是相信某些公钥是真实的。如果这样做,您可以了解公钥属于谁。通常人们会想要相反的。您决定可以信任一个实体。然后您尝试了解属于该实体的公钥。

        在我看来,应该放弃自签名证书。例如,我希望 Internet Explorer 中的所有根密钥都由 Microsoft 签名。毕竟是 Microsoft 验证了证书属于合法 CA,并且是 Microsoft 决定普通用户应该能够信任这些 CA。现在,如果我担心有人篡改了我的证书,我所要做的就是检查 Microsoft 的密钥是否仍然是他们的,然后验证每个证书上的签名。

        【讨论】:

          【解决方案9】:

          证书的目的是验证身份。证书的签署者向证书的所有接收者断言,他们已经验证了身份信息的真实性以及它与证书中包含的公钥的关联。如果证书未签名,则没有身份验证,因此没有理由使用证书。在这种情况下,您可以使用不需要身份验证的密码,因此不严格要求身份信息。我认为 RC4 符合这个描述。

          您的问题意味着您不需要自签名证书,因为您知道自己信任自己。因此,您可以在服务器和客户端之间预先共享证书。从可行的假设密码学角度来看;您的身份验证信息将受到保护。然而,非对称密钥加密工具和证书格式都不支持这种使用,因为它与具有预共享密钥的对称密钥密码相比没有任何好处。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-05-05
            • 2015-11-02
            • 2018-07-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-30
            相关资源
            最近更新 更多