在HSM上使用带私钥的openssl进行签名

在HSM上使用带私钥的openssl进行签名,openssl,pkcs#11,hsm,opensc,Openssl,Pkcs#11,Hsm,Opensc,我正在使用OpenSC/libp11访问HSM。我需要使用生成并存储在HSM上的私钥对一些数据进行签名。在libp11中,我使用以下函数: EVP_PKEY*PKCS11_get_private_key(PKCS11_key*key) 获取表示私钥的EVP_PKEY结构的指针。接下来,我将使用openssl函数: int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, const

我正在使用OpenSC/libp11访问HSM。我需要使用生成并存储在HSM上的私钥对一些数据进行签名。在libp11中,我使用以下函数:

EVP_PKEY*PKCS11_get_private_key(PKCS11_key*key)

获取表示私钥的EVP_PKEY结构的指针。接下来,我将使用openssl函数:

 int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
                        const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey);
 int EVP_DigestSignUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt);
 int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen);
执行签名操作。所有这些函数都返回成功,甚至相应的EVP_DigestVerifyInit/Update/Final函数也返回成功


我的问题是,在我的情况下,签名操作是否实际由HSM执行/在HSM上执行?我没有显式加载openssl pkcs11引擎(将NULL传递给EVP_DigestSignInit中的引擎*arg),我甚至没有在我的openssl配置中添加引擎路径。如果没有使用pkcs11引擎,那么为什么签名/验证函数返回成功?

执行操作的位置取决于提供程序(注意:不是“引擎”)。OpenSC/libp11是openssl语法和p11语法之间的垫片,由提供者实现。HSM供应商将向供应商供货。如果正确执行,则为是——该操作在HSM上执行。get_private_密钥不会返回密钥本身,而是返回密钥的句柄。签名操作将句柄和数据一起传递回HSM,HSM访问实际密钥,对数据签名,并返回签名。再次说明:如果实现正确。操作执行的位置取决于提供程序(注意:不是“引擎”)。OpenSC/libp11是openssl语法和p11语法之间的垫片,由提供者实现。HSM供应商将向供应商供货。如果正确执行,则为是——该操作在HSM上执行。get_private_密钥不会返回密钥本身,而是返回密钥的句柄。签名操作将句柄和数据一起传递回HSM,HSM访问实际密钥,对数据签名,并返回签名。再次:如果实现正确。