要理解SSL通信,首先要理解Zheng书:
CA 到底是啥呢,打个比方,A与B网络上进行交易,但出于网络安全考虑:
1, AB可能都互不相信对方发来的信息,因为网络传过来的Zheng书有可能被别人篡改( man in middle 问题 )。其实goagent为了绕开这个问题不得不自制个CA,并自己导入到系统或浏览器内为受信CA ,才可让浏览器正常浏览有几大CA认ZhengZheng书的 SSL 网站。
2, 同时也不信自己,自己Zheng书有可能本地程序被篡改
但如果A与B同时信任第三方C,这时 C 就可以做 A&B 担保,出事找C。而这个C所要做的就是签发能Zheng明A与B的不容易被伪造身份信息。在网页上,一般只需要一个服务端Zheng书即可,除非做双向认Zheng才会要求客户端出示Zheng书。另外,让客户端自己找认Zheng机构签发Zheng书的成本太大。而这个凭Zheng就是我们所说的Zheng书,包括开始所说的几组信息。
用的最多的Zheng书标准是 x.509 v3。
刚看了下,支付宝用首页Zheng书的CA是VeriSign Class 3 International Server CA ,京东登录用的是GeoTrust SSL CA 。
以下是 SSL 通信流程:
这里涉及几个重要的算法了,主要分两类,一类是对称加密( DES,AES,RC4 ),另一类是非对称加密( RSA:公钥&密钥 )。
我们看下大概流程:
1,客户端接到服务端给的Zheng书后会做Zheng书的合法校验( 可能是一个链 ),如果Zheng明是几大 CA 机构签发的,直接走下面的流程。否则,要么给客户端一个提示是否信任,要么直接显示Zheng书错误提示。
这涉及服务端Zheng书的签名进行合法性校验的算法。Zheng书里的公钥所对应的私钥( RSA算法生成Zheng书前制作的一对KEY )是签名的关键,在做Zheng书时,把Zheng书信息求HASH值,然后用非所生成的Zheng书的私钥进行加密,此值做为Zheng书的签名信息。客户端需要认Zheng此信息是否合法时,只需要用Zheng书里的公钥进行解密再与Zheng书信息的HASH计算结果进行比较,如相同则认为合法Zheng书。这里的假设是得到公钥后求私钥过程成本极大或趋于不可逆计算。
2, 几次通信后,有几个可选流程。其中的Server Key Exchange 与 Client Key Exchange
是用的非常经常的 Diffie-Hellman 算法( 实际最早是一英国哥们发现的 )。目的就是让A与B想共享一个随机密钥,DH 算法具体是:
A与B共享一个大质数p 与一个更大的数 g
A与B各自生成随机数
用以上算法把A, B算出来,如 : A = pow(g,a) % p, B = pow(g,b) % p
把A与B在网上互换,再用这个算法求出一个新值:pow(A,b) % p, pow(B,a) % p。经过以上的求导等式得出此处的两值必相等,达到共享密钥的目的。
python测试 ( 非大质数 ) :
3,RSA 非对称加密
一般互联网的 SSL 只有服务端Zheng书,当浏览器拿到这个Zheng书后用里面的公钥加密强度更强的对称加密密钥与指纹( MD5 , SHA1 )发给服务端,再把客户端可使用的加密算法列表发服务端。此处用的是非对称加密算法 RSA,通过找出两个大质数然后做几个简单的算数运算求得两组数。这两组数可认为是钥匙与锁的关系。公钥是锁,私钥是钥匙,一把钥匙只能开一把锁。
第一组为公钥,可在网络上传输,完全公开的。客户端可用接收到的公钥,把最敏感的信息用加密,然后在网络上密文传服务器。要注意,此处的密文是不可用公钥解开的
第二组为私钥,服务端在接到在公钥加密后的密文后,可用相对应的私角进行解密
4,服务端从客户端的可使用的对称加密算法列表里挑出一个合适的与客户端达成共识,进行后面的对称加密的数据通信息
我们需要理解的还有两个:
单向认Zheng,只需要服务端提供Zheng书( 里面最重要的是公钥和 CA )给浏览器。
双向认Zheng,服务端向客户端要求Zheng书,服务端也把上面的流程走一遍。一般是应用客户端去做,要么就是去付网页上的安全组件了。
mac os上自制CA与双向认证证书命令,apache + iOS 双向认证通过:
ca:
openssl req -new -key ca.key.pem -out ca.csr -subj "/C=CN/ST=SZ/L=SZ/O=jory/OU=jory/CN=*.test.com”
openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey ca.key.pem -in ca.csr -out ca.cer
openssl pkcs12 -export -cacerts -inkey ca.key.pem -in ca.cer -out ca.p12
server:
openssl req -new -key server.key.pem -out server.csr -subj "/C=CN/ST=SZ/L=SZ/O=jory/OU=jory/CN=www.test.com”
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA ca.cer -CAkey ca.key.pem -CAserial ca.srl -CAcreateserial -in server.csr -out server.cer
openssl pkcs12 -export -cacerts -inkey ca.key.pem -in ca.cer -out ca.p12
client:
openssl genrsa -aes256 -out client.key.pem 2048
openssl req -new -key client.key.pem -out client.csr -subj "/C=CN/ST=SZ/L=SZ/O=jory/OU=jory/CN=jory"
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA ca.cer -CAkey ca.key.pem -CAserial ca.srl -CAcreateserial -in client.csr -out client.cer
openssl pkcs12 -export -clcerts -inkey client.key.pem -in client.cer -out client.p12
convert the key into no password:
openssl rsa -in ca. -out xxx.pem
参考:
http://www.math.brown.edu/~jhs/MathCrypto/SampleSections.pdf
https://sites.google.com/site/amitsciscozone/home/security/ssl-connection-setup
http://en.wikipedia.org/wiki/X509
http://en.wikipedia.org/wiki/RSA_ (cryptosystem)
Zheng书里包含的信息其实并不多,如:签发组织信息,签名算法,版本号,Zheng书 ID ,被签组织信息,生效日期,公钥信息,公钥签名,Zheng书指纹( MD5和SHA1 ),等。这个Zheng书重要的有三个部分,一个是签发组织信息,被签组织信息,还有就是公钥了( 非对称加密算法 RSA 使用 , 后面会讲 )。签发组织信息,其实就可以是CA,一个权威的Zheng书签发机构,权威Zheng书颁发机构很少。也只有这几家签发的Zheng书才被浏览器认为是安全或受信的。一般是操作系统安装的时候会自装几个受信CA Zheng书,iOS 也一样。
CA 到底是啥呢,打个比方,A与B网络上进行交易,但出于网络安全考虑:
1, AB可能都互不相信对方发来的信息,因为网络传过来的Zheng书有可能被别人篡改( man in middle 问题 )。其实goagent为了绕开这个问题不得不自制个CA,并自己导入到系统或浏览器内为受信CA ,才可让浏览器正常浏览有几大CA认ZhengZheng书的 SSL 网站。
2, 同时也不信自己,自己Zheng书有可能本地程序被篡改
但如果A与B同时信任第三方C,这时 C 就可以做 A&B 担保,出事找C。而这个C所要做的就是签发能Zheng明A与B的不容易被伪造身份信息。在网页上,一般只需要一个服务端Zheng书即可,除非做双向认Zheng才会要求客户端出示Zheng书。另外,让客户端自己找认Zheng机构签发Zheng书的成本太大。而这个凭Zheng就是我们所说的Zheng书,包括开始所说的几组信息。
用的最多的Zheng书标准是 x.509 v3。
刚看了下,支付宝用首页Zheng书的CA是VeriSign Class 3 International Server CA ,京东登录用的是GeoTrust SSL CA 。
以下是 SSL 通信流程:
![](http://cdn.cocimg.com/bbs/attachment/Fid_6/6_1185_fb788d564ed1097.png)
这里涉及几个重要的算法了,主要分两类,一类是对称加密( DES,AES,RC4 ),另一类是非对称加密( RSA:公钥&密钥 )。
我们看下大概流程:
1,客户端接到服务端给的Zheng书后会做Zheng书的合法校验( 可能是一个链 ),如果Zheng明是几大 CA 机构签发的,直接走下面的流程。否则,要么给客户端一个提示是否信任,要么直接显示Zheng书错误提示。
这涉及服务端Zheng书的签名进行合法性校验的算法。Zheng书里的公钥所对应的私钥( RSA算法生成Zheng书前制作的一对KEY )是签名的关键,在做Zheng书时,把Zheng书信息求HASH值,然后用非所生成的Zheng书的私钥进行加密,此值做为Zheng书的签名信息。客户端需要认Zheng此信息是否合法时,只需要用Zheng书里的公钥进行解密再与Zheng书信息的HASH计算结果进行比较,如相同则认为合法Zheng书。这里的假设是得到公钥后求私钥过程成本极大或趋于不可逆计算。
2, 几次通信后,有几个可选流程。其中的Server Key Exchange 与 Client Key Exchange
是用的非常经常的 Diffie-Hellman 算法( 实际最早是一英国哥们发现的 )。目的就是让A与B想共享一个随机密钥,DH 算法具体是:
![](http://cdn.cocimg.com/bbs/attachment/Fid_6/6_1185_363474459e0b36a.png)
A与B共享一个大质数p 与一个更大的数 g
A与B各自生成随机数
用以上算法把A, B算出来,如 : A = pow(g,a) % p, B = pow(g,b) % p
把A与B在网上互换,再用这个算法求出一个新值:pow(A,b) % p, pow(B,a) % p。经过以上的求导等式得出此处的两值必相等,达到共享密钥的目的。
python测试 ( 非大质数 ) :
复制代码
|
3,RSA 非对称加密
一般互联网的 SSL 只有服务端Zheng书,当浏览器拿到这个Zheng书后用里面的公钥加密强度更强的对称加密密钥与指纹( MD5 , SHA1 )发给服务端,再把客户端可使用的加密算法列表发服务端。此处用的是非对称加密算法 RSA,通过找出两个大质数然后做几个简单的算数运算求得两组数。这两组数可认为是钥匙与锁的关系。公钥是锁,私钥是钥匙,一把钥匙只能开一把锁。
第一组为公钥,可在网络上传输,完全公开的。客户端可用接收到的公钥,把最敏感的信息用加密,然后在网络上密文传服务器。要注意,此处的密文是不可用公钥解开的
第二组为私钥,服务端在接到在公钥加密后的密文后,可用相对应的私角进行解密
4,服务端从客户端的可使用的对称加密算法列表里挑出一个合适的与客户端达成共识,进行后面的对称加密的数据通信息
我们需要理解的还有两个:
单向认Zheng,只需要服务端提供Zheng书( 里面最重要的是公钥和 CA )给浏览器。
双向认Zheng,服务端向客户端要求Zheng书,服务端也把上面的流程走一遍。一般是应用客户端去做,要么就是去付网页上的安全组件了。
mac os上自制CA与双向认证证书命令,apache + iOS 双向认证通过:
ca:
openssl req -new -key ca.key.pem -out ca.csr -subj "/C=CN/ST=SZ/L=SZ/O=jory/OU=jory/CN=*.test.com”
openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey ca.key.pem -in ca.csr -out ca.cer
openssl pkcs12 -export -cacerts -inkey ca.key.pem -in ca.cer -out ca.p12
server:
openssl req -new -key server.key.pem -out server.csr -subj "/C=CN/ST=SZ/L=SZ/O=jory/OU=jory/CN=www.test.com”
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA ca.cer -CAkey ca.key.pem -CAserial ca.srl -CAcreateserial -in server.csr -out server.cer
openssl pkcs12 -export -cacerts -inkey ca.key.pem -in ca.cer -out ca.p12
client:
openssl genrsa -aes256 -out client.key.pem 2048
openssl req -new -key client.key.pem -out client.csr -subj "/C=CN/ST=SZ/L=SZ/O=jory/OU=jory/CN=jory"
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA ca.cer -CAkey ca.key.pem -CAserial ca.srl -CAcreateserial -in client.csr -out client.cer
openssl pkcs12 -export -clcerts -inkey client.key.pem -in client.cer -out client.p12
convert the key into no password:
openssl rsa -in ca. -out xxx.pem
参考:
http://www.math.brown.edu/~jhs/MathCrypto/SampleSections.pdf
https://sites.google.com/site/amitsciscozone/home/security/ssl-connection-setup
http://en.wikipedia.org/wiki/X509
http://en.wikipedia.org/wiki/RSA_ (cryptosystem)