OpenSSL与Windows API不兼容

时间:2016-07-29 06:49:04

标签: php winapi curl openssl timestamp

我正在尝试在php和windows中使用时间戳服务。 我的问题是,openssl输出似乎与CryptVerifyTimeStampSignature()不兼容。

要在Windows中生成并上传请求,我使用CryptRetrieveTimeStamp():

            CRYPT_TIMESTAMP_CONTEXT*re;
            CRYPT_TIMESTAMP_PARA r = { 0 };
            r.fRequestCerts = true;

            auto C = ... // my data
            auto flg = TIMESTAMP_VERIFY_CONTEXT_SIGNATURE;
            CryptRetrieveTimeStamp(url, flg, 0,
                szOID_NIST_sha256, &r, (BYTE*)C.data(), C.size(), &re, 0, 0);

为了在php中执行此操作,我使用openssl和curl

openssl ts -query -data inputfile -sha256 -cert -out file.tsq

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $tsa_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($requestfile_path));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/timestamp-query'));
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); 
$binary_response_string = curl_exec($ch);

到目前为止,很好。我得到一个有效的tsa响应。 现在的问题是,虽然openssl可以验证两个响应(来自Windows API和php):

openssl ts -verify -sha256 -digest "..." -in r:\1.dat -CAfile file.pem

当响应是openssl时,Windows API调用失败:

            PCRYPT_TIMESTAMP_CONTEXT re = 0;
            BYTE* b = (BYTE*)...
            auto sz = ...
            auto Sig = ...
            auto res = CryptVerifyTimeStampSignature(b,sz, (BYTE*)Sig.data(), Sig.size(), 0, &re, p, 0);

结果:         @ ERR,hr 0x8009310b:遇到ASN1错误标记值。 unsigned int

可能出现什么问题?

非常感谢。

0 个答案:

没有答案