证书使用发行者的私钥加密。每一个人都知道证书发行者的公钥(这样,每个证书的发行者拥有一个证书)。证书是一个把公钥与姓名绑定的协议。通过使用证书技术,每一个人都可以检查乙的证书,判断是否被假冒。假设乙控制好他的私钥,并且他确实是得到证书的乙,就万事大吉了。 这些是修订后的协议: 甲——〉乙:你好
乙——〉甲:嗨,我是乙,乙的校验 甲——〉乙:prove it
乙——〉甲:甲,我是乙 {信息段[甲, 我是乙] } 乙的私钥
现在当甲收到乙的第一个消息,他能检查证书,签名(如上所述,使用信息段和公钥解密),然后检查标题(乙的姓名),确定是乙。他就能相信公钥就是乙的公钥和要求乙证明自己的身份。乙通过上面的过程,制作一个信息段,用一个签名版本答复甲。甲可以校验乙的信息段通过使用从证书上得到的公钥并检查结果。
如果一个黑客,叫H 甲——〉H:你好
H——〉不能建立一个令甲相信的从乙的消息。 交换密码(secret)
一旦甲已经验证乙后,他可以发送给乙一个只有乙可以解密、阅读的消息: 甲——〉乙:{secret}乙的公钥
唯一找到密码的方法只有使用乙的私钥解码上述的信息。交换密码是另一个有效使用密码加密的方法。即使在甲和乙之间的通讯被侦听,只有乙才能得到密码。 使用密码作为另一个secret-key增强了网络的安全性,但是这次这是一个对称的加密算法(例如DES、RC4、IDE甲)。因为甲在发送给乙之前产生了密码,所以甲知道密码。乙知道密码因为乙有私钥,能够解密甲的信息。但他们都知道密码,他们都能够初始化一个对称密码算法,而且开始发送加密后的信息。这儿是修定后的协议: 甲——〉乙:你好
乙——〉甲:嗨,我是乙,乙的校验 甲——〉乙:prove it
乙——〉甲:甲,我是乙 {信息段[甲,我是乙] }乙的私钥 甲——〉乙:ok 乙,here is a secret {secret}乙的公钥 乙——〉甲:{some message}secret-key 黑客窃听
那么如果有一个恶意的黑客H在甲和乙中间,虽然不能发现甲和乙已经交换的密码,但能干扰他们的交谈。他可以放过大部分信息,选择破坏一定的信息(这是非常简单的,因为他知道甲和乙通话采用的协议)。 甲——〉H:你好 H——〉乙:你好
乙——〉H:嗨,我是乙,乙的校验 H——〉甲:嗨,我是乙,乙的校验 甲——〉H:prove it
H——〉乙:prove it
乙——〉H:甲,我是乙 {信息段[甲,我是乙] }乙的私钥 H——〉甲:甲,我是乙 {信息段[甲,我是乙] }乙的私钥 甲——〉H:ok 乙,here is a secret {secret} 乙的公钥 H——〉乙:ok 乙,here is a secret {secret} 乙的公钥 乙——〉H:{some message}secret-key
H——〉甲:Garble[{some message}secret-key ]
H忽略一些数据不修改,直到甲和乙交换密码。然后H干扰乙给甲的信息。在这一点上,甲相信乙,所以他可能相信已经被干扰的消息并且尽力解密。
需要注意的是,H不知道密码,他所能做的就是毁坏使用秘钥加密后的数据。基于协议,H可能不能产生一个有效的消息。但下一次呢?
为了阻止这种破坏,甲和乙在他们的协议中产生一个校验码消息(message authentication code)。一个校验码消息(MAC)是一部分由密码和一些传输消息产生的数据。信息段算法描述的上述特性正是它们抵御H的功能: MAC= Digest[some message,secret ]
因为H不知道密码,他不能得出正确的值。即使H随机干扰消息,只要数据量大,他成功的机会微乎其微。例如,使用HD5(一个RSA发明的好的加密算法),甲和乙能够发送128位MAC值和他们的消息。H猜测正确的MAC的几率将近1/18,446,744,073,709,551,616约等于零。 这是又一次修改后的协议: 甲——〉乙:你好
乙——〉甲:嗨,我是乙,乙的校验 甲——〉乙:prove it
乙——〉甲:嗨,我是乙,乙的校验 甲,我是乙
{信息段[甲,我是乙] } 乙的私钥
ok 乙,here is a secret {secret} 乙的公钥 {some message,MAC}secret-key 现在H已经无技可施了。他干扰了得到的所有消息,但MAC计算机能够发现他。甲和乙能够发现伪造的MAC值并且停止交谈。H不再能与乙通讯。 OpenSSL FAQ 参考资料:
bird.org/linux_server/0360apache.php#www_ssl_files 20.5 建立连线加密网站 (https) 及防砍站脚本
从本章一开始的 20.1 就谈过 http 这个通讯协定是明码传送资料,而那个 https 才是加密传输的!那加密的方法是透过 SSL 啊,这个 SSL 就是以 openssl 软体来提供的一个加密函式库。更多与 https 有关的资讯,请参考 20.1.4 吧!
20.5.1 SSL 所需软体与凭证档案及预设的 https
要达成让 apache 支援 https 协定的话,你必须要有 mod_ssl 这个软体才行!请先自行使用 yum 去装好这个软体吧! 同时,我们的 CentOS 5.x 也已经预设提供了 SSL 机制所需要的私钥与凭证档案罗!相关软体提供的档案如下:
? ? ?
/etc/httpd/conf.d/ssl.conf:mode_ssl 提供的 Apache 设定档;
/etc/pki/tls/private/localhost.key:系统私钥档,可以用来制作凭证的! /etc/pki/tls/certs/localhost.crt:就是加密过的凭证档!(signed certificate)
图 20.5-1、在 firefox 底下看到的 SSL 安全问题图示
就如同本章 20.1.4 谈到的,因为我们这个 Apache 网站并没有将此凭证向 CA 注册,因此就会出现上述的讯息了! 这就类似 ssh 连线时,系统需要你输入『 yes 』是一样的啦!要接受凭证後才能够进行加密的功能。所以,请点选上图中的箭头 1,此时就会延伸出箭头 2 的位置,按下去吧!然後就会出现如下所示:
图 20.5-2、在 firefox 底下接受一把私有的凭证所需要的流程
如果你确定这个网站是你自己的可信任网站,那就按下 1 及 2 的箭头处!如果还想要看一下这个网站所提供的相关凭证内容, 就按下 3 箭头的地方:
图 20.5-3、在 firefox 底下观察凭证的详细内容
20.5.2 拥有自制凭证的 https
?
建立凭证档
预设的凭证虽然已经可以让你顺利的使用 https 了,不过,凭证的有效日仅有 1 年而已~实在讨厌~ 所以,我们还是得要自制凭证才行~这个凭证的制作仅是私有 WWW 网站的用途,并没有要拿去 CA 注册喔! 那麽自制凭证需要什麽步骤呢?基本上需要的流程是:
1. 先建立一把 private key 预备提供给 SSL 凭证签章要求所用; 2. 最後建立 SSL 凭证 (test certificates)。