我正在尝试在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
可能出现什么问题?
非常感谢。