免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1977 | 回复: 1
打印 上一主题 下一主题

Linux安全体系学习笔记之三:OpenSSL源代码分析(2) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-27 22:12 |只看该作者 |倒序浏览

Linux安全体系学习笔记之三:OpenSSL源代码分析(2)








SSL工作方式:双向证书认证的SSL握手过程。
以下简要介绍SSL协议的工作方式。客户端要收发几个握手信号:
1、发送一个“ClientHello”消息,说明它支持的密码算法列表、压缩方法及最高协议版本,也发送稍后将被使用的随机数。
2、然后收到一个“ServerHello”消息,包含服务器选择的连接参数,源自客户端初期所提供的“ClientHello”。
3、当双方知道了连接参数,客户端与服务器交换证书(依靠被选择的公钥系统)。这些证书通常基于X.509,不过已有草案支持以OpenPGP为基础的证书。
4、服务器请求客户端公钥。客户端有证书即双向身份认证,没证书时随机生成公钥。
5、客户端与服务器通过公钥保密协商共同的主私钥(双方随机协商),这通过精心谨慎设计的伪随机数功能实现。结果可能使用Diffie-Hellman交换,或简化的公钥加密,双方各自用私钥解密。所有其他关键数据的加密均使用这个“主密钥”。

数据传输中记录层(Record layer)用于封装更高层的HTTP等协议。记录层数据可以被随意压缩、加密,与消息验证码压缩在一起。每个记录层包都有一个Content-Type段用以记录更上层用的协议。

使用SSL层接口函数有以下几个步骤:

1、初始化OpenSSL库

初始化函数列出如下:
  1. #define OpenSSL_add_ssl_algorithms()SSL_library_init()
  2. #define SSLeay_add_ssl_algorithms()  SSL_library_init()
复制代码
2、选择会话协议

客户端使用下面的函数选择会话协议:
  1. const SSL_METHOD *SSLv2_client_method(void);/* SSLv2 */


  2. const SSL_METHOD *SSLv3_client_method(void);/* SSLv3 */


  3. const SSL_METHOD *SSLv23_client_method(void);/* SSLv3 but can rollback to v2 */


  4. const SSL_METHOD *TLSv1_client_method(void);/* TLSv1.0 */


  5. const SSL_METHOD *DTLSv1_client_method(void);/* DTLSv1.0 */
复制代码
服务器端使用下面的函数选择会话协议:

  1. const SSL_METHOD *SSLv2_server_method(void);/* SSLv2 */
  2. const SSL_METHOD *SSLv3_server_method(void);  /* SSLv3 */
  3. const SSL_METHOD *SSLv23_server_method(void);  /* SSLv3 but can rollback to v2 */
  4. const SSL_METHOD *TLSv1_server_method(void);  /* TLSv1.0 */
  5. const SSL_METHOD *DTLSv1_server_method(void);  /* DTLSv1.0 */
复制代码
3、创建会话环境

创建会话环境:
  1. SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth);
复制代码
设置证书验证方式:
  1. void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,
  2. int (*callback)(int, X509_STORE_CTX *));
复制代码
给会话环境加载CA证书:
  1. int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x);
  2. int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, const unsigned char *d);
复制代码
给会话环境加载用户私钥:
  1. int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey);
  2. int SSL_CTX_use_PrivateKey_ASN1(int pk,SSL_CTX *ctx,
  3. const unsigned char *d, long len);
复制代码
验证私钥和证书是否相符:
  1. int SSL_CTX_check_private_key(const SSL_CTX *ctx);
复制代码
4、建立SSL套接字

SSL套接字建立在普通的TCP套接字基础上,应用程序在创建普通套接字、得到套接字描述符fd之后,再创建SSL套接字,并将fd绑定在SSL套接字上。
  1. SSL *SSL_new(SSL_CTX *ctx);


  2. intSSL_set_fd(SSL *s, int fd);
  3. int  SSL_set_rfd(SSL *s, int fd);
  4. int  SSL_set_wfd(SSL *s, int fd);
复制代码
5、完成SSL握手

与普通socket编程类似,创建SSL套接字后,客户端使用SSL_connect替代普通socket的connect函数,服务器端则以SSL_accept代替普通socket的accept()函数。
  1. int
  2. SSL_accept(SSL *ssl);
  3. int SSL_connect(SSL *ssl);
复制代码
握手完成之后,询问通信双方的证书信息:
  1. X509 *SSL_get_peer_certificate(const SSL *s);


  2. X509_NAME *X509_get_subject_name(X509 *a);  // <openssl/x509.h>
复制代码
6、数据传输

对数据的安全传输包括了加密/解密、压缩/解压缩的过程。
  1. int
  2. SSL_read(SSL *ssl,void *buf,int num);
  3. int SSL_peek(SSL *ssl,void *buf,int num);
  4. int SSL_write(SSL *ssl,const void *buf,int num);
复制代码
7、SSL通信结束

关闭SSL套接字、释放会话环境。
  1. int SSL_shutdown(SSL *s);

  2. voidSSL_free(SSL *ssl);


  3. voidSSL_CTX_free(SSL_CTX *);
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-12-27 22:14 |只看该作者
谢谢博主
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP