我正在使用 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 执行的吗?我没有显式加载 openssl pkcs11 引擎(将 NULL 传递给 EVP_DigestSignInit 中的 ENGINE* arg),我什至没有在我的 openssl conf 中添加引擎路径。如果没有使用 pkcs11 引擎,那么为什么 sign/veriy 函数会返回成功?