2

我有一个使用 OpenSSL 库的简单 SSL 客户端。我的服务器需要客户端身份验证,因此我必须设置存储在受密码保护的 PEM 文件中的客户端私钥。为此,我使用以下代码:

/* set the private key from KeyFile */
if (SSL_CTX_use_PrivateKey_file(ctx, KeyFile, SSL_FILETYPE_PEM) <= 0)
{
    ERR_print_errors_fp(stderr);
    abort();
}

/* verify private key */
if ( !SSL_CTX_check_private_key(ctx) )
{
    fprintf(stderr, "Private key does not match the public certificate\n");
    abort();
}

现在我想知道如何使用存储在安全令牌(使用 PKCS#11 接口)上的私钥而不是从文件中读取它来建立 SSL 连接?

4

1 回答 1

2

答案有点复杂。首先,您需要加载 PKCS#11 的引擎:

ENGINE_load_builtin_engines();
{
    if (!(e = ENGINE_by_id("dynamic")))
        goto err;
    if (!ENGINE_ctrl_cmd_string(e, "SO_PATH", "dstu", 0))
        goto err;
    if (!ENGINE_ctrl_cmd_string(e, "LIST_ADD", "2", 0))
        goto err;
    if (!ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0))
        goto err;
    e = ENGINE_by_id("pkcs11_engine");
    if (!e)
      return error;

res = ENGINE_init(e);
if (!ENGINE_set_default(e, ENGINE_METHOD_ALL))
    goto err;

}

那么你需要从引擎加载 EVP_PKEY* EVP_PKEY* key = ENGINE_load_private_key(e, "SecureToken", NULL, &cb_data);

并将其传递给 SSL: int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey);

字符串SecureTokenpkcs11_engine您应该在引擎 pkcs11 模块的文档中找到

于 2014-11-25T14:49:37.693 回答