Passwords 在OpenSSL中,如何在PKCS#11模块上使用私钥而不是perivate密钥文件进行相互身份验证?

Passwords 在OpenSSL中,如何在PKCS#11模块上使用私钥而不是perivate密钥文件进行相互身份验证?,passwords,openssl,private-key,pkcs#11,mutual-authentication,Passwords,Openssl,Private Key,Pkcs#11,Mutual Authentication,我有一个简单的SSL客户端,它使用OpenSSL库。我的服务器需要客户端身份验证&因此我必须设置存储在受密码保护的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(); } /* ve

我有一个简单的SSL客户端,它使用OpenSSL库。我的服务器需要客户端身份验证&因此我必须设置存储在受密码保护的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();
}
/*从KeyFile设置私钥*/

如果(SSL_CTX_use_PrivateKey_file,CTX,KeyFile,SSL_FILETYPE_PEM)答案有点复杂。 首先,您需要加载PKCS的引擎#11:

}

然后您需要从引擎加载EVP_PKEY*
EVP_PKEY*key=ENGINE_load_private_key(e,“SecureToken”、NULL和cb_数据);

并将其传递给SSL:
int-SSL\u-CTX\u-use\u-PrivateKey(SSL\u-CTX*CTX,EVP\u-PKEY*PKEY);


字符串
SecureToken
pkcs11_engine
您应该在您的engine pkcs11模块的文档中找到您知道解释这种引擎的好资源吗?缺少关于openssl的文档。我做什么。首先,您应该通过命令行开始使用您的令牌使用openssl。接下来我使用调试选项编译了openssl,并在调试器中检查了代码。此链接可以作为起点:
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;