【问题标题】:Unable to sign with RSA-Sha256. Is the WatchData CSP not a CNG (Cryptography API: Next Generation) Provider?无法使用 RSA-Sha256 进行签名。 WatchData CSP 不是 CNG(加密 API:下一代)提供商吗?
【发布时间】:2015-03-15 18:57:09
【问题描述】:

我正在尝试使用 WatchData USB 令牌中的证书进行签名。我使用 Microsoft CryptoAPI 函数CryptSignMessage。如果我将 sha1 指定为签名的散列算法,那么它会成功。但是,如果我尝试使用 sha256,则会失败并显示“发生内部错误”。

驱动是从http://www.watchdata.com/service/usbtoken.jsp下载的。 这包含 PKCS#11 提供程序。

根据http://blogs.msdn.com/b/alejacma/archive/2010/06/02/quot-an-internal-error-ocurred-quot-when-using-sha-2-algorithms-with-signedcms.aspx,这是因为 WatchData 提供程序不是 CNG 提供程序 -(加密 API:下一代)。

NCryptOpenStorageProvider 的调用因以下程序而失败 - 这似乎表明它不是 CNG 提供程序。

#include <windows.h>
#include <stdio.h>
#include <ncrypt.h>

int main()
{
    NCRYPT_PROV_HANDLE hProv;
    SECURITY_STATUS ret = NCryptOpenStorageProvider(&hProv, 
        L"Watchdata Brazil CSP v1.0", 0);
    if( ret != ERROR_SUCCESS)
        printf("Failed\n");
    else
        printf("worked\n");
}   

我通过调用CryptEnumProviders API 找到了提供者的名称。

还有其他方法可以使用 WatchData 令牌上的证书对 RSA-Sha256 进行签名吗?我认为 CryptoAPI 没有必要依赖 CSP 的散列函数。散列是一种标准函数,CryptoAPI 确实实现了 SHA-2。

【问题讨论】:

    标签: c++ c windows cryptography cryptoapi


    【解决方案1】:

    不幸的是,在 CryptoAPI 中,即使您将哈希与签名分开进行,您也必须提供来自同一 CSP 的哈希对象,而不仅仅是缓冲区中的哈希数据。这在 CNG 中发生了变化,其中散列不是由密钥存储提供者完成的,并且签名发生在散列缓冲区上,散列在其他地方完成,例如在 CNG 原语提供者中。如果 CNG 密钥存储提供程序获得意外长度的哈希缓冲区,它仍然可能会失败,因此它不能让您免受提供程序不知道给定哈希类型的问题。

    您确定制造商没有生产可用于您的设备的 CNG 密钥存储提供程序吗?我注意到this page上的“WatchKey_USB_Token_Admin_Tool”下载中有一个CNG Key Storage Provider。

    更新:此驱动程序不适用于 OP 的设备。

    我看到四个选项:

    1. 联系制造商的支持人员,看看他们是否可以为您提供此设备的 CNG 版本(并检查是否实际支持所需的签名机制)
    2. 使用替代设备
    3. 使用设备软件包支持的替代 API(例如 PKCS#11)进行签名
    4. (并且仅在您确实需要时),使用由底层软件包支持的 API 将您需要的功能封装在您自己的 CNG 提供程序中

    【讨论】:

    • 您在哪里找到了 CNG 供应商?哪个链接?
    • 这是我链接的页面上的第一个链接(我不想直接链接到二进制文件)但这里是直接链接:watchdata.com/service/driver/WatchKey_USB_Token_Admin_Tool.rar - 我知道这包含 CNG 密钥存储提供程序提取内容并查看 DLL 和 EXE。程序WDKSPconfig.exe是CNG Key Storage Provider注册工具,$SYSDIR\WDKSP.dll是CNG Key Storage Provider。
    • 谢谢。它似乎有一个 CNG - 但有几个问题 1. 它没有像其他的 PKCS#11 功能。同样默认情况下,WatchData 微型驱动程序不会安装它 - 所以我不能指望我的用户安装它:-(
    • 是否需要 CAPI 或 CNG 以便您可以与使用这些 API(如 AD 证书服务或 IIS)的应用程序进行互操作,或者这只是一种偏好?如果你有 PKCS#11,你能用那个 API 代替吗?
    • 是否可以仅使用 PKCS#11 API 创建 RSA-SHA2 CMS/PKCS#7 格式签名?
    【解决方案2】:

    在这种情况下,您可以使用 OpenSSL 对数据进行签名。见https://www.openssl.org/docs/crypto/RSA_sign.html

    由于您使用的是 USB 令牌,您可以创建一个新的 RSA_METHOD 结构,该结构将具有从 USB 令牌进行签名的方法。

    您可以尝试以下方法:

    1. 使用 OpenSSL 计算 SHA256。
    2. 通过使用令牌的新方法重载 RSA 结构来计算签名。

    【讨论】:

    • 我想使用 CryptoAPI 而不是任何其他库。
    猜你喜欢
    • 2021-08-08
    • 2012-07-15
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2021-04-18
    相关资源
    最近更新 更多