2007年6月29日星期五

SSL连接建立过程分析(1)

SSL连接建立过程分析(1)
 
本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn
 
1. 应用程序接口
1.1 SSL初始化
SSL_CTX* InitSSL(int server, char *cert, char *key, char *pw)
{
    SSL_CTX* ctx;
    SSL_METHOD *meth;
    int status;
// 算法初始化  
// 加载SSL错误信息
    SSL_load_error_strings();
// 添加SSL的加密/HASH算法
    SSLeay_add_ssl_algorithms();
// 服务器还是客户端
    If(server)
 meth = SSLv23_server_method();
    else
 meth = SSLv23_client_method();
// 建立新的SSL上下文
    ctx = SSL_CTX_new (meth);
    if(!ctx) return NULL;
// 设置证书文件的口令
    SSL_CTX_set_default_passwd_cb_userdata(ctx, pw);
//加载本地证书文件
    status=SSL_CTX_use_certificate_file(ctx, cert, SSL_FILETYPE_ASN1);
    if (status <= 0) {
        frintf(stderr, "Use cert fail, status=%d\n", status);
        goto bad;
    }
// 加载私钥文件
    if (SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM) <= 0) {
        fprintf(stderr, "Use private key fail\n");
        goto bad;
    }
// 检查证书和私钥是否匹配
    if (!SSL_CTX_check_private_key(ctx)) {
        fprintf("Private key does not match the certificate public key\n");
        goto bad;
    }
    fprintf("Cert and key OK\n");
    return ctx;
bad:
    SSL_CTX_free (ctx);
    return NULL;
}
1.2 建立SSL新连接
服务器:
// 建立SSL
ssl = SSL_new (ctx);
// 将SSL与TCP socket连接
SSL_set_fd (ssl, sd);
//接受新SSL连接
err = SSL_accept (ssl);
客户端:
// 建立SSL
ssl = SSL_new (ctx);
// 将SSL与TCP socket连接
SSL_set_fd (ssl, sd);
// SSL连接
err = SSL_connect (ssl);

服务器的SSL_accept()和客户端的SSL_connect()函数共同完成SSL的握手协商过程。
 
1.3 SSL通信
和普通的read()/write()调用一样,用下面的函数完成数据的SSL发送和接收,函数输入数据是明文,SSL自动将数据封装进SSL中:
读/接收:SSL_read()
写/发送:SSL_write()
1.4 SSL释放
SSL释放很简单:
 SSL_free (ssl);
 
2. SSL实现分析
以下SSL源代码取自openssl-0.9.7b。

2.1 SSL_load_error_strings
该函数加载错误字符串信息:
void SSL_load_error_strings(void)
 {
#ifndef OPENSSL_NO_ERR
 ERR_load_crypto_strings();
 ERR_load_SSL_strings();

1 条评论:

匿名 说...

mesothelioma support and information!
[url=http://www.mesothelioma-support.org/]asbestos lawsuit[/url]