我在签署使用MD5-SHA1哈希(MD5哈希和数据的SHA1哈希合并,再签字)数据的需求。
基本要求:
MD5,SHA1哈希值是通过OpenSSL的以某种方式不暴露提供。 该散列完成。
现在,我的要求是用签名加密API这个哈希散列无(只需要签名,不要再散列)。 为什么CryptoAPI的,不是OpenSSL的? 因为,我在处理与非导出的私钥的证书。 它的私有密钥只能由CryptoAPI的,而不是OpenSSL的使用。
这种情况是由SSL握手,其中客户端发送验证部分(非导出的私钥的情况下),我的层,并试图使用签名的CryptoAPI的数据。
另外,我想知道庄家采用使用OpenSSL非导出的私钥证书的其他方式。
通过CryptCreateHash,之后调用CryptSetHashParam使用CALG_SSL3_SHAMD5,然后调用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的代码休息似乎高兴与此签名。