SSL连接建立过程

来源:互联网 发布:js radio 无法选中 编辑:程序博客网 时间:2024/04/26 23:23

http://blog.chinaunix.net/uid-127037-id-2919489.html


本文档的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(); ------ 在ACE_SSL_Context::ACE_SSL_Context中
// 添加SSL的加密/HASH算法
    SSLeay_add_ssl_algorithms();   ------ 在ACE_SSL_Context::ACE_SSL_Context中
// 服务器还是客户端
    If(server)
 meth = SSLv23_server_method();  ------------ 在ACE_SSL_Context::check_context,ACE_SSL_Context::set_mode中,可以通过ACE_SSL_Context::instance()->load_trusted_ca等操作触发。
    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);
------------------- 在ACE_SSL_SOCK_Acceptor::ssl_accept 中,通过ACE_SSL_SOCK_Connector::connect调用。

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

原创粉丝点击