[ipsec][crypto] 有点不同的数字证书到底是什么

前言

前言是在写完了全文之后回头补的。本意是想完全抽象的把证书的抽象逻辑意义表达出来,因为你能找到的大部分

资料都深陷在技术细节与行业规范里。只有其型没有其理,没有什么比理解一个事物的内在合理性更有乐趣的了。

所以忍不住表达的欲望想把他们写出来。

无奈改了几版,始终写的混乱。所以,每一个能读完的人,我都对你的支持表示感谢,如果有再深入讨论的

意愿,请和我联系。

很遗憾理解了九成,表达出来却只剩下五成。原谅我表达欠佳。

[防扒乱入]  author: class_tong  date: 20190914

〇 引言

数字证书是什么?本文的出发点就是要从我的角度回答这个问题。同时我们引入ike和tls作为理解概念的现实工具,一并在文中伺机引入。

用以加深理解,也用以回归实践。

如下这句话是我的回答:

证书是由权威机构进行了数字签名的一段信息,这段信息表达了一个公钥与一个名字以及该名字的附带属性之间的关联关系。该名字从属于一个有效的名字系统。

换一个表达方式,同样表述上述内容:

证书是这样一段信息:权威机构A说,我保证,公钥P是名字N的。

再下面这一段,是wiki的回答

In cryptography, a public key certificate, also known as a digital certificate or identity certificate, 
is an electronic document used to prove the ownership of a public key[1]. The certificate includes information about the key,
information about the identity of its owner (called the subject), and the digital signature of an entity
that has verified the certificate's contents (called the issuer).

我认为,我表达的虽然土,但是是正确的。也就是说,以上三个回答,表述了数字证书的同一个定义。

接下来,我们一起来理解。

一 讲个故事

讲清楚这个事,需要引入几个前提。它们分别是如下的几个概念:

1.权威机构,2,消息认证码, 3.数字签名,4.公钥,5.名字,6.名字系统,7.证书颁发

我同时假设,你在阅读到这里的时候,是懂得什么是公钥/私钥的。因为本文只聚焦在认证体系的相关脉络内讨论,所以3.公钥将不做解释。

以及:公钥加密私钥解密为什么能够提供机密性?私钥加密公钥解密为什么能够提供唯一性?也不做解释。(所以,请天然接受他们作为继续阅读下去的前提。)

描述一个场景:

来自艾泽拉斯的小a,与来自永烁星光之地的小b,从小就是好朋友。有一天他们双双入狱,然后一个越狱的故事就发生了。。。

这座监狱有500名囚犯,关押在各自独立的500个牢房里,彼此无法见面,唯一的沟通方式就是写纸条。然后通过一个不安全的纸条传递系统传递给任何人。

如果一个人要想加入整个沟通体系里。它首先必须要有个一个名字:一个数字,一个编号,或者一个自定义的词。

我们统一称其为名字。

比如,小a。只有拥有了一个名字之后,才能在和其他人进行了通信之后,得到对方的回应。否则,对方将不知道

应该把纸条回应给谁。同样,想要和小a主动进行联系的人,如果不知道小a的名字,也没有办法告诉纸条传递系统

,该将纸条传递给谁。

这就是名字的意义。

这个故事是这样的,一起坐牢之前,小a和小b是好朋友(最佳损友?)。他们对彼此都充分信赖。接下来,

小b写了一张纸条,“我们晚上九点越狱。”,发送给小a(小a知道小b会发来消息,并且一直在等待小b的消息)。

小b为了证明消息真的是自己发的,在纸条最后盖了一个印章(我们知道印章的防伪办法是,

找到另一张值得信赖的印章印记进行花纹对比),并将印章盖在了内容的上方(建立强关联,这个可以对应理解成

散列函数的功能)。小a为了印证消息真的来自小b,而不是监狱系统钓鱼执法,他找到了老z,跟老z要了一张小b从前的印章印记。

