2009年05月22日

SSL_library_init();
SSL的初始化过程,只是添加一些算法,使用EVP_add_cipher函数。

ssl_method = SSLv3_client_method();
设置使用的SSL版本,SSLv3_client_method 函数的定义是通过IMPLEMENT_ssl3_meth_func(ssl/s3_clnt.c)这个宏来实现,而这个宏在ssl/ssl_locl.h 文件中实现,使用了粘贴宏的技巧来根据传入不同的函数名生成不同的函数定义。
SSLv3_client_method 定义了一组关于SSL V3的操作函数:

C:
  1. static SSL_METHOD func_name##_data= {
  2.         SSL3_VERSION,
  3.         ssl3_new,
  4.         ssl3_clear,
  5.         ssl3_free,
  6.         s_accept,
  7.         s_connect,
  8.         ssl3_read,
  9.         ssl3_peek,
  10.         ssl3_write,
  11.         ssl3_shutdown,
  12.         ssl3_renegotiate,
  13.         ssl3_renegotiate_check,
  14.         ssl3_get_message,
  15.         ssl3_read_bytes,
  16.         ssl3_write_bytes,
  17.         ssl3_dispatch_alert,
  18.         ssl3_ctrl,
  19.         ssl3_ctx_ctrl,
  20.         ssl3_get_cipher_by_char,
  21.         ssl3_put_cipher_by_char,
  22.         ssl3_pending,
  23.         ssl3_num_ciphers,
  24.         ssl3_get_cipher,
  25.         s_get_meth,
  26.         ssl3_default_timeout,
  27.         &SSLv3_enc_data,
  28.         ssl_undefined_void_function,
  29.         ssl3_callback_ctrl,
  30.         ssl3_ctx_callback_ctrl,
  31.     };

SSL_CTX = SSL_CTX_new(ssl_method);
创建SSL_CTX这个结构体,进行初始化赋值操作,设置一些参数,使用默认的engine。的engine是对基础的加密算法进行了封装,这样可以方便的对底层的加密算法进行替换,例如你可能使用硬件加密来替换掉的软实现加密算法,而你所做的只是按照engine的接口实现相关的算法,然后设置engine的名字。例如U-KEY的RSA签名必须在硬件中完成,这时你就可以通过engine调用CSP来实现签名算法。

SSL_CTX_use_certificate_file(SSL_CTX,"client.cer",SSL_FILETYPE_PEM)
设置客户端使用的证书,从文件中读取BASE64(SSL_FILETYPE_PEM这个参数指定)编码的证书,然后转换为 的X509结构,提取公钥,设置SSL_CTX相关的结构。

SSL_CTX_use_PrivateKey_file(SSL_CTX, "client.key", SSL_FILETYPE_PEM)
设置客户端使用的私钥,这种方式也是直接从文件中读取,更安全的方式是使用SSL_CTX_use_RSAPrivateKey(SSL_CTX, RSA),RSA是一个包含了RSA算法相关数据的结构体,这里定义了RSA算法相关的操作,在这里可以把私钥相关的算法操作使用自己的CSP来完成,而不是直接使用私钥完成。

SSL = SSL_new(SSL_CTX);
创建SSL 这个复杂的结构体。太多了,就不细说了。

SSL_set_fd(SSL, sock_fd);
设置连接使用的socket的fd,我们要做的socket操作只是得到这个fd,read,write操作将由来完成。

SSL_connect(SSL);
这个函数将根据前面设置的SSL版本来进行相应的连接操作。

server_cert = SSL_get_peer_certificate(SSL);
得到服务器端的证书,下来可能要做一些服务器证书的验证,这里就省略了。

X509_free(server_cert);
SSL_write();
SSL_read();
接下来的操作就很好理解了.

http://code.google.com/p/cocobear/source/browse/trunk/openssl/openssl_test.cpp

上面写了一代简单的进行通信的代码,在Win和Linux下都可以运行,只是在socket操作有一点点的差异。

标签 :

随机日志

4 楼了已经

  • Kermit写于09年05月22日

    你要专攻安全领域了?

  • 可可熊写于09年05月22日

    工作需要嘛。

  • crazyfranc写于09年05月23日

    GG啊,看你对ssl和u—key这么有研究,你可以来应聘sinfor的移动应用部门了。那边老大和我是哥们儿~

  • 可可熊写于09年05月26日

    你们做这一块吗?

发表评论

在下面加入你的评论,或者 trackback 从你的博客站点。 订阅本文的评论。

:

:

:

«
»