zoukankan      html  css  js  c++  java
  • OpenSSL X509 Funtion

    OpenSSL X509 Funtion

    来源:https://blog.csdn.net/wanjie518/article/details/6570141

    现有的证书大都采用X509规范, 主要同以下信息组成:版本号、证书序列号、有效期、拥有者信息、颁发者信息、其他扩展信息、拥有者的公钥、CA对以上信息的签名。

    OpenSSL实现了对X509数字证书的所有操作。包括签发数字证书、解析和验证证书等。

    涉及证书操作的主要函数有验证证书(验证证书链、有效期、CRL)、解析证书(获得证书的版本、序列号、颁发者信息、主题信息、公钥、有效期等)
    主要函数

    1、DER编码转换为内部结构函数
    X509 *d2i_X509(X509 **cert, unsigned char **d, int len);
    函数功能:把一个DER编码的证书数据转化成OpenSSL内部结构体。
    参数:cert:[OUT]X509结构体。 D:[IN]DER编码的证书数据指针地址。Len[IN]证书数据长度;
    返回值:编码后的X509结构体数据

    2、获得证书版本函数X509_get_version
    #define X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version)
    参数:x:[IN]X509*结构体数据结构。
    返回值:证书版本,数据类型“LONG”

    3、获得证书序列号函数
    ASN1_INTEGER *X509_get_serialNumber(X509 *x);
    返回值:证书序列号,数据类型“ASN1_INTEGER”.

    4、获得证书颁发者信息函数
    X509_NAME *X509_get_issuer_name(X509 *a);
    注*:X509_NAME结构体包括多个X509_NAME_ENTRY结构体。X509_NAME_ENTRY保存了颁发者的信息,这些信息包括对象和值(object 和value)。对象的类型包括国家、通用名、单位、组织、地区、邮件等。

    5、获得证书拥有者信息函数
    X509_NAME *X509_get_subject_name(X509 *a);

    6、获得证书有效期的起始日期函数
    #define X509_get_notBefore(x) ((x)->cert_info->validity->notBefore)
    返回值: 证书起始有效期,数据类型“ASN1_TIME”

    7、获得证书有效期的终止日期函数
    #define X509_get_notAfter(x) ((x)->cert_info->validity->notAfter)

    8、获得证书公钥函数
    EVP_PKEY *X509_get_pubkey(X509 *x);

    9、创建和释放证书存储区
    X509_STORE *X509_STORE_new(void);
    Void X509_STORE_free(X509_STORE *v);
    函数功能:创建和释放一个X509_STORE结构体, 主要用于验证证书。

    10、向证书存储区添加证书
    Int X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
    函数功能:添加信任的根证书到证书存储区。
    返回值:1成功,否则为0

    11、向证书存储区添加证书吊销列表
    Int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x);
    功能:添加CRL到证书存储区。
    参数:x:[IN]证书吊销列表。Ctx:[IN]证书存储区。
    返回值:1成功, 否则为0。

    12、创建证书存储区上下文环境函数
    X509_STORE_CTX *X509_STORE_CTX_new(void);
    返回值:操作成功返回证书存储区上下文环境指针,否则返回NULL。

    13、释放证书存储区上下文环境
    Void X509_STORE_CTX_free(X509_STORE_CTX *ctx);

    14、初始化证书存储区上下文环境函数
    Int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, STACK_OF(X509) *chain);
    函数功能:初始化证书存储区上下文环境,设置根证书、待验证的证书、CA证书链。

    15、验证证书函数
    Int X509_verify_cert(X509_STORE_CTX *ctx);
    返回值:验证成功返回1,否则返回0

    在进行身份认证时,首先要对发送给服务器进行认证的x509证书有效性进行验证,在Openssl中,可以用一个API接口可以实现:int X509_verify_cert(X509_STORE_CTX *ctx);

    接口中形参是X509_STORE_CTX(X509证书库上下文)类型,在X509证书库上下文中,存在一个X509证书库和一个待验证的X509证书,可以加入信任的证书链,也可以加入CRL证书链(证书撤销列表)~

    对X509证书有效性进行验证可以由以下几个函数来完成~

    X509_STORE_CTX *ctx; //证书上下文
    X509_STORE *cert_store; //证书库,存在证书链
    X509* x509; //待验证X509证书
    ctx = X509_STORE_CTX_new();

    X509_STORE_CTX_init(ctx,cert_store,x509,NULL);

    X509_verify_cert(ctx);//根据返回值可以确认X509证书是否有效,也可以根据X509_STORE_CTX_get_error和X509_verify_cert_error_string函数来确认无效原因  
    //确定在cert_store中存在根证书 ,如果不存在则会出现certificate signature failture,可以使用X509_STORE_get_by_subject查看是否在证书库中存在某证书

    参考 https://blog.csdn.net/liao20081228/category_7058952.html

    https://github.com/z0x010/rdesktop/blob/d20e6f496c15fdf121b89886711ab7157f026933/rdpproxy/trunk/x509test.c

    https://github.com/CTSRD-TESLA/TESLA/blob/77d80afab1d3ed32403c9581847c0f927912ae08/demos/openssl-api/openssl-api.c

    https://github.com/nthien/pulp/blob/f8c9aa19eea3dd9478fdace778f651691d4d4818/playpen/certs/chain_example/c_api_examples/cert_validation.c

    https://github.com/jwmatthews/ssl_cert_scripts/blob/df833c74e76ec8cdc8769a2c883a3d5e10620b43/chain_example/c_api_examples/cert_validation.c

    =========== End

     
  • 相关阅读:
    VMware80端口映射
    固态硬盘安装win7系统问题。
    正向代理服务器,反向代理服务器
    Oray.com花生壳路由器配置注意
    Nginx命令
    Nginx反向代理图片总结
    C#获取视频文件播放长度
    汉语拼音的发展
    MVC 公共类App_Code不识别
    记录一下学习Android的小知识
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/11937227.html
Copyright © 2011-2022 走看看