编辑: 王子梦丶 | 2017-12-18 |
第一章 前言
1
第二章 证书
1
第三章 加密算法
1
第四章 协议
1
第五章 入门
1
第六章 指令 verify
1
第七章 指令asn1parse
1
第八章 指令CA
(一)
1
第九章 指令CA
(二)
1
第十章 指令cipher
1 第十一章 指令dgst
1 第十二章 指令dhparam
1 第十三章 指令dsa
1 第十四章 指令dsaparam
1 第十五章 指令enc
1 第十六章 指令gendsa
1 第十七章 指令genrsa
1 第十八章 指令passwd
1 第十九章 指令pkcs7
1 第二十章 指令rand
1 第二十一章 指令req
(一)
1 第二十二章 指令req
(二)
1 第二十三章 指令rsa
1 第二十四章 指令rsautl
1 第二十五章 指令s_client
(一)
1 第二十六章 指令s_client
(二)
1 第二十七章 指令s_server
1 第二十八章 指令sess_id
1 第二十九章 指令speed
1 第三十章 指令version
1 第三十一章 指令x509
(一)
1 第三十二章 指令x509
(二)
1
第一章 前言 不久前接到有关ssl的活,结果找遍中文网站资料实在奇缺.
感觉是好象现在国内做这个技术的人不多,所以有兴趣写点东西来介绍一下. 我使用的ssl的toolkit是openssl,就用openssl做例子来讲解.openssl实在太大了,指令也多,API也多,更严重的是它的API没有说明. 我打算漫漫说清楚其主要指令的用法,主要API的中文说明,以及使用/编程的方法.工作量很大,因为我接触它也没几个月,现在大概完成了1/10吧,先把目前自己的一些心得,找到的资料和一些翻译出来的东西贴出来,希望对研究ssl的人有帮助.
第二章 证书 证书就是数字化的文件,里面有一个实体(网站、个人等)的公共密钥和其他的属性,如名称等.该公共密钥只属于某一个特定的实体,它的作用是防止一个实体假装成另外一个实体.证书用来保证不对称加密算法的合理性.想想吧,如果没有证书记录,那么假设某俩人A与B的通话过程如下:(这里假设A的public key是K1,private key是K2,B的public key是K3,private key是K4.xxxxxx(kn)表示用kn加密过的一段文字xxxxxx.) A(hello(plain text)(B A(hello(plain text)(B A(B'
s public key(B A(A'
s public key(B 如果C想假装成B,那么步骤就和上面一样. A(hello(plain text)(C A(hello(plain text)(C 注意下一步,因为A没有怀疑C的身份,所以他理所当然的接受了C的public key,并且使用这个key来继续下面的通信. A(C'
s public key(C A(A'
s public key(C 这样的情况下A是没有办法发觉C是假的. 如果A在通话过程中要求取得B的证书,并且验证证书里面记录的名字,如果名字和B的名字不符合,就可以发现对方不是B.验证B的名字,通过再从证书里面提取B的公用密钥,继续通信过程. 那么,如果证书是假的怎么办?或者证书被修改过了怎么办?慢慢看下来吧.证书最简单的形式就是只包含有证书拥有者的名字和公用密钥.当然现在用的证书没这么简单,里面至少还有证书过期的deadline、颁发证书的机构名称、证书系列号和一些其他可选的信息.最重要的是,它包含了证书颁发机构(certification authority,简称CA)的签名信息.我们现在常用的证书是采用X.509结构的,这是一个国际标准证书结构.任何遵循该标准的应用程序都可以读写X509结构的证书.通过检查证书里面的CA的名字,和CA的签名,就知道这个证书的确是由该CA签发的,然后,你就可以简单证书里面的接收证书者的名字,然后提取公共密钥.这样做建立的基础是,你信任该CA,认为该CA没有颁发错误的证书. CA是第三方机构,被你信任,由它保证证书的确发给了应该得到该证书的人.CA自己有一个庞大的public key数据库,用来颁发给不同的实体.这里有必要解释一下,CA也是一个实体,它也有自己的公共密钥和私有密钥,否则怎么做数字签名?它也有自己的证书,你可以去它的站点down它的证书得到它的公共密钥.一般CA的证书都内嵌在应用程序中间.不信你打开你的IE,在Internet选项里面选中 内容 ,点击 证书 ,看看那个 中间证书发行机构 和 委托根目录发行机构 ,是不是有一大堆CA的名称?也有时CA的证书放在安全的数据库里面,当你接受到对方的证书的时候,你首先会去看该证书的CA,然后去查找自己的CA证书数据库,看看是否能找到,找不到就表示自己不信任该CA,那么就告吹本次连接.找到了的话就用该CA的证书里面的公用密钥去检查CA在证书上的签名. 这里又有个连环的问题,我怎么知道那个CA的证书是属于那个CA的?人家不能造假吗?解释一下吧.CA也是分级别的.最高级别的CA叫Root Cas,其他cheap一点的CA的证书由他们来颁发和签名.这样的话,最后的保证就是:我们信任Root Cas.那些有Root CAs签过名的证书的CA就可以来颁发证书给实体或者其他CA了.你不信任Root CAs?人民币由中国人民银行发行,运到各个大银行,再运到地方银行,你从地方银行取人民币的时候不信任发行它的中国人民银行吗?Root CAs都是很权威的机构,没有必要担心他们的信用.那Root CAs谁给签名?他们自己给自己签名,叫自签名. 说了这么多,举个certificate的例子吧,对一些必要的item解释一下. Certificate Example Certificate: Data: Version: