转载SSL连接建立过程分析_第1页
转载SSL连接建立过程分析_第2页
转载SSL连接建立过程分析_第3页
转载SSL连接建立过程分析_第4页
转载SSL连接建立过程分析_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.转载 SSL连接建立过程分析 1原文地址:SSL连接建立过程分析1 南阳儒生周东尧 s协议:SSL建立过程分析web访问的两种方式: 协议,我们一般情况下是通过它访问web,因为它不要求太多的平安机制,使用起来也简单,很多web站点也只支持这种方式下的访问. s协议Hypertext Transfer Protocol over Secure Socket Layer,对于平安性要求比较高的情况,可以通过它访问web,比方工商银行 s:/ icbc .cn/icbc/当然也可以通过 协议访问,只是没那么平安了.其平安根底是SSL协议.SSL协议,当前版本为3.1SSL3.1就是TLS1.0。

2、它已被广泛地用于Web阅读器与效劳器之间的身份认证和加密数据传输.它位于TCP/IP协议与各种应用层协议之间,为数据通讯提供平安支持。SSL协议可分为两层:SSL记录协议SSL Record Protocol:它建立在可靠的传输协议如TCP之上,为高层协议提供数据封装、压缩、加密等根本功能的支持。SSL握手协议SSL Handshake Protocol:它建立在SSL记录协议之上,用于在实际的数据传输开场前,通讯双方进展身份认证、协商加密算法、交换加密密钥等。为了理解详细过程,可以通过网络抓包工具Commview,Iris分析 s协议,SSL连接建立过程中,数据包交换情况.数据包分析过程用到

3、的几个图.图,SSL Protocol Stack图.SSL Record Format图.SSL Record Protocol Payload图.Handshake Protocol Action它们来之.Cryptography and Network Security Principles and Practices,Fourth Edition-Chapter 17.Web Security-17.2.Secure Socket Layer and Transport Layer Security密码学与网络平安原理与理论第四版,17章web平安,17.2节,SSL与TLS详细细节参

4、考本书.下面跟踪握手过程图Handshake Protocol Action中,数据包的交换.以为 s方式访问 sun 为例子,一般大型公司,银行的web都支持 s访问,如工商银行,sun,微软,IBM.在IE中输入: s:/w sun ,因为这是 s协议,所以在实际访问web前,会建立SSL连接.通过Commview抓包工具,过滤443端口一般情况下, S使用端口443, 使用端口80可以得到数据包.数据包大致情况和图Handshake Protocol Action对应.SSL连接建立过程分析11.应用程序接口1.1 SSL初始化SSL_CTX*InitSSLint server,char

5、*cert,char*key,char*pwSSL_CTX*ctx;SSL_METHOD*meth;int status;/算法初始化/加载SSL错误信息SSL_load_error_strings;/添加SSL的加密/HASH算法SSLeay_add_ssl_algorithms;/效劳器还是客户端Ifservermeth=SSLv23_server_method;else meth=SSLv23_client_method;/建立新的SSL上下文ctx=SSL_CTX_newmeth;if!ctxreturn NULL;/设置证书文件的口令SSL_CTX_set_default_passw

6、d_cb_userdatactx,pw;/加载本地证书文件status=SSL_CTX_use_certificate_filectx,cert,SSL_FILETYPE_ASN1;ifstatus=0frintfstderr,"Use cert fail,status=%dn",status;goto bad;/加载私钥文件ifSSL_CTX_use_PrivateKey_filectx,key,SSL_FILETYPE_PEM=0fprintfstderr,"Use private key failn";goto bad;/检查证书和私钥是否匹配if

7、!SSL_CTX_check_private_keyctxfprintf"Private key does not match the certificate public keyn";goto bad;fprintf"Cert and key OKn";return ctx;bad:SSL_CTX_freectx;return NULL;1.2建立SSL新连接效劳器:/建立SSL ssl=SSL_newctx;/将SSL与TCP socket连接SSL_set_fdssl,sd;/承受新SSL连接err=SSL_acceptssl;客户端:/建立SSL

8、 ssl=SSL_newctx;/将SSL与TCP socket连接SSL_set_fdssl,sd;/SSL连接err=SSL_connectssl;效劳器的SSL_accept和客户端的SSL_connect函数共同完成SSL的握手协商过程。1.3 SSL通信和普通的read/write调用一样,用下面的函数完成数据的SSL发送和接收,函数输入数据是明文,SSL自动将数据封装进SSL中:读/接收:SSL_read写/发送:SSL_write1.4 SSL释放SSL释放很简单:SSL_freessl;2.SSL实现分析以下SSL源代码取自openssl-0.9.7b。2.1 SSL_load

