如何将`X509 *`证书转换为`STACK_OF(X509_NAME)`

时间:2016-07-29 09:36:10

标签: openssl x509certificate

如何将X509 *证书转换为STACK_OF(X509_NAME)

需要将此STACK_OF(X509_NAME)传递给openssl api ENGINE_load_ssl_client_cert

1 个答案:

答案 0 :(得分:0)

  

我需要将STACK_OF(X509_NAME)传递给ENGINE_load_ssl_client_cert ...

你没有给我们太多的帮助。不清楚你的问题是什么,所以很难说你应该做些什么不同。

开始在<openssl src dir>/ssl/s3_clnt.c中跟踪OpenSSL的代码:

int ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey)
{
    int i = 0;
#ifndef OPENSSL_NO_ENGINE
    if (s->ctx->client_cert_engine) {
        i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s,
                                        SSL_get_client_CA_list(s),
                                        px509, ppkey, NULL, NULL, NULL);
        if (i != 0)
            return i;
    }
#endif
    if (s->ctx->client_cert_cb)
        i = s->ctx->client_cert_cb(s, px509, ppkey);
    return i;
}

如您所见,它需要一堆X509,而不是X509_NAME。我从未花费任何重要时间使用ENGINE代码,因此我不确定接下来会发生什么。

您可能也对OpenSSL wiki上的STACK API感兴趣。

最后,还有其他一些你可能感兴趣的点击。我很惊讶地看到其中一个应用中有没有点击。

$ grep -IR ENGINE_load_ssl_client_cert *
crypto/engine/eng_err.c:     "ENGINE_load_ssl_client_cert"},
crypto/engine/eng_pkey.c:int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s,
crypto/engine/engine.h:int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s,
ssl/s3_clnt.c:        i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s,
util/libeay.num:ENGINE_load_ssl_client_cert             4046    EXIST::FUNCTION:ENGINE