我了解通常 SSL(或更准确地说是 X.509)证书应该由某个认证机构签署,以确保它是真实的。
在某些情况下,不存在这样的签名,例如,如果您为测试目的生成证书,或者您是认证机构(根证书)。在这些情况下,使用自签名证书。
我的问题:为什么要使用这种奇怪的自签名结构?为什么证书不能简单地没有任何签名?包括一个自签名的签名增益是什么意思?
或者仅仅是因为在每个证书中始终都有一个签名在技术上更容易(没有签名的特殊情况),即使它是一个无意义的签名?
我了解通常 SSL(或更准确地说是 X.509)证书应该由某个认证机构签署,以确保它是真实的。
在某些情况下,不存在这样的签名,例如,如果您为测试目的生成证书,或者您是认证机构(根证书)。在这些情况下,使用自签名证书。
我的问题:为什么要使用这种奇怪的自签名结构?为什么证书不能简单地没有任何签名?包括一个自签名的签名增益是什么意思?
或者仅仅是因为在每个证书中始终都有一个签名在技术上更容易(没有签名的特殊情况),即使它是一个无意义的签名?
证书包含三个主要部分
证书通过使用私钥加密前两部分进行签名,然后将该加密信息附加到证书的末尾。如果您可以使用证书中包含的公钥解密签名,那么您就知道该证书是由持有匹配私钥的人签署的。签名将身份信息与公钥绑定。我用我的私钥签署我的证书,这样你就知道只有我可以阅读你可能用我的公钥加密的消息。
现在,除非你真的亲自见过我并且我把我的证书交给你,否则你无法真正知道身份信息是合法的我的。证书的最初目的是通过首先获取您亲自遇到的人的证书来建立信任网络,然后信任拥有这些人签署的证书的人,然后是那些人......
如果您对证书进行自签名,则向某人证明您实际上控制了该签名的密钥 - 即,它是您的证书。
否则,您可以创建一个随机数并符合证书格式的公钥,但不是真正的证书。
想象一下,您正在建立自己的证书颁发机构,第一个:谁签署您的证书?
理解整个认证过程的方法是将其视为一系列含义:您有一个证书呈现给您。你应该相信它吗?您可以信任颁发者,或者查看证书并同意您信任签名者。如果您不知道签名者,您可以按照它回到那个签名者的签名者,依此类推。不过,最终您将获得自签名证书。
但是,获得证书相对昂贵且可能很复杂,因此有些人直接建立自己的签名权限。由您决定是否可以信任它们。
一些关于此的评论变得有点愚蠢。您不能制作没有签名的证书,因为要成为有效的证书,必须有签名。这就是它们的定义方式。您不妨问为什么没有指数就不能有浮点数。证书的存在是为了收集一些身份信息和一种用于识别发行者以确定信任的加密机制。没有签名,对证书的“证书性”至关重要的东西就会丢失。
好吧,让我们问一些其他问题:
让我们再试一次。什么是证书?它是一种将名称绑定到非对称加密密钥的公共端的数据结构。该结构是“签名的”,这意味着您可以检测它是否被签名密钥所有者以外的任何人更改。因为您可以验证该签名,所以您对证书的真实性有一定程度的信任。因此,有效的证书必须具有可验证的签名。
在这种情况下,“信任”意味着您愿意冒险在他人的授权下无法执行您负责的事情。如果您拥有由 Verisign 等知名 CA 签署的证书,那么您信任的实体就是 Verisign;您以某种值得信赖的方式使用从他们那里获得的证书来验证他们是否签署了您正在考虑的证书。
如果您拥有自签名证书,而不是由知名机构签名的证书,那么您就是说如果您接受证书,您愿意信任自签名者。您愿意接受的唯一权威是您对自签名者的直接信任。但是您至少可以确信证书没有损坏,因为您可以验证签名。
所以,现在考虑一个没有任何签名的证书。(从技术上讲,这称为“数据项”。)我可能包含名称和公钥之间的关联,但是如果没有签名,您就无法确信它没有被第三方修改。
看到不同?使用签名证书,您就有了双方都接受的双方同意的可信第三方。使用自签名证书,没有第三方,但您可以确信证书没有被第三方损坏。它可以像您信任证书的颁发者一样被信任:您可以验证它是由拥有适当密钥另一面的人颁发的。
使用未签名的“证书”,您既不能从受信任的第三方保证证书已颁发给正确的人,也不能保证“证书”一旦颁发,没有被恶意修改第三者。这就是为什么,根据定义,证书必须具有签名。
您需要了解 RSA 加密的工作原理。签名者生成两个加密密钥,一个是私有的,一个是公共的。他们为您提供公钥,并使用私钥加密数据。有了公钥,您就可以验证数据是否由正确的人加密,因为没有其他人拥有他们的私钥。在签名证书的情况下,有一个信任网络,您可以在其中验证相对较少的个人(证书颁发机构)的身份,并且在第三方验证方面您信任他们。每个证书都必须根据系统的工作方式进行签名。任何人都可以对证书进行签名,当您不关心签名者的可验证性时,“自签名”证书是最简单的方法。
我想这是为了确保你不能用证书“撒谎”——即,除非私钥持有者同意,否则你不能创建证书。这可以通过 CA 验证证书命名的实体是私钥持有者来确保,或者在自签名的情况下,通过让密钥持有者自己签署证书来确保。
The difference between the two is who ran the program to generate the certificate. Some big corporation or some joe in his living room. The whole 'signed certificate' business is nonsense. A certificate allows you to encrypt data but large companies with something to sell you would have you believe that implies trustworthiness and identity. Encryption does not guarantee identity, and even more importantly, that you can trust the originator. Even assuming they have 100% good intentions just look in the news. How many big corporations have had data breaches this year?
I self signed my own certificate so I could encrypt the web traffic between my server and any users. I believe all traffic should be encrypted because no third party should be able to see what you do. I believe you should have a reasonable expectation of privacy. You should never completely trust anyone, particularly anyone who wants to sell you something.
证书为您提供有关已签名密钥的实体的信息,但不会为您提供有关正在签署密钥的实体的信息。因此,自签名证书至少有一个目的:它们告诉您根密钥的所有者是谁,而无需实现特殊的数据结构。
在我看来,这些东西不应该被称为证书,因为它们具有不同的属性。普通证书不需要安全存储/传输。如果攻击者设法用假证书替换合法证书,那么证书验证应该会失败。自签名证书并非如此。如果攻击者有机会替换自签名证书,他/她可以用使用他/她的私钥签名的证书替换该证书,并且无法通过验证证书来检测伪造。
另请注意,自签名证书的逻辑有些倒退。您要做的第一件事是相信某些公钥是真实的。如果这样做,您可以了解公钥属于谁。通常人们会想要相反的。您决定可以信任一个实体。然后,您尝试了解属于该实体的公钥。
在我看来,应该放弃自签名证书。例如,我希望 Internet Explorer 中的所有根密钥都由 Microsoft 签名。毕竟是 Microsoft 验证了证书属于合法 CA,并且是 Microsoft 决定普通用户应该能够信任这些 CA。现在,如果我担心有人篡改了我的证书,我所要做的就是检查 Microsoft 的密钥是否仍然是他们的,然后验证每个证书上的签名。
证书包含服务器的公钥。自签名是证明生成证书的人也拥有私钥的证明。
证书的目的是验证身份。证书的签署者向证书的所有接收者断言,他们已经验证了身份信息的真实性以及它与证书中包含的公钥的关联。如果证书未签名,则没有身份验证,因此没有理由使用证书。在这种情况下,您可以使用不需要身份验证的密码,因此不严格要求身份信息。我认为 RC4 符合这个描述。
您的问题意味着您不需要自签名证书,因为您知道自己信任自己。因此,您可以在服务器和客户端之间预先共享证书。从可行的假设密码学角度来看;您的身份验证信息将受到保护。然而,非对称密钥加密工具和证书格式都不支持这种使用,因为它与具有预共享秘密的对称密钥密码相比没有任何好处。