通过在 CryptCreateHash 中使用 CALG_SSL3_SHAMD5 ,然后调用 CryptSetHashParam 然后调用 CryptSignHash 为我完成了这项工作。
让我详细说明一下要求: 1. 通常,我将使用 EVP_PKEY 的私钥提供给 OpenSSL 函数,以便它可以执行签名部分。我曾经从 Windows 证书存储中提取私钥(当密钥被标记为可导出时)。但在一种情况下,私钥未标记为可导出,我无法获得 EVP_PKEY 的私钥。因此,我在私钥不可用的情况下对 OpenSSL 代码进行了修改,然后使用 CryptoAPI 实现签名部分(因为 CryptoAPI 允许使用这种不可导出的密钥进行签名)。
因此,就我而言,数据完全由 OpenSSL 散列(使用 md5-sha1 散列)。留给我的唯一一件事就是签名。
因此,以下步骤(在签名部分下)完成了这项工作:
1. Created hash using Certificate key handle provider and use CALG_SSL3_SHAMD5 algorithm.
2. Using CryptSetHashParam, I set the initial hash value
3. Signed the hash using CryptSignHash.
4. After that, reverse the bytes order (as OpenSSL signature is Big endian mentioned [here][1] which I found after lots of experimenting).
OpenSSL 的其余代码似乎对这个签名很满意。