文中首先解释了加密解密的一些基础知识和概念,而后经过一个加密通讯过程的例子说明了加密算法的做用,以及数字证书的出现所起的做用。接着对数字证书作一个详细的解释,并讨论一下windows中数字证书的管理,最后演示使用makecert生成数字证书。若是发现文中有错误的地方,或者有什么地方说得不够清楚,欢迎指出!算法
这部份内容主要解释一些概念和术语,最好是先理解这部份内容。windows
公钥密码体制分为三个部分,公钥、私钥、加密解密算法,它的加密解密过程以下:安全
公钥密码体制的公钥和算法都是公开的(这是为何叫公钥密码体制的缘由),私钥是保密的。你们都以使用公钥进行加密,可是只有私钥的持有者才能解密。在实际的使用中,有须要的人会生成一对公钥和私钥,把公钥发布出去给别人使用,本身保留私钥。服务器
在对称加密算法中,加密使用的密钥和解密使用的密钥是相同的。也就是说,加密和解密都是使用的同一个密钥。所以对称加密算法要保证安全性的话,密钥要作好保密,只能让使用的人知道,不能对外公开。这个和上面的公钥密码体制有所不一样,公钥密码体制中加密是用公钥,解密使用私钥,而对称加密算法中,加密和解密都是使用同一个密钥,不区分公钥和私钥。网络
// 密钥,通常就是一个字符串或数字,在加密或者解密时传递给加密/解密算法。前面在公钥密码体制中说到的公钥、私钥就是密钥,公钥是加密使用的密钥,私钥是解密使用的密钥。数据结构
在非对称加密算法中,加密使用的密钥和解密使用的密钥是不相同的。前面所说的公钥密码体制就是一种非对称加密算法,他的公钥和是私钥是不能相同的,也就是说加密使用的密钥和解密使用的密钥不一样,所以它是一个非对称加密算法。app
RSA是一种公钥密码体制,如今使用得很普遍。若是对RSA自己有兴趣的,后面看我有没有时间写个RSA的具体介绍。ide
RSA密码体制是一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。 由公钥加密的内容能够而且只能由私钥进行解密,而且由私钥加密的内容能够而且只能由公钥进行解密。也就是说,RSA的这一对公钥、私钥均可以用来加密和解密,而且一方加密的内容能够由而且只能由对方进行解密。工具
咱们说加密,是指对某个内容加密,加密后的内容还能够经过解密进行还原。 好比咱们把一封邮件进行加密,加密后的内容在网络上进行传输,接收者在收到后,经过解密能够还原邮件的真实内容。测试
这里主要解释一下签名,签名就是在信息的后面再加上一段内容,能够证实信息没有被修改过,怎么样能够达到这个效果呢?通常是对信息作一个hash计算获得一个hash值,注意,这个过程是不可逆的,也就是说没法经过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后作为一个签名和信息一块儿发出去。 接收方在收到信息后,会从新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,若是一致,就说明信息的内容没有被修改过,由于这里hash计算能够保证不一样的内容必定会获得不一样的hash值,因此只要内容一被修改,根据信息内容计算的hash值就会变化。固然,不怀好意的人也能够修改信息内容的同时也修改hash值,从而让它们能够相匹配,为了防止这种状况,hash值通常都会加密后(也就是签名)再和信息一块儿发送,以保证这个hash值不被修改。至于如何让别人能够解密这个签名,这个过程涉及到数字证书等概念,咱们后面在说到数字证书时再详细说明,这里您先只需先理解签名的这个概念。
咱们来看一个例子,如今假设“服务器”和“客户”要在网络上通讯,而且他们打算使用RSA(参看前面的RSA简介)来对通讯进行加密以保证谈话内容的安全。因为是使用RSA这种公钥密码体制,“服务器”须要对外发布公钥(算法不须要公布,RSA的算法你们都知道),本身留着私钥。“客户”经过某些途径拿到了“服务器”发布的公钥,客户并不知道私钥。“客户”具体是经过什么途径获取公钥的,咱们后面再来讲明,下面看一下双方如何进行保密的通讯:
“客户”->“服务器”:你好
“服务器”->“客户”:你好,我是服务器
“客户”->“服务器”:????
由于消息是在网络上传输的,有人能够冒充本身是“服务器”来向客户发送信息。例如上面的消息能够被黑客截获以下:
“客户”->“服务器”:你好
“服务器”->“客户”:你好,我是服务器
“客户”->“黑客”:你好 // 黑客在“客户”和“服务器”之间的某个路由器上截获“客户”发给服务器的信息,而后本身冒充“服务器”
“黑客”->“客户”:你好,我是服务器
所以“客户”在接到消息后,并不能确定这个消息就是由“服务器”发出的,某些“黑客”也能够冒充“服务器”发出这个消息。如何肯定信息是由“服务器”发过来的呢?有一个解决方法,由于只有服务器有私钥,因此若是只要可以确认对方有私钥,那么对方就是“服务器”。所以通讯过程能够改进为以下:
“客户”->“服务器”:你好
“服务器”->“客户”:你好,我是服务器
“客户”->“服务器”:向我证实你就是服务器
“服务器”->“客户”:你好,我是服务器 {你好,我是服务器}[私钥|RSA]
// 注意这里约定一下,{} 表示RSA加密后的内容,[ | ]表示用什么密钥和算法进行加密,后面的示例中都用这种表示方式,例如上面的 {你好,我是服务器}[私钥|RSA] 就表示用私钥对“你好,我是服务器”进行加密后的结果。
为了向“客户”证实本身是“服务器”, “服务器”把一个字符串用本身的私钥加密,把明文和加密后的密文一块儿发给“客户”。对于这里的例子来讲,就是把字符串 “你好,我是服务器”和这个字符串用私钥加密后的内容 {你好,我是服务器}[私钥|RSA] 发给客户。
“客户”收到信息后,她用本身持有的公钥解密密文,和明文进行对比,若是一致,说明信息的确是由服务器发过来的。也就是说“客户”把 {你好,我是服务器}[私钥|RSA] 这个内容用公钥进行解密,而后和“你好,我是服务器”对比。由于由“服务器”用私钥加密后的内容,由而且只能由公钥进行解密,私钥只有“服务器”持有,因此若是解密出来的内容是可以对得上的,那说明信息必定是从“服务器”发过来的。
假设“黑客”想冒充“服务器”:
“黑客”->“客户”:你好,我是服务器
“客户”->“黑客”:向我证实你就是服务器
“黑客”->“客户”:你好,我是服务器 {你好,我是服务器}[???|RSA] //这里黑客没法冒充,由于他不知道私钥,没法用私钥加密某个字符串后发送给客户去验证。
“客户”->“黑客”:????
因为“黑客”没有“服务器”的私钥,所以它发送过去的内容,“客户”是没法经过服务器的公钥解密的,所以能够认定对方是个冒牌货!
到这里为止,“客户”就能够确认“服务器”的身份了,能够放心和“服务器”进行通讯,可是这里有一个问题,通讯的内容在网络上仍是没法保密。为何没法保密呢?通讯过程不是能够用公钥、私钥加密吗?其实用RSA的私钥和公钥是不行的,咱们来具体分析下过程,看下面的演示:
“客户”->“服务器”:你好
“服务器”->“客户”:你好,我是服务器
“客户”->“服务器”:向我证实你就是服务器
“服务器”->“客户”:你好,我是服务器 {你好,我是服务器}[私钥|RSA]
“客户”->“服务器”:{个人账号是aaa,密码是123,把个人余额的信息发给我看看}[公钥|RSA]
“服务器”->“客户”:{你的余额是100元}[私钥|RSA]
注意上面的的信息 {你的余额是100元}[私钥],这个是“服务器”用私钥加密后的内容,可是咱们以前说了,公钥是发布出去的,所以全部的人都知道公钥,因此除了“客户”,其它的人也能够用公钥对{你的余额是100元}[私钥]进行解密。因此若是“服务器”用私钥加密发给“客户”,这个信息是没法保密的,由于只要有公钥就能够解密这内容。然而“服务器”也不能用公钥对发送的内容进行加密,由于“客户”没有私钥,发送个“客户”也解密不了。
这样问题就又来了,那又如何解决呢?在实际的应用过程,通常是经过引入对称加密来解决这个问题,看下面的演示:
“客户”->“服务器”:你好
“服务器”->“客户”:你好,我是服务器
“客户”->“服务器”:向我证实你就是服务器
“服务器”->“客户”:你好,我是服务器 {你好,我是服务器}[私钥|RSA]
“客户”->“服务器”:{咱们后面的通讯过程,用对称加密来进行,这里是对称加密算法和密钥}[公钥|RSA] //蓝色字体的部分是对称加密的算法和密钥的具体内容,客户把它们发送给服务器。
“服务器”->“客户”:{OK,收到!}[密钥|对称加密算法]
“客户”->“服务器”:{个人账号是aaa,密码是123,把个人余额的信息发给我看看}[密钥|对称加密算法]
“服务器”->“客户”:{你的余额是100元}[密钥|对称加密算法]
在上面的通讯过程当中,“客户”在确认了“服务器”的身份后,“客户”本身选择一个对称加密算法和一个密钥,把这个对称加密算法和密钥一块儿用公钥加密后发送给“服务器”。注意,因为对称加密算法和密钥是用公钥加密的,就算这个加密后的内容被“黑客”截获了,因为没有私钥,“黑客”也无从知道对称加密算法和密钥的内容。
因为是用公钥加密的,只有私钥可以解密,这样就能够保证只有服务器能够知道对称加密算法和密钥,而其它人不可能知道(这个对称加密算法和密钥是“客户”本身选择的,因此“客户”本身固然知道如何解密加密)。这样“服务器”和“客户”就能够用对称加密算法和密钥来加密通讯的内容了。
总结一下,RSA加密算法在这个通讯过程当中所起到的做用主要有两个:
若是这里您理解了为何不用RSA去加密通讯过程,而是要再肯定一个对称加密算法来保证通讯过程的安全,那么就说明前面的内容您已经理解了。(若是不清楚,再看下2.3和2.4,若是仍是不清楚,那应该是咱们说清楚,您能够留言提问。)
到这里,“客户”就能够确认“服务器”的身份,而且双方的通讯内容能够进行加密,其余人就算截获了通讯内容,也没法解密。的确,好像通讯的过程是比较安全了。
可是这里还留有一个问题,在最开始咱们就说过,“服务器”要对外发布公钥,那“服务器”如何把公钥发送给“客户”呢?咱们第一反应可能会想到如下的两个方法:
a)把公钥放到互联网的某个地方的一个下载地址,事先给“客户”去下载。
b)每次和“客户”开始通讯时,“服务器”把公钥发给“客户”。
可是这个两个方法都有必定的问题,
对于a)方法,“客户”没法肯定这个下载地址是否是“服务器”发布的,你凭什么就相信这个地址下载的东西就是“服务器”发布的而不是别人伪造的呢,万一下载到一个假的怎么办?另外要全部的“客户”都在通讯前事先去下载公钥也很不现实。
对于b)方法,也有问题,由于任何人均可以本身生成一对公钥和私钥,他只要向“客户”发送他本身的私钥就能够冒充“服务器”了。示意以下:
“客户”->“黑客”:你好 //黑客截获“客户”发给“服务器”的消息
“黑客”->“客户”:你好,我是服务器,这个是个人公钥 //黑客本身生成一对公钥和私钥,把公钥发给“客户”,本身保留私钥
“客户”->“黑客”:向我证实你就是服务器
“黑客”->“客户”:你好,我是服务器 {你好,我是服务器}[黑客本身的私钥|RSA] //客户收到“黑客”用私钥加密的信息后,是能够用“黑客”发给本身的公钥解密的,从而会误认为“黑客”是“服务器”
所以“黑客”只须要本身生成一对公钥和私钥,而后把公钥发送给“客户”,本身保留私钥,这样因为“客户”能够用黑客的公钥解密黑客的私钥加密的内容,“客户”就会相信“黑客”是“服务器”,从而致使了安全问题。这里问题的根源就在于,你们均可以生成公钥、私钥对,没法确认公钥对究竟是谁的。 若是可以肯定公钥究竟是谁的,就不会有这个问题了。例如,若是收到“黑客”冒充“服务器”发过来的公钥,通过某种检查,若是可以发现这个公钥不是“服务器”的就行了。
为了解决这个问题,数字证书出现了,它能够解决咱们上面的问题。先大概看下什么是数字证书,一个证书包含下面的具体内容:
证书的内容的详细解释会在后面详细解释,这里先只须要搞清楚一点,数字证书能够保证数字证书里的公钥确实是这个证书的全部者(Subject)的,或者证书能够用来确认对方的身份。也就是说,咱们拿到一个数字证书,咱们能够判断出这个数字证书究竟是谁的。至因而如何判断的,后面会在详细讨论数字证书时详细解释。如今把前面的通讯过程使用数字证书修改成以下:
“客户”->“服务器”:你好
“服务器”->“客户”:你好,我是服务器,这里是个人数字证书 //这里用证书代替了公钥
“客户”->“服务器”:向我证实你就是服务器
“服务器”->“客户”:你好,我是服务器 {你好,我是服务器}[私钥|RSA]
注意,上面第二次通讯,“服务器”把本身的证书发给了“客户”,而不是发送公钥。“客户”能够根据证书校验这个证书究竟是不是“服务器”的,也就是能校验这个证书的全部者是否是“服务器”,从而确认这个证书中的公钥的确是“服务器”的。后面的过程和之前是同样,“客户”让“服务器”证实本身的身份,“服务器”用私钥加密一段内容连同明文一块儿发给“客户”,“客户”把加密内容用数字证书中的公钥解密后和明文对比,若是一致,那么对方就确实是“服务器”,而后双方协商一个对称加密来保证通讯过程的安全。到这里,整个过程就完整了,咱们回顾一下:
step1: “客户”向服务端发送一个通讯请求
“客户”->“服务器”:你好
step2: “服务器”向客户发送本身的数字证书。证书中有一个公钥用来加密信息,私钥由“服务器”持有
“服务器”->“客户”:你好,我是服务器,这里是个人数字证书
step3: “客户”收到“服务器”的证书后,它会去验证这个数字证书究竟是不是“服务器”的,数字证书有没有什么问题,数字证书若是检查没有问题,就说明数字证书中的公钥确实是“服务器”的。检查数字证书后,“客户”会发送一个随机的字符串给“服务器”用私钥去加密,服务器把加密的结果返回给“客户”,“客户”用公钥解密这个返回结果,若是解密结果与以前生成的随机字符串一致,那说明对方确实是私钥的持有者,或者说对方确实是“服务器”。
“客户”->“服务器”:向我证实你就是服务器,这是一个随机字符串 //前面的例子中为了方便解释,用的是“你好”等内容,实际状况下通常是随机生成的一个字符串。
“服务器”->“客户”:{一个随机字符串}[私钥|RSA]
step4: 验证“服务器”的身份后,“客户”生成一个对称加密算法和密钥,用于后面的通讯的加密和解密。这个对称加密算法和密钥,“客户”会用公钥加密后发送给“服务器”,别人截获了也没用,由于只有“服务器”手中有能够解密的私钥。这样,后面“服务器”和“客户”就均可以用对称加密算法来加密和解密通讯内容了。
“服务器”->“客户”:{OK,已经收到你发来的对称加密算法和密钥!有什么能够帮到你的?}[密钥|对称加密算法]
“客户”->“服务器”:{个人账号是aaa,密码是123,把个人余额的信息发给我看看}[密钥|对称加密算法]
“服务器”->“客户”:{你好,你的余额是100元}[密钥|对称加密算法]
…… //继续其它的通讯
上面的过程已经十分接近HTTPS的真实通讯过程了,彻底能够按照这个过程去理解HTTPS的工做原理。可是我为了方便解释,上面有些细节没有说到,有兴趣的人能够看下这部分的内容。能够跳过不看,可有可无。
【问题1】
上面的通讯过程当中说到,在检查完证书后,“客户”发送一个随机的字符串给“服务器”去用私钥加密,以便判断对方是否真的持有私钥。可是有一个问题,“黑客”也能够发送一个字符串给“服务器”去加密而且获得加密后的内容,这样对于“服务器”来讲是不安全的,由于黑客能够发送一些简单的有规律的字符串给“服务器”加密,从而寻找加密的规律,有可能威胁到私钥的安全。因此说,“服务器”随随便便用私钥去加密一个来路不明的字符串并把结果发送给对方是不安全的。
〖解决方法〗
每次收到“客户”发来的要加密的的字符串时,“服务器”并非真正的加密这个字符串自己,而是把这个字符串进行一个hash计算,加密这个字符串的hash值(不加密原来的字符串)后发送给“客户”,“客户”收到后解密这个hash值并本身计算字符串的hash值而后进行对比是否一致。也就是说,“服务器”不直接加密收到的字符串,而是加密这个字符串的一个hash值,这样就避免了加密那些有规律的字符串,从而下降被破解的机率。“客户”本身发送的字符串,所以它本身能够计算字符串的hash值,而后再把“服务器”发送过来的加密的hash值和本身计算的进行对比,一样也能肯定对方是不是“服务器”。
【问题2】
在双方的通讯过程当中,“黑客”能够截获发送的加密了的内容,虽然他没法解密这个内容,可是他能够捣乱,例如把信息原封不动的发送屡次,扰乱通讯过程。
〖解决方法〗
能够给通讯的内容加上一个序号或者一个随机的值,若是“客户”或者“服务器”接收到的信息中有以前出现过的序号或者随机值,那么说明有人在通讯过程当中重发信息内容进行捣乱,双方会马上中止通讯。有人可能会问,若是有人一直这么捣乱怎么办?那不是没法通讯了? 答案是的确是这样的,例若有人控制了你链接互联网的路由器,他的确能够针对你。可是一些重要的应用,例如军队或者政府的内部网络,它们都不使用咱们平时使用的公网,所以通常人不会破坏到他们的通讯。
【问题3】
在双方的通讯过程当中,“黑客”除了简单的重复发送截获的消息以外,还能够修改截获后的密文修改后再发送,由于修改的是密文,虽然不能彻底控制消息解密后的内容,可是仍然会破坏解密后的密文。所以发送过程若是黑客对密文进行了修改,“客户”和“服务器”是没法判断密文是否被修改的。虽然不必定能达到目的,可是“黑客”能够一直这样碰碰运气。
〖解决方法〗
在每次发送信息时,先对信息的内容进行一个hash计算得出一个hash值,将信息的内容和这个hash值一块儿加密后发送。接收方在收到后进行解密获得明文的内容和hash值,而后接收方再本身对收到信息内容作一次hash计算,与收到的hash值进行对比看是否匹配,若是匹配就说明信息在传输过程当中没有被修改过。若是不匹配说明中途有人故意对加密数据进行了修改,马上中断通话过程后作其它处理。
以前已经大概说了一个证书由什么构成,可是没有仔细进行介绍,这里对证书的内容作一个详细的介绍。先看下一个证书究竟是个什么东西,在windows下查看一个证书时,界面是这样的,咱们主要关注一下Details Tab页,其中的内容比较长,我滚动内容后后抓了三个图,把完整的信息显示出来:
里面的内容比较多——Version、Serial number、Signature algorithm 等等,挑几个重要的解释一下。
◆Issuer (证书的发布机构)
指出是什么机构发布的这个证书,也就是指明这个证书是哪一个公司建立的(只是建立证书,不是指证书的使用者)。对于上面的这个证书来讲,就是指"SecureTrust CA"这个机构。
◆Valid from , Valid to (证书的有效期)
也就是证书的有效时间,或者说证书的使用期限。 过了有效期限,证书就会做废,不能使用了。
◆Public key (公钥)
这个咱们在前面介绍公钥密码体制时介绍过,公钥是用来对消息进行加密的,第2章的例子中常常用到的。这个数字证书的公钥是2048位的,它的值能够在图的中间的那个对话框中看获得,是很长的一串数字。
◆Subject (主题)
这个证书是发布给谁的,或者说证书的全部者,通常是某我的或者某个公司名称、机构的名称、公司网站的网址等。 对于这里的证书来讲,证书的全部者是Trustwave这个公司。
◆Signature algorithm (签名所使用的算法)
就是指的这个数字证书的数字签名所使用的加密算法,这样就可使用证书发布机构的证书里面的公钥,根据这个算法对指纹进行解密。指纹的加密结果就是数字签名(第1.5节中解释过数字签名)。
◆Thumbprint, Thumbprint algorithm (指纹以及指纹算法)
这个是用来保证证书的完整性的,也就是说确保证书没有被修改过,这东西的做用和2.7中说到的第3个问题相似。 其原理就是在发布证书时,发布者根据指纹算法(一个hash算法)计算整个证书的hash值(指纹)并和证书放在一块儿,使用者在打开证书时,本身也根据指纹算法计算一下证书的hash值(指纹),若是和刚开始的值对得上,就说明证书没有被修改过,由于证书的内容被修改后,根据证书的内容计算的出的hash值(指纹)是会变化的。 注意,这个指纹会使用"SecureTrust CA"这个证书机构的私钥用签名算法(Signature algorithm)加密后和证书放在一块儿。
注意,为了保证安全,在证书的发布机构发布证书时,证书的指纹和指纹算法,都会加密后再和证书放到一块儿发布,以防有人修改指纹后伪造相应的数字证书。这里问题又来了,证书的指纹和指纹算法用什么加密呢?他们是用证书发布机构的私钥进行加密的。能够用证书发布机构的公钥对指纹和指纹算法解密,也就是说证书发布机构除了给别人发布证书外,他本身自己也有本身的证书。证书发布机构的证书是哪里来的呢???这个证书发布机构的数字证书(通常由他本身生成)在咱们的操做系统刚安装好时(例如windows xp等操做系统),这些证书发布机构的数字证书就已经被微软(或者其它操做系统的开发机构)安装在操做系统中了,微软等公司会根据一些权威安全机构的评估选取一些信誉很好而且经过必定的安全认证的证书发布机构,把这些证书发布机构的证书默认就安装在操做系统里面了,而且设置为操做系统信任的数字证书。这些证书发布机构本身持有与他本身的数字证书对应的私钥,他会用这个私钥加密全部他发布的证书的指纹做为数字签名。
举个例子方便你们理解,假设咱们公司"ABC Company"花了1000块钱,向一个证书发布机构"SecureTrust CA"为咱们本身的公司"ABC Company"申请了一张证书,注意,这个证书发布机构"SecureTrust CA"是一个你们公认并被一些权威机构接受的证书发布机构,咱们的操做系统里面已经安装了"SecureTrust CA"的证书。"SecureTrust CA"在给咱们发布证书时,把Issuer,Public key,Subject,Valid from,Valid to等信息以明文的形式写到证书里面,而后用一个指纹算法计算出这些数字证书内容的一个指纹,并把指纹和指纹算法用本身的私钥进行加密,而后和证书的内容一块儿发布,同时"SecureTrust CA"还会给一个咱们公司"ABC Company"的私钥给到咱们。咱们花了1000块钱买的这个证书的内容以下:
×××××××××××××××证书内容开始×××××××××××××××××
Issuer : SecureTrust CA
Subject : ABC Company
Valid from : 某个日期
Valid to: 某个日期
Public Key : 一串很长的数字
…… 其它的一些证书内容……
{证书的指纹和计算指纹所使用的指纹算法}[SecureTrust CA的私钥|RSA] //这个就是"SecureTrust CA"对这个证书的一个数字签名,表示这个证书确实是他发布的,有什么问题他会负责(收了咱们1000块,出了问题确定要负责任的)
×××××××××××××××证书内容结束×××××××××××××××××
// 记不记得前面的约定?{} 表示RSA加密后的内容,[ | ]表示用什么密钥和算法进行加密
咱们"ABC Company"申请到这个证书后,咱们把证书投入使用,咱们在通讯过程开始时会把证书发给对方,对方如何检查这个证书的确是合法的而且是咱们"ABC Company"公司的证书呢?首先应用程序(对方通讯用的程序,例如IE、OUTLook等)读取证书中的Issuer(发布机构)为"SecureTrust CA" ,而后会在操做系统中受信任的发布机构的证书中去找"SecureTrust CA"的证书,若是找不到,那说明证书的发布机构是个水货发布机构,证书可能有问题,程序会给出一个错误信息。 若是在系统中找到了"SecureTrust CA"的证书,那么应用程序就会从证书中取出"SecureTrust CA"的公钥,而后对咱们"ABC Company"公司的证书里面的指纹和指纹算法用这个公钥进行解密,而后使用这个指纹算法计算"ABC Company"证书的指纹,将这个计算的指纹与放在证书中的指纹对比,若是一致,说明"ABC Company"的证书确定没有被修改过而且证书是"SecureTrust CA" 发布的,证书中的公钥确定是"ABC Company"的。对方而后就能够放心的使用这个公钥和咱们"ABC Company"进行通讯了。
★这个部分很是重要,必定要理解,您能够从新回顾一下以前的两章“一、基础知识”和“ 二、一个加密通讯过程的演化”,而后再来理解这部分的内容。若是您把这节的内容看了几遍尚未搞懂证书的工做原理,您能够留言指出我没有说清楚的内容,我好方便进行修正。
前面已经初步介绍了一下证书发布机构,这里再深刻讨论一下。
其实全部的公司均可以发布证书,咱们本身也能够去注册一家公司来专门给别人发布证书。可是很明显,咱们本身的专门发布证书的公司是不会被那些国际上的权威机构承认的,人家怎么知道你是否是个狗屁皮包公司?所以微软在它的操做系统中,并不会信任咱们这个证书发布机构,当应用程序在检查证书的合法信的时候,一看证书的发布机构并非操做系统所信任的发布机构,就会抛出错误信息。也就是说windows操做系统中不会预先安装好咱们这个证书发布机构的证书,不信任咱们这个发布机构。
不受信任的证书发布机构的危害
为何一个证书发布机构受不受信任这么重要?咱们举个例子。假设咱们开了一个狗屁公司来为别人发布证书,而且我和微软有一腿,微软在他们的操做系统中把我设置为了受信任的证书发布机构。如今若是有个小公司叫Wicrosoft 花了10块钱让我为他们公司申请了一个证书,而且公司慢慢壮大,证书的应用范围也愈来愈广。而后有个奸商的公司JS Company想冒充Wicrosoft,因而给了我¥10000,让我为他们颁布一个证书,可是证书的名字(Subject)要写Wicrosoft,假如我为了这¥10000,真的把证书给了他们,那么他们之后就可使用这个证书来冒充Wicrosoft了。
若是是一个优秀的证书发布机构,好比你要向他申请一个名字叫Wicrosoft的证书,它会让你提供不少资料证实你确实能够表明Wicrosoft这个公司,也就是说他回去核实你的身份。证书发布机构是要为他发布出的证书负法律责任的。
到这里,你可能会想,TMD,那咱们本身就不能发布证书吗?就必定要花钱去申请?固然不是,咱们本身也能够成立证书发布机构,可是须要经过一些安全认证等等,只是有点麻烦。另外,若是数字证书只是要在公司内部使用,公司能够本身给本身生成一个证书,在公司的全部机器上把这个证书设置为操做系统信任的证书发布机构的证书(这句话仔细看清楚,有点绕口),这样之后公司发布的证书在公司内部的全部机器上就能够经过验证了(在发布证书时,把这些证书的Issuer(发布机构)设置为咱们本身的证书发布机构的证书的Subject(主题)就能够了)。可是这只限于内部应用,由于只有咱们公司本身的机器上设置了信任咱们本身这个所谓的证书发布机构,而其它机器上并无事先信任咱们这个证书发布机构,因此在其它机器上,咱们发布的证书就没法经过安全验证。
咱们在上一章中说到了,咱们的操做系统中会预先安装好一些证书发布机构的证书,咱们看下在windows中如何找到这些证书,步骤以下:
1)开始菜单->运行,输入mmc,回车
2)在打开的窗口中选择 File-> Add/Remove Snap-in…
3)而后在弹出的对话框的 Standalone Tab页里面点击 Add… 按钮
4)在弹出的对对话框中选择 certificates 后点击 Add 按钮
具体的步骤以下图所示:
上面的步骤结束后,会又弹出一个对话框,里面有三个单选按钮以下:
能够选择第一或者第三个选项,用来查看当前用户的证书或整个计算里面安装的证书。咱们这里就默认选择第一个,平时通常安装证书的时候都会给全部用户安装,因此选择第一个和第三个选项看到的证书会差很少。咱们在左边的导航树中选中受信任的证书发布机构(Trusted Root Certificate Authorities),而后点击下面的证书(Certificates),在右边的区域中就能够看到全部的受信任的证书发布机构的证书。
注意上面的图片中,右边咱们选中的这个证书发布机构"SecureTrust CA",咱们前面在第3章3.2节中举例子的时候,就是去向这个证书发布机构申请的证书,因为咱们申请的证书是这个机构发布的,因此应用程序在检查咱们的证书的发布机构时(会检查咱们证书的签名,确认是该机构发布的证书),就会发现是能够信任的证书发布机构,从而就会相信咱们证书的真实性。
删除数字证书很简单,直接在右边的列表中右键而后删除就能够了。
数字证书的安装也比较简单,直接双击数字证书文件,会打开数字证书,对话框下面会有一个Install Certificate按钮,点击后就能够根据向导进行安装,以下图所示:
这个证书是我本身生成的测试证书,在证书的导入向导里面,它会让你选择导入到什么位置,若是是一个咱们本身信任的证书发布机构本身的证书,只要导入到Certificate Authorities就能够了。Trusted Root Certificate Authorities, Intermediate Certification Authorities, Third-Party Root Certification Authorities 都是能够的,他们只是对证书的发布机构作了一个分类,还有一些其它的证书类型,例如Personal(我的证书)等等,具体就不介绍了。安装的时候通常来讲能够用默认的选择项一直"下一步"到底。
每一个证书发布机构都有本身的用来建立证书的工具,固然,具体他们怎么去建立一个证书的我也不太清楚,不一样类型的证书都有必定的格式和规范,我没有仔细去研究过这部份内容。 微软为咱们提供了一个用来建立证书的工具makecert.exe,在安装Visual Studio的时候会安装上。若是没有安装也无所谓,能够上网去下一个,搜索makecert就能够了。能够直接从个人博客下载,这是连接。
向一些正规的证书发布机构申请证书通常是要收费的(由于别人要花时间检查你的身份,确认有没有同名的证书等等),这里咱们看下如何本身建立一个证书,为后面在IIS中配置Https作准备。
咱们用到的是makecert这个工具,微软有很详细的使用帮助,我这里只作一个简单的解释,详细的各类参数和使用方法请查看MSDN的makecert的帮助。可是里面有些参数说得不够清楚,并且还有遗漏的,能够参看我后面的解释做为一个补充。
先看下makecert最简单的使用方式:
makecert.exe test.cer
上面的命令会在makecert.exe所在的目录生成一个证书文件test.cer的数字证书文件。能够双击证书打开,看看证书的内容以下:
证书的发布机构是"Root Agency",证书的主题(证书发布给谁)是"Joe’s-Software-Emporium",由于咱们没有指定把证书发布给谁,makecert本身给咱们随便生成了一个公司的名字。另外还指定了公钥、签名算法(用来解密签名)、指纹和指纹算法等。
注意,由于这个证书是由微软的工具生成的,严格来讲它没什么发布机构,因此微软虚拟了一个叫作"Root Agency"的发布机构,默认状况下,windows里面安装了这个所谓的证书发布机构的证书,可是这证书默认状况下不是受信任的,缘由很简单,这样作你们均可以用makecert来制做合法的数字证书了。若是咱们本身硬是要,也能够把它设置为受信任的。
下面咱们看下其它的参数,好比咱们要给网站 www.jefferysun.com 生成一个证书MyCA.cer,假设咱们把makecert.exe放在C:盘下,命令行以下:
C:\> makecert.exe –pe -r –n "CN=www.jefferysun.com" -ss my -sr LocalMachine -a sha1 -len 2048 MyCA.cer
解释一下makecert的经常使用参数的意思:
生成证书后能够进行安装,安装过程能够参看4.1节。
出处:https://blog.csdn.net/junehappylove/article/details/52288796