以前我也做过 pki related task, 也明白签名还有 ssl, certificate 这些技术,
但是,对于具体的逻辑,还不是太明白,
近日在看jvm 安全性的章节的时候,看到了通俗,浅显的描述,
然后,理解了整个体系,
我想,以后如果有人向我问的话,我应该也是可以解释明白的,对吧,
那就说明我真的理解了,对自己探究的一个奖赏。:)
真实需求
首先,我们从一个需求说起,
比如,一个人写了一些applet code, 我们称呼他,发布者,
然后,其他一些人,需要使用和在浏览器运行applet,
那些人,怎么能信任这个applet, 并且运行,而不是担心安全而拒绝呢,
1, 如何保证完整性
首先,我们要保证发布的jar 是完整的,而不是被别人篡改的,
那么我们就,在jar 中包含两部分,
一个是 source class, 还有基于source class 产生的一个散列,比如md5, etc.
那样,下载的人,一比较 jar 和散列值,就能保持完整性了。
比如一些例子,
apache tomcat下载网站,提供下载,同时提供校验的 asc 和 md5.
2, 如何防止篡改
别人可能将 jar 内容和 散列一起改掉,再发送给用户。
怎么办呢,
将 散列值,用发布者的私钥,加密,然后发布出去自己的公钥,这样别人
就可以根据得到的公钥,来判断是否是没有更改。
解决上面两个问题的图,如下,
签名过程
首先有一段代码,需要打包成 jar,同时,你要有一个公钥/私钥对,
通过 java, jarsigner, 数字签名,具体就是对 jar 内容,产生散列,
将散列,用私钥加密
然后,将 jar 内容和加密过的散列一起发送
验证过程
接收到jar 和加密的散列,和得到的发布者的公钥,
先用公钥解压散列,和通过jar生成的散列比较,
如果相同,就通过验证。
3, 如何安全,正确发布自己的公钥
但是,现在有了新问题,
用户怎么能得到发布者的公钥,而且保证没有被改过, 就是伪造?
假设有个 hack, 将 jar 包改了,用一个新的公钥/私钥对加密,并把新的公钥伪装成最初的发布者的,那怎么办?
这就引入了,pki 体系结构,
这时,就需要成立一些证书机构,
发布者,提交自己的公钥,并且自己的一些信息,比如地址,电话,公司名称,
然后,这些证书机构用自己的私钥来加密,
将发布者的公钥,发布成签名证书,附上,经过认证的发布者的一些信息。
然后,用户,就可以download 那个证书,
并和证书机构自己的证书,来做验证。
体系结构
就是这样一个信任机制,
当然,有一些顶级的证书机构,
他们的私钥,是保存在很安全的保险机构的,
如果他们签的证书,出了问题,他们是要负赔偿责任的。
一级一级机构,
这个和我们现实中的,是一个原理,
现实系统的参考
正如一位名人说的,任何虚拟系统的设计,都有其现实的参考,
这个也不例外,也就是,所说的隐喻。
比如我们一个人,从老家到北京,
那么要开一个介绍信,
那么北京那边为什么可以信任呢,
因为,北京那边信任,那个人所在的省级机构,那个省级机构信任地区,县,和地方机构,
一级一级信任,就得到了这个信任链,
这就是,pki 体系结构的现实参考。:)
未完待续,
参考深入 JVM 虚拟机第二版,3.7 代码签名和认证。