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

问题描述:

我有一个简单的SSL客户端使用OpenSSL库。我的服务器需要客户端认证&,所以我必须设置存储在受密码保护的PEM文件中的客户端私钥。我使用下面的代码用于此目的:如何在PKCS#11模块上使用私钥而不是在OpenSSL中使用密钥文件进行相互身份验证?

/* 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连接,而不是从文件中读取它?

答案有点复杂。 首先你需要加载你的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模块

+0

你知道解释这种引擎的好资源吗? – 2014-11-25 14:58:52

+0

缺少有关openssl的文档。我做的事。首先,您应该通过命令行开始使用令牌处理openssl。接下来,我使用调试选项编译openssl,并在调试器中检查代码。 – 2014-11-25 17:29:25

+0

此链接可以作为一个起点:https://www.opensc-project.org/opensc/wiki/engine_pkcs11 – 2014-11-27 09:25:32