9、_error_strings该函数加载错误字符串信息:void SSL_load_error_stringsvoid#ifndef OPENSSL_NO_ERR ERR_load_crypto_strings;ERR_load_SSL_strings;#endif最后将会进入函数:static void err_load_stringsint lib,ERR_STRING_DATA*strwhilestr-errorstr-error|=ERR_PACKlib,0,0;ERRFNerr_set_itemstr;str+;其中:#define ERR_PACKl,f,runsigned long

10、l&0xffL*0x 1000000|unsigned longf&0xfffL*0x1000|unsigned longr&0xfffL#define ERRFNaerr_fns-cb_#aERRFNerr_set_itemstr的实际函数实现为:static ERR_STRING_DATA*int_err_set_itemERR_STRING_DATA*dERR_STRING_DATA*p;LHASH*hash;err_fns_check;hash=ERRFNerr_get1;if!hashreturn NULL;CRYPTO_w_lockCRYPTO_LOCK_E

11、RR;p=ERR_STRING_DATA*lh_inserthash,d;CRYPTO_w_unlockCRYPTO_LOCK_ERR;return p;Lh_insert将错误信息插入到一个链表中如关于加密算法的错误信息:static ERR_STRING_DATA ERR_str_functs=static ERR_STRING_DATA ERR_str_libraries=static ERR_STRING_DATA ERR_str_reasons=2.2 SSLeay_add_ssl_algorithms这实际是个宏:#define OpenSSL_add_ssl_algorithms

12、SSL_library_init#define SSLeay_add_ssl_algorithmsSSL_library_init实际函数为SSL_library_init,函数比较简单,就是加载各种加密和HASH算法:int SSL_library_initvoid#ifndef OPENSSL_NO_DES EVP_add_cipherEVP_des_cbc;EVP_add_cipherEVP_des_ede3_cbc;#endif#ifndef OPENSSL_NO_IDEA EVP_add_cipherEVP_idea_cbc;#endif#ifndef OPENSSL_NO_RC4

13、EVP_add_cipherEVP_rc4;#endif#ifndef OPENSSL_NO_RC2 EVP_add_cipherEVP_rc2_cbc;#endif#ifndef OPENSSL_NO_AES EVP_add_cipherEVP_aes_128_cbc;EVP_add_cipherEVP_aes_192_cbc;EVP_add_cipherEVP_aes_256_cbc;#endif#ifndef OPENSSL_NO_MD2 EVP_add_digestEVP_md2;#endif#ifndef OPENSSL_NO_MD5 EVP_add_digestEVP_md5;EV

14、P_add_digest_aliasSN_md5,"ssl2-md5";EVP_add_digest_aliasSN_md5,"ssl3-md5";#endif#ifndef OPENSSL_NO_SHA EVP_add_digestEVP_sha1;EVP_add_digest_aliasSN_sha1,"ssl3-sha1";EVP_add_digest_aliasSN_sha1WithRSAEncryption,SN_sha1WithRSA;#endif#if!definedOPENSSL_NO_SHA&&!de

15、finedOPENSSL_NO_DSAEVP_add_digestEVP_dss1;EVP_add_digest_aliasSN_dsaWithSHA1,SN_dsaWithSHA1_2;EVP_add_digest_aliasSN_dsaWithSHA1,"DSS1";EVP_add_digest_aliasSN_dsaWithSHA1,"dss1";#endif#if 0EVP_add_digestEVP_sha;EVP_add_digestEVP_dss;#endif return1;2.3 SSL23_server_method建立效劳器端的方法

16、库,这是个通用函数,可动态选择SSL协议。假设想固定协议,可以只用SSLv2_server_method,SSLv3_server_method等函数来初始化,该函数返回一个SSL_METHOD构造:typedef struct ssl_method_stint version;/版本号int*ssl_newSSL*s;/建立新SSL void*ssl_clearSSL*s;/去除SSL void*ssl_freeSSL*s;/释放SSL int*ssl_acceptSSL*s;/效劳器承受SSL连接int*ssl_connectSSL*s;/客户端的SSL连接int*ssl_readSSL*

17、s,void*buf,int len;/SSL读int*ssl_peekSSL*s,void*buf,int len;/SSL查看数据int*ssl_writeSSL*s,const void*buf,int len;/SSL写int*ssl_shutdownSSL*s;/SSL半关闭int*ssl_renegotiateSSL*s;/SSL重协商int*ssl_renegotiate_checkSSL*s;/SSL重协商检查long*ssl_ctrlSSL*s,int cmd,long larg,void*parg;/SSL控制long*ssl_ctx_ctrlSSL_CTX*ctx,int

