0

我使用 . 导入了第三方 CA 颁发的 PFX 证书PFXImportCertStore。成功导入后,同一个调用默认PCERT_KEY_PROV_INFO_PROP_ID设置为以下值,PFXImportCertStore

在此处输入图像描述

  1. 为什么被dwKeySpec识别为AT_KEYEXCHANGE键类型而不是AT_SIGNATURE

  2. 为什么pwszProvName设置为 Microsoft Base Cryptographic Provider v1.0?

  3. 首先颁发的证书仅用于数字签名。但密钥使用字段表明该证书可用于数字签名、不可否认性、密钥加密、数据加密(f0)。增强的密钥用法表明,客户端身份验证和安全电子邮件?CA 是否已正确颁发证书?证书正面显示以下信息(以下屏幕截图),这让我怀疑此证书不是为数字歌唱而颁发的?我的想法是否正确?

在此处输入图像描述

4.由于这些问题,我无法使用CryptSignMessage. 内部调用无法获取用于签名的私钥的上下文。关于如何解决这个问题的任何建议?我可以使用我生成的自签名 PFX 证书进行签名。您是否认为我可以将私钥导出到新容器并将其属性设置为AT_SIGNATURE,并将 csp 提供程序类型设置为PROV_RSA_AES,因为我需要 SHA256。

我正在使用 XP sp3。

谢谢

4

1 回答 1

3

答案 1:密钥被自动归类为AT_KEYEXCHANGE因为,它的用途也是加密会话密钥等。即虽然我的应用程序的主要目的是对数据进行数字签名,但 CA 已定义密钥使用策略以包括加密,这会强制 CryptoAPI 映射的键类型AT_KEYEXCHANGE

答案 2:我假设它是这台机器中的默认 csp,所以......?请有更好的解释

答案 3:来自 Crypto Google 小组的许多人的回复AT_KEYEXCHANGE,如果您的证书的密钥使用允许您进行数字签名,密钥也可以用于签署数据。第三方 CA 颁发可用于多种用途的证书似乎是一种常见的做法。所以第三方CA已经正确地颁发了证书。

答案 4:我设法使用CryptSignMessage相同的第三方颁发的证书对数据进行签名。我将dwProvTypein更改PCERT_KEY_PROV_INFO_PROP_IDPROV_RSA_AES并传入 NULL for pwsProvName。执行此更改时,CertGetCertificateContextProperty首先使用获取属性,然后使用CertSetCertificateContextProperty 设置您选择的属性。这解决了签名问题。现在我可以使用SHA256 /RSA1024AT_EXCHANGE密钥进行签名。

于 2011-06-12T18:11:21.103 回答