好的,我们梳理一下,现在这里边有三个人a, b, z,一个附带印章的纸条,一个印章印记。

于是,小a在选择是否越狱之前,必须先回答如下几个问题:

1,纸条内容(包括印章)在传递中没有被篡改。  

2,纸条印章与老z给的印章吻合。

3,这个吻合的印章花纹,确实属于小b。

4,老z提供的印记真的是可信的。

假设老z被证明了可信,便会将对小b的信任传递给小a,也就是说因为:z信任b,而a信任z,

所以,a便能够信任z提供的消息真实,也就是3可以成立。那么,这里便隐含了新的问题:

5,老z如何证明他拿到b的印记时,真的是属于a的。

解决问题1,用到的方法是消息认证或数字签名,也就是前边穿帮了的散列函数。

解决问题2,用到的方法是数字签名,也就是私钥加密,公钥解密。但是公钥的获得已经牵扯到了数字证书。

解决问题3,4,用到的方法是数字证书。我们可以将数字证书的结构进行拆解,使其分别解决问题3,4

[防扒乱入]  author: class_tong  date: 20190914 

问题5,代表的是数字证书的颁发过程。

为了进一步说明问题, 我们现在改变场景布置。约定问题4是成立的,老z在整个监狱内拥有绝对的权威,所有人

都信任他,他手里拿着所有人的印章印记。他亲自完成了证书的颁发过程(也就是亲眼见到每一个人在他的印记本上做印记盖章)

好了,我们现在又引进了新的概念,证书颁发。

而,在新的场景布置下,老z就是权威机构。

而保证每个人名字背后都只对应着一个人的系统,就是名字系统。名字和人的对应关系是多对一的关系,即一个人可以同时

拥有多个名字。且对应关系不可修改。

现在,我们跳出这个例子,其实多个人也可以共同拥有一个名字,但是这多个人会被名字系统理解为一个单一实体,

所以,其实还是一个多对一的关系。总之名字系统解决的是名字的唯一性问题,为后面的讨论做准备。

终于。我用土话编一个穿帮的故事成功的引出了这七个概念。我相信懂的人都看的懂,不懂的人怕是更加不懂了。。。

二 不讲故事

再梳理一次,上边的故事概念,正经八百的。

密码工程分两大块:加密和认证(are you sure?),我们这里,只讨论认证,不讨论加密。

另外,名字和名字系统通过上面的故事,也讲的很清楚(不明不白的)了,也不讨论了。

1 认证

认证分为消息认证源认证两个。我们设想迷茫的小a,收到消息之后,最担心的其实就是这两件事情

(1)消息内容是不是真实的。(2)消息源是不是真实的。

这里需要注意前文中一个重要的设定,小a预期小b的消息。

所以,消息内容是不是真实指的是,小a拿到的内容是不是就是小b想传递的。

同时,消息源是不是真实的是指,写消息这个人,是不是就是小a心里所想的那个(入狱前就认识的那个)小b。

1.1 消息认证

前文已经提到,做消息认证,我们用到了HASH。准确的说就是散列函数。通过对消息体和秘钥的散列函数,从而

生成消息认证码。HASH_func(消息体+秘钥),秘钥就是对称加密的秘钥,就是一段只有a与b知道的字符串(额,从天而降的秘钥。。。

不过这里只是稍微引入,下一小节里会去掉,所以上边的故事还是能说过去的。)

收到消息的一方,可以重新计算这个hash,从而证明消息内容没有篡改。

1.2 源认证

源认证就复杂了。

简单的说,就是被认证的一方使用私钥加密一段内容。把密文发送给对方。对方用公钥解开,发现得到的内容和明文保持一致。

便证明了,发送消息的一方,确实是拥有该公钥所对应秘钥的人。这个东西就叫数字签名。一般来说,在数字签名里,用私钥加密的

是明文的散列值。然后接触明文之后。再用hash和公钥解密的内容对比。