18、 cmd,long larg,void*parg;/SSL上下文控制SSL_CIPHER*get_cipher_by_charconst unsigned char*ptr;/通过名称获取SSL的算法int*put_cipher_by_charconst SSL_CIPHER*cipher,unsigned char*ptr;int*ssl_pendingSSL*s;int*num_ciphersvoid;/算法数SSL_CIPHER*get_cipherunsigned ncipher;/获取算法struct ssl_method_st*get_ssl_methodint version;l

19、ong*get_timeoutvoid;/超时struct ssl3_enc_method*ssl3_enc;/SSL3加密int*ssl_version;/SSL版本long*ssl_callback_ctrlSSL*s,int cb_id,void*fp;/SSL控制回调函数long*ssl_ctx_callback_ctrlSSL_CTX*s,int cb_id,void*fp;/SSL上下文控制回调函数SSL_METHOD;SSL_METHOD*SSLv23_server_methodvoidstatic int init=1;/静态量,每个进程只初始化一次static SSL_MET

20、HOD SSLv23_server_data;ifinitCRYPTO_w_lockCRYPTO_LOCK_SSL_METHOD;ifinit/ssl23的根本方法构造memcpychar*&SSLv23_server_data,char*sslv23_base_method,sizeofSSL_METHOD;/效劳器,所以要定义accept方法SSLv23_server_data.ssl_accept=ssl23_accept;/根据SSL的版本设置SSL的详细方法函数SSLv23_server_data.get_ssl_method=ssl23_get_server_method;

21、init=0;CRYPTO_w_unlockCRYPTO_LOCK_SSL_METHOD;return&SSLv23_server_data;static SSL_METHOD*ssl23_get_server_methodint ver#ifndef OPENSSL_NO_SSL2 ifver=SSL2_VERSIONreturnSSLv2_server_method;#endif ifver=SSL3_VERSIONreturnSSLv3_server_method;else ifver=TLS1_VERSIONreturnTLSv1_server_method;/随着TLS1.1

22、RFC4346的推出,估计不久将出现TLSv1_1_server_methodelse returnNULL;/SSL23的方法根本数据定义SSL_METHOD*sslv23_base_methodvoidreturn&SSLv23_data;static SSL_METHOD SSLv23_data=TLS1_VERSION,tls1_new,tls1_clear,tls1_free,ssl_undefined_function,ssl_undefined_function,ssl23_read,ssl23_peek,ssl23_write,ssl_undefined_functio

23、n,ssl_undefined_function,ssl_ok,ssl3_ctrl,ssl3_ctx_ctrl,ssl23_get_cipher_by_char,ssl23_put_cipher_by_char,ssl_undefined_function,ssl23_num_ciphers,ssl23_get_cipher,ssl_bad_method,ssl23_default_timeout,&ssl3_undef_enc_method,ssl_undefined_function,ssl3_callback_ctrl,ssl3_ctx_callback_ctrl,;以SSL3的

24、效劳器方法函数为例,其他方法类似:SSL_METHOD*SSLv3_server_methodvoidstatic int init=1;static SSL_METHOD SSLv3_server_data;/只初始化一次ifinitCRYPTO_w_lockCRYPTO_LOCK_SSL_METHOD;ifinit/ssl3的根本方法构造memcpychar*&SSLv3_server_data,char*sslv3_base_method,sizeofSSL_METHOD;/ssl3的承受方法SSLv3_server_data.ssl_accept=ssl3_accept;/ss

25、l3获取效劳器的方法函数SSLv3_server_data.get_ssl_method=ssl3_get_server_method;init=0;CRYPTO_w_unlockCRYPTO_LOCK_SSL_METHOD;return&SSLv3_server_data;/SSL3的方法根本数据定义static SSL_METHOD SSLv3_data=SSL3_VERSION,ssl3_new,ssl3_clear,ssl3_free,ssl_undefined_function,ssl_undefined_function,ssl3_read,ssl3_peek,ssl3_w

26、rite,ssl3_shutdown,ssl3_renegotiate,ssl3_renegotiate_check,ssl3_ctrl,ssl3_ctx_ctrl,ssl3_get_cipher_by_char,ssl3_put_cipher_by_char,ssl3_pending,ssl3_num_ciphers,ssl3_get_cipher,ssl_bad_method,ssl3_default_timeout,&SSLv3_enc_data,ssl_undefined_function,ssl3_callback_ctrl,ssl3_ctx_callback_ctrl,;2

