openssl中证书加载过程

首先看SSL_CTX的结构中跟证书相关的字段(其实结构里面的内容非常多)

 

 

struct ssl_ctx_st
{
    struct x509_store_st /* X509_STORE */ *cert_store;
    STACK_OF(X509_NAME) *client_CA;
    struct cert_st /* CERT */ *cert;

    STACK_OF(X509_LOOKUP) *get_cert_methods; //获取证书的方法,根据是指明文件名,还是文件路径来加载具体的函数。
}


其中cert_store里面存放的是CA和CRL x509对象;client_CA中加载的签约终端证书CA的subjectName字段名;cert中存在的则是一对密钥了,结构分别为x509和EVP_PKEY。

加载证书的函数:


int X509_STORE_load_locations(X509_STORE *ctx, const char *file,
        const char *path)
    {
    X509_LOOKUP *lookup;

    if (file != NULL)
        {
        lookup=X509_STORE_add_lookup(ctx,X509_LOOKUP_file());
        if (lookup == NULL) return(0);
        if (X509_LOOKUP_load_file(lookup,file,X509_FILETYPE_PEM) != 1)
            return(0);
        }

第一个参数就是我们要保存CA等证书的结构,第二个参数指明CA文件的名称,第三个参数指明的是CA文件的路径,这里以第二个加载指定CA文件名为例。

如果第二个参数不为NULL,那么首先给ctx增加一个X509_LOOKUP_METHOD方法,选择的方法是放入ctx的get_cert_methods方法栈中保存。这里为加载单个文件,所以返回的X509_LOOKUP_METHOD的ctrl(用以读取证书文件)指向了这样一个函数:

static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
         char **ret)

然后就是正式的用选定的方法读取证书文件了。
(X509_LOOKUP_load_file(lookup,file,X509_FILETYPE_PEM)
默认读取的都是X509_FILETYPE_PEM格式,这里说一下X509_FILETYPE_PEM格式文件中可以包含多个证书,但是X509_FILETYPE_ASN1却只能包含一个。


下面再看看cert_store的结构:
struct x509_store_st
    {
    /* The following is a cache of trusted certs */
    int cache;     /* if true, stash any hits */
    STACK_OF(X509_OBJECT) *objs;    /* Cache of all objects */

    /* These are external lookup methods */
    STACK_OF(X509_LOOKUP) *get_cert_methods;

    X509_VERIFY_PARAM *param;

    /* Callbacks for various operations */
    int (*verify)(X509_STORE_CTX *ctx);    /* called to verify a certificate */
    int (*verify_cb)(int ok,X509_STORE_CTX *ctx);    /* error callback */
    int (*get_issuer)(X509 **issuer, X509_STORE_CTX *ctx, X509 *x);    /* get issuers cert from ctx */
    int (*check_issued)(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); /* check issued */
    int (*check_revocation)(X509_STORE_CTX *ctx); /* Check revocation status of chain */
    int (*get_crl)(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); /* retrieve CRL */
    int (*check_crl)(X509_STORE_CTX *ctx, X509_CRL *crl); /* Check CRL validity */
    int (*cert_crl)(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); /* Check certificate against CRL */
    int (*cleanup)(X509_STORE_CTX *ctx);

    CRYPTO_EX_DATA ex_data;
    int references;
    } /* X509_STORE */;

在校验证书的时候就是用到的上述结构。

你可能感兴趣的:(OpenSSL)