这时,我们惊奇的发现,数字签名同时完成了消息认证码的工作,也就是做了消息认证也做了源认证。而且,还去掉上小节里的秘钥。

不过,其实这里只是勉强说明了源认证。但是并不彻底。因为,我们设定的源认证是指:发送消息的人小b就是小a心里所想的那个人。

到目前,我们解决了几个问题:1 消息是可信的。2, 发送方与小a手里的公钥已经建立了强关联(相信这个公钥属于小a心里所想的那个人,也就能

相信消息的发送方是小a心里所想的那个人)

接下来需要进一步解决的,就是:如何证明公钥属于小a心里所想的那个人

这个步骤将由数字证书来完成。

 [防扒乱入]  author: class_tong  date: 20190914

2 数字证书

2.1 作用

我们现在知道,数字证书的作用就是证明:公钥属于你心里的那个人。

那个人要有一个代号,也就是前文提到的名字。这个名字是存在于名字系统里的。名字系统保证了名字的有效性,唯一性和不会重新指派。

于是,在引入名字系统之后,数字证书的作用就变成了:公钥属于名字。(当然,你心里想的那个人的名字)

而另一个需要强调的事情是,在我们刚刚引入名字之前的所有推理里。都不存在名字这样一个概念。也就是说,前边我们只是证明了这样

一件事情:小a收到了一条消息。这条消息属于有个公钥p所对应的私钥。也就是说,只建立了消息与公钥之间的关系关联。

前面我们提到了证书的作用,这也恰恰是证书存在的形式。每一个证书是一个公钥,以及这样的一个对应关系:公钥对应的名字。

所以,基于1)中的推论,我们现在能够得到新的一个推论:消息属于公钥对应的名字。也就是建立了消息与名字直接的关系。

也就是说,发消息的人,就是名字所代表的人。

2.2 额外逻辑

这还是没有达到目的。因为还需要判断小a心里所想的那个名字,与我们上一小结推理出的名字是否一致。

这个,我们不讨论。小a会引入任何一种方法来完成这件事情,从而完成逻辑闭环。比如,打开证书看一眼。不管他。

但是我们假设这条消息是符合预期的,小a打开证书看了之后,真的写着小b。而他心里想的也是小b。

好的。到这里。我们终于完成这条消息的源认证。

这便是整个过程中,数字证书存在的意义。

3 证书颁发

以上内容里,我们预设了一个前提。就是小a天然的的拥有这小b的证书。

事实上,在通信中,这是不可能的。总要有一个途径拿到这个证书。并且完全详细这个证书的安全和可信性。

这便是权威机构(也就是老z)要做的事情。

老z,对这个证书预先做了数字签名。从而保证了证书的可信性。所以只要你相信老z,就可以详细老z签名的

所有证书。

如上文,老z就是权威机构,如上过程就叫做证书颁发。

4 其他

除了借用名字来建立完整的信任逻辑链条外。还可以使用别名。

事实上在x.509证书格式中,名字被称为subject, 别名被称作subject alternative name

如,在配置strongswan时,用户的大脑与软件之间建立联系,就用的subject。

在strongswan的配置文件中,要显示指名我想要链接的对方的ID=【x509中的subject字符串】

又如,在https中,用户大脑与浏览器直接建立的联系,就是使用suject alternative name

也就是域名,如www.baidu.com。 在baidu的证书中,若干域名是SAN。

如果你不通过域名访问,而是通过IP地址直接访问。浏览器就会报警,说不安全的访问。

虽然一起都是对的,但是,却缺少了从用户的大脑到名字的逻辑链条,也就是证书的作用

没有达到。

写了太多了,不得不拆成两篇发:

下一篇,重点讲ipsec和tls中的端认证机制:[ipsec][crypto] ike/ipsec与tls的认证机制比较

[防扒乱入]  author: class_tong  date: 20190914  

原文地址:https://www.cnblogs.com/hugetong/p/11488342.html