27、.4 SSL23_client_method和效劳器端的其实是一样的,只是不定义构造中的ssl_accept而是定义ssl_connnect:SSL_METHOD*SSLv23_client_methodvoidstatic int init=1;static SSL_METHOD SSLv23_client_data;ifinitCRYPTO_w_lockCRYPTO_LOCK_SSL_METHOD;ifinitmemcpychar*&SSLv23_client_data,char*sslv23_base_method,sizeofSSL_METHOD;SSLv23_client_d

28、ata.ssl_connect=ssl23_connect;SSLv23_client_data.get_ssl_method=ssl23_get_client_method;init=0;CRYPTO_w_unlockCRYPTO_LOCK_SSL_METHOD;return&SSLv23_client_data;2.5 SSL_CTX_new该函数根据SSL方法获取一个SSL上下文构造,该构造定义为:struct ssl_ctx_stSSL_METHOD*method;STACK_OFSSL_CIPHER*cipher_list;STACK_OFSSL_CIPHER*cipher_

29、list_by_id;struct x509_store_st*cert_store;struct lhash_st*sessions;unsigned long session_cache_size;struct ssl_session_st*session_cache_head;struct ssl_session_st*session_cache_tail;int session_cache_mode;long session_timeout;int*new_session_cbstruct ssl_st*ssl,SSL_SESSION*sess;void*remove_session_

30、cbstruct ssl_ctx_st*ctx,SSL_SESSION*sess;SSL_SESSION*get_session_cbstruct ssl_st*ssl,unsigned char*data,int len,int*copy;structint sess_connect;int sess_connect_renegotiate;int sess_connect_good;int sess_accept;int sess_accept_renegotiate;int sess_accept_good;int sess_miss;int sess_timeout;int sess_

31、cache_full;int sess_hit;int sess_cb_hit;stats;int references;int*app_verify_callbackX509_STORE_CTX*,void*;void*app_verify_arg;pem_password_cb*default_passwd_callback;void*default_passwd_callback_userdata;int*client_cert_cbSSL*ssl,X509*x509,EVP_PKEY*pkey;CRYPTO_EX_DATA ex_data;const EVP_MD*rsa_md5;co

32、nst EVP_MD*md5;const EVP_MD*sha1;STACK_OFX509*extra_certs;STACK_OFSSL_COMP*comp_methods;void*info_callbackconst SSL*ssl,int type,int val;STACK_OFX509_NAME*client_CA;unsigned long options;unsigned long mode;long max_cert_list;struct cert_st*cert;int read_ahead;void*msg_callbackint write_p,int version

33、,int content_type,const void*buf,size_t len,SSL*ssl,void*arg;void*msg_callback_arg;int verify_mode;int verify_depth;unsigned int sid_ctx_length;unsigned char sid_ctxSSL_MAX_SID_CTX_LENGTH;int*default_verify_callbackint ok,X509_STORE_CTX*ctx;GEN_SESSION_CB generate_session_id;int purpose;int trust;in

34、t quiet_shutdown;typedef struct ssl_ctx_st SSL_CTX;SSL_CTX*SSL_CTX_newSSL_METHOD*methSSL_CTX*ret=NULL;ifmeth=NULLSSLerrSSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED;returnNULL;ifSSL_get_ex_data_X509_STORE_CTX_idx0SSLerrSSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS;goto err;/分配上下文的内存空间ret

35、=SSL_CTX*OPENSSL_mallocsizeofSSL_CTX;ifret=NULLgoto err;memsetret,0,sizeofSSL_CTX;/初始化上下文的构造参数ret-method=meth;ret-cert_store=NULL;ret-session_cache_mode=SSL_SESS_CACHE_SERVER;ret-session_cache_size=SSL_SESSION_CACHE_MAX_SIZE_DEFAULT;ret-session_cache_head=NULL;ret-session_cache_tail=NULL;ret-session

36、_timeout=meth-get_timeout;ret-new_session_cb=0;ret-remove_session_cb=0;ret-get_session_cb=0;ret-generate_session_id=0;memsetchar*&ret-stats,0,sizeofret-stats;ret-references=1;ret-quiet_shutdown=0;ret-info_callback=NULL;ret-app_verify_callback=0;ret-app_verify_arg=NULL;ret-max_cert_list=SSL_MAX_CERT_LIST_DEFAULT;ret-read_ahead=0;ret-msg_callback=0;ret-msg_callback_arg=NULL;ret-verify_mode=SSL_VERIFY_NONE;ret-verify_depth=-1;ret-sid_ctx_length=0;ret-default_verify_callback=NULL;ifret-cert=ssl_cert_new=NULLgoto err;ret-default_passwd_callback=0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论