zoukankan      html  css  js  c++  java
  • openssl API网络通信

    1.本文是在别人的基础上,经过测试,大体总结的。操作环境ubuntu12和ubuntu14

    *****************************************************************************************
    "网络通信加密"
    头文件:
    #include <openssl/ssl.h>
    #include <openssl/err.h>

    OpenSSL流程和函数介绍

    1.ssl库的初始化
    int SSL_Library_init (void);

    2.载入ssl所有的算法
    void OpenSSL_add_all_algorithms();

    3.载入ssl所有的错误信息
    void SSL_load_error_strings();

    4.选择会话协议
    在利用OpenSSL开始SSL会话之前,需要为客户端和服务器制定本次会话采用的协议,目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3。
    需要注意的是,客户端和服务器必须使用相互兼容的协议,否则SSL会话将无法正常进行。
    OpenSSL中一个会话的环境称为“ CTX ”,申请CTX的函数是; const SSL_METHOD *SSLv23_client_method (void);
    SSL_CTX *SSL_CTX_new (SSL_METHOD *method); //例如:SSL_CTX_new(SSLv23_server_method());

    5.加载用户私钥:
    1)有两种方式:私钥有密码, 私钥无密码
    int SSL_CTX_use_Private_file (SSL_CTX *ctx, const char *file, int type); //例如:SSL_CTX_use_PrivateKey_file(tmp_ctx, privateKey, SSL_FILETYPE_PEM)

    2)当私钥有密码时,获取私钥之前先把私钥的密码给写上
      char *pKeyPasswd="serve";
      SSL_CTX_set_default_passwd_cb_userdata(ctx, pKeyPasswd);
      SSL_CTX_use_PrivateKey_file(ctx,s_cert_file,SSL_FILETYPE_PEM);
     

    6.加载用户证书:
    int SSL_CTX_use_certificate_file (SSL_CTX *ctx, const char *file, int type); //例如:SSL_CTX_use_certificate_file(tmp_ctx, certificate, SSL_FILETYPE_PEM)

    7.验证私钥和证书是否相等
    int SSL_CTX_check_private_key (SSL_CTX *ctx);

    8.使用socket绑定SSL套接字:
    int SSL_set_fd (SSL *ssl, int fd);
    int SSL_set_rfd (SSL *ssl, int fd); // 只读
    int SSL_set_wfd (SSL *ssl, int fd); // 只写
    注意:上述三个函数成功时返回TRUE,失败时返回FALSE

    9.完成SSL握手
    int SSL_connect (SSL *ssl); // 用于client
    int SSL_accept (SSL *ssl); // 用于server

    10.从SSL套接字中提取对方的证书信息
    X509 *SSL_get_peer_certificate (SSL *ssl);

    11.获取证书所有者的名字:
    X509_NAME *X509_get_subject_name (X509 *a);

    12.数据传输
    int SSL_read (SSL *ssl, void *buf, int num);
    int SSL_write (SSL *ssl, const void *buf, int num);

    13.结束SSL通信
    关闭SSL套接字
    int SSL_shutdown (SSL *ssl);
    释放SSL套接字
    void SSL_free (SSL *ssl);
    释放SSL会话
    void SSL_CTX_free (SSL_CTX *ctx);

    14.注意:注意
    OpenSSL库中,各个函数的返回值的格式并不统一(有些用0表示失败,有些用0表示成功),请注意区分
    用在OpenSSL的fd 不能 设置为 nonblock ,否则在 SSL_connect 时会失败——感觉这一点限制了OpenSSL与除了 libevent 之外其他异步I/O库的适配


    *****************************************************************************************

  • 相关阅读:
    单链表
    白话经典算法系列之中的一个 冒泡排序的三种实现
    QoS令牌桶工作原理
    BackTrack5 (BT5)无线password破解教程之WPA/WPA2-PSK型无线password破解
    [Django] Base class in the model layer
    MATLAB中导入数据:importdata函数
    联想A798T刷机包 基于百度云V6 集成RE3.1.7美化版 精简冗余文件
    改动symbol link的owner
    利用HttpOnly来防御xss攻击
    【NOIP2014 普及组】螺旋矩阵
  • 原文地址:https://www.cnblogs.com/yyx1-1/p/6125779.html
Copyright © 2011-2022 走看看