Security PFXImportCertStore-问题-加密API

Security PFXImportCertStore-问题-加密API,security,cryptography,digital-signature,cryptoapi,pfx,Security,Cryptography,Digital Signature,Cryptoapi,Pfx,我使用PFXImportCertStore导入了第三方CA颁发的PFX证书。成功导入后,PCERT\u KEY\u PROV\u INFO\u PROP\u ID通过default通过同一调用,PFXImportCertStore 为什么dwKeySpec被识别为AT\u密钥交换密钥类型而不是AT\u签名 为什么将pwszProvName设置为Microsoft基本加密提供程序v1.0 首先,颁发证书只是为了进行数字签名。但密钥使用字段表明证书可用于数字签名、不可否认性、密钥加密、数据加密

我使用
PFXImportCertStore
导入了第三方CA颁发的PFX证书。成功导入后,
PCERT\u KEY\u PROV\u INFO\u PROP\u ID
通过default通过同一调用,
PFXImportCertStore

  • 为什么
    dwKeySpec
    被识别为
    AT\u密钥交换
    密钥类型而不是
    AT\u签名

  • 为什么将
    pwszProvName
    设置为Microsoft基本加密提供程序v1.0

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

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

    我正在使用XP sp3


    感谢

    回答1:密钥在密钥交换处自动分类为
    ,因为它的用途也是加密会话密钥等。也就是说,虽然我的应用程序的主要目的是对数据进行数字签名,但CA已经定义了密钥使用策略以包括加密,这将强制CryptoAPI将密钥类型映射到密钥交换处的

    回答2:我假设它是这台机器中的默认csp,那么。。。?有更好的解释吗

    回答3:从加密谷歌集团的许多人的回复中,密钥也可以用于对数据进行签名,前提是您的证书的密钥使用允许您进行数字签名。第三方CA签发可用于多种目的的证书似乎是一种常见做法。因此,第三方CA已正确颁发证书


    回答4:我设法用第三方颁发的相同证书使用
    CryptSignMessage
    对数据进行签名。我将
    PCERT_KEY_PROV_INFO_PROP_ID
    中的
    dwProvType
    更改为
    PROV_RSA_AES
    ,并将
    pwsProvName
    传递为空。执行此更改时,首先使用
    CertGetCertificateContextProperty
    获取属性,然后使用
    CertSetCertificateContextProperty
    设置您选择的属性。这解决了签名问题。现在我可以使用/RSA1024,
    在_-KEYEXCHANGE
    密钥进行签名。

    回答1:密钥自动分类为
    在_-KEYEXCHANGE
    ,因为它的用途也是加密会话密钥等。也就是说,虽然我的应用程序的主要目的是对数据进行数字签名,但CA已经定义了密钥使用策略,包括加密,这将强制CryptoAPI将密钥类型映射到密钥交换处的

    回答2:我假设它是这台机器中的默认csp,那么。。。?有更好的解释吗

    回答3:从加密谷歌集团的许多人的回复中,密钥也可以用于对数据进行签名,前提是您的证书的密钥使用允许您进行数字签名。第三方CA签发可用于多种目的的证书似乎是一种常见做法。因此,第三方CA已正确颁发证书

    回答4:我设法用第三方颁发的相同证书使用
    CryptSignMessage
    对数据进行签名。我将
    PCERT_KEY_PROV_INFO_PROP_ID
    中的
    dwProvType
    更改为
    PROV_RSA_AES
    ,并将
    pwsProvName
    传递为空。执行此更改时,首先使用
    CertGetCertificateContextProperty
    获取属性,然后使用
    CertSetCertificateContextProperty
    设置您选择的属性。这解决了签名问题。现在我可以用/RSA1024,
    在交换键上签名了