《openssl 编程》之 ssl实现
上一篇 / 下一篇 2007-11-15 10:41:16 / 个人分类:信息安全
第三十一章 SSL实现
31.1概述
SSL协议最先由netscape公司提出,包括sslv2和sslv3两个版本。当前形成标准的为了tls协议(rfc2246规范)和DTLS(rfc4347,用于支持UDP协议)。sslv3和tls协议大致一样,只是有一些细微的差别。实际应用中,用的最多的为sslv3。
akQ i Fz0SSL协议能够保证通信双方的信道安全。它能提供数据加密、身份认证以及消息完整性保护,另外SSL协议还支持数据压缩。
0F6cV1~ H Z1MR0SSL协议通过客户端和服务端握手来协商各种算法和密钥。
31.2 openssl实现
SSL协议源码位于ssl目录下。它实现了sslv2、sslv3、TLS以及DTLS(Datagram TLS,基于UDP的TLS实现)。ssl实现中,对于每个协议,都有客户端实现(XXX_clnt.c)、服务端实现(XXX_srvr.c)、加密实现(XXX_enc.c)、记录协议实现(XXX_pkt.c)、METHOD方法(XXX_meth.c)、客户端服务端都用到的握手方法实现(XXX_both.c),以及对外提供的函数实现(XXX_lib.c),比较有规律。
W+U@q@1W/GV/^+~031.3 建立SSL测试环境
为了对SSL协议有大致的了解,我们可以通过openssl命令来建立一个SSL测试环境。LUPA开源社区xx*T+Oh&Em
1) 建立自己的CALUPA开源社区8T|L6tv/oo,CJ3xi
在openssl安装目录的misc目录下(或者在apps目录下),运行脚本:./CA.sh -newca(Windows环境下运行:perl ca.pl –newca),出现提示符时,直接回车。 运行完毕后会生成一个demonCA的目录,里面包含了ca证书及其私钥。LUPA开源社区 nOKHe:O*@F
2) 生成客户端和服务端证书申请:LUPA开源社区5pb z d#TX)C-Q
openssl req -newkey rsa:1024 -out req1.pem -keyout sslclientkey.pem
H"D,YTs)S0openssl req -newkey rsa:1024 -out req2.pem -keyout sslserverkey.pemLUPA开源社区9x&EsT.WE!M
3) 签发客户端和服务端证书LUPA开源社区mUnXt'p
openssl ca -in req1.pem -out sslclientcert.pem
q nh G/H.qJ0openssl ca -in req2.pem -out sslservercert.pem
Zj2PY2H-Cw ]04) 运行ssl服务端和客户端:LUPA开源社区aRZ7DiF-[
openssl s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile demoCA/cacert.pem -ssl3LUPA开源社区!Y a'|@i _v*O'|;d
openssl s_client -ssl3 -CAfile demoCA/cacert.pemLUPA开源社区c,A|1E \u
运行客户端程序后,如果正确,会打印类似如下内容:
7|8tQ$V b0SSL-Session:LUPA开源社区9OGJ9XI4]fx
Protocol : SSLv3
8nHS:b#t2Ja6l0Cipher : DHE-RSA-AES256-SHA
;o;P5G,}NT%}*D5L+{6ep8v0 Session-ID: A
Session-ID-ctx:
jQ&]8v nFy0 Master-Key: B00EEBD68165197BF
Key-Arg : NoneLUPA开源社区3Z!z ~p(lP
Start Time: 1164077175
?*Y!cwp |j&? x%u0Timeout : 7200 (sec)
O)tR+X1v3Mu ~_ G!E0Verify return code: 0 (ok)
9m#pe&XD3J2w0此时,输入数据然后回车,服务端会显示出来。
h,M&KNZ0`%};K0命令的其他选项:LUPA开源社区Me,x.KEp
a) 验证客户端证书LUPA开源社区b cn e I'm2G M!X LG
openssl s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile demoCA/cacert.pem -ssl3 -Verify 1
6i/j-qJ7Wuy0openssl s_client -ssl3 -CAfile demoCA/cacert.pem -cert sslclientcert.pem -key sslclientkey.pem
bc6Tk9E0b) 指定加密套件
mN#HeZ(X6{'_'h0openssl s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile demoCA/cacert.pem -ssl3 -Verify 1
e Ck~Ot/^ B{0openssl s_client -ssl3 -CAfile demoCA/cacert.pem -cert sslclientcert.pem -key sslclientkey.pem -cipher AES256-SHALUPA开源社区.JPLsf?}/i\Y
其中AES256-SHA可用根据openssl ciphers命令获取,s_server也可用指明加密套件:LUPA开源社区C4BI"MI+C
openssl s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile demoCA/cacert.pem -ssl3 -Verify 1 -cipher AES256-SHA
X8L,if`mG+Pr0c) 指定私钥加密口令
(hvR;x4a0openssl s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile demoCA/cacert.pem -ssl3 -Verify 3 -cipher AES256-SHA -pass pass:123456
&a$kZ]yx,?.c6?m0openssl s_client -ssl3 -CAfile demoCA/cacert.pem -cert sslclientcert.pem -key sslclientkey.pem -pass pass:123456LUPA开源社区E-EI,BS*uI
用参数pass给出私钥保护口令来源:LUPA开源社区q0K:^._1B
-pass file:1.txt (1.txt的内容为加密口令123456);
N J+}n5h.J0-pass env:envname (环境变量);LUPA开源社区%a9AB-sd'~%\
-pass fd:fdname;LUPA开源社区:B?/P9f9y9|u2[
-pass stdin。
5O6^.}~QAU0比如:LUPA开源社区3DZ3A7Yc,wQ
openssl s_client -ssl3 -CAfile demoCA/cacert.pem -cert sslclientcert.pem -key sslclientkey.pem -pass stdin