问题标签 [mscapi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
591 浏览

java - “Windows-MY”密钥库不会列出所有可用的别名

我在列出我的个人(Windows)密钥库中安装的所有可用证书时遇到问题。

我使用以下代码获取所有证书别名的列表:

它工作正常,列出了我最近安装的 2 个证书。

然而。

计算机重新启动后,代码仅列出一个证书别名,尽管在系统中(使用 certmgr.msc)我仍然有两个处于活动状态的证书。

更重要的是 - 安装的证书来自智能卡: - ENCARD(使用 ENIGMA CAPI) - UNIZETO CARD(不知道详细信息)

当我将 ENCARD 与 API 一起使用时,似乎出现了问题。重新启动后,UNIZETO 卡仍然可以正常工作。

有任何想法吗?

0 投票
1 回答
257 浏览

windows - CryptImportKey 在 Windows 8 上失败

使用 Crypto32 Windows,函数CryptoImportKey在 Windows 8.1 上失败,返回 ERROR_INVALID_PARAMETER。它适用于所有先前版本的 Windows。

有人对此有一些提示吗?

代码是:

0 投票
0 回答
430 浏览

c++ - OpenSSL 签名和 CAPI 验证

我正在使用 CAPICOM 库,但它在 Android 和 iOS 上不可用。据我所知,CAPICOM 签名消息是 PKCS#7 格式,然后我想像 CAPICOM 一样使用 OpenSSL 创建签名消息。

我使用的 OpenSSL 命令:

然后我用 CAPICOM 作为这个样本进行了验证:http: //www.codeproject.com/Articles/9691/Using-CAPICOM-in-NET-for-Digital-Signatures-with-A

验证方法是:

encodingTypeSystem.Text.Encoding.UTF8

结果无效。

我再次使用 CAPICOM 签名,我看到在这种情况下签名消息的长度比 OpenSSL 创建的签名消息的长度长。

请帮我理解!

0 投票
1 回答
361 浏览

c - Windows Crypto API CryptEncrypt with the HashObject

I'm using Windows API CryptEncrypt with CALG_AES_256 I want to use a password to encrypt, from what I understand

I need to decrypt with nodejs crypto & I used openssl enc to test nodejs decrypting was successful but with C code the message is different How does windows use the hash ?

0 投票
0 回答
379 浏览

c - 用私钥签名并用公钥验证

OpenSSL 的 rsautl 允许使用私钥进行签名。这是没有哈希的。然后使用公钥恢复签名文件。

我看过,CryptCreateHash/CryptSignHash/CryptHashData但我不知道该怎么做。我相信这些函数只会对数据的哈希进行签名,而不是对数据本身进行签名。

有什么方法可以用私钥签名而不涉及哈希?

编辑:对 jww 的建议进行了必要的更改。

0 投票
1 回答
171 浏览

winapi - 机器 RSA 密钥容器中的慢速密钥枚举

我需要枚举机器密钥容器中的密钥。虽然这通常是一个可选的提供程序功能,但两者都MS_STRONG_PROV支持MS_ENH_RSA_AES_PROV它。我不认为我做错了什么或不寻常的事情:首先,使用 获取上下文句柄CryptAcquireContext(... CRYPT_MACHINE_KEYSET | CRYPT_VERIFYCONTEXT ...),然后反复调用CryptGetProvParam(... PP_ENUMCONTAINERS ...),直到枚举用尽:

为了对枚举进行基准测试,我将上下文获取和释放排除在循环之外,仅对枚举进行计时,并重复枚举 100 次。我注意到的是,普通用户的枚举速度比管理员慢得多。当我以自己的身份(启用 UAC 的管理员成员)运行测试时,我得到了

但是,当我从提升的提示符运行相同的测试时,结果却大不相同:

在幕后,向管理员报告的密钥比向非管理员用户报告的多,但这是预期的和正常的。我不明白为什么非管理员用户的枚举速度要慢 40 倍。任何指针?

我将测试的全部来源放入 Gist。该测试在没有任何加密硬件的非常通用的 Windows 7 机器上运行。

补充:在 Server 2012 HyperV 主机上的 Server 2012 虚拟机上,减速因素甚至更大,超过 130:440 对 3.3 毫秒。确实,440ms 对我来说是一个性能问题。

0 投票
2 回答
1408 浏览

java - 从密钥库获取证书不是基于java中的别名

我使用以下代码根据别名从密钥库获取证书,

有没有办法从当前令牌中获取别名而不是从密钥库中获取?

提前致谢。

0 投票
2 回答
2348 浏览

c++ - Microsoft CryptoAPI:如何将 PUBLICKEYBLOB 转换为 DER/PEM?

我有一个生成的 RSA 密钥对存储为 PRIVATEKEYBLOB 和 PUBLICKEYBLOB,我需要能够将这些密钥转换为 DER 或 PEM 格式,以便我可以在 PHP 或 Python 中使用它。我发现我可以使用 CryptEncodeObject 函数将我的 PRIVATEKEYBLOB 转换为 DER。为此,我需要使用 PKCS_RSA_PRIVATE_KEY 编码标志。但我找不到任何关于如何将 PUBLICKEYBLOB 转换为 DER 的线索。

这是我的 PRIVATEKEYBLOB 转换代码:

我通过将它们与 openssl 工具的输出进行比较来测试我的密钥:

补充:我用 X509_ASN_ENCODING 尝试了 RSA_CSP_PUBLICKEYBLOB,但结果与 openssl 工具的输出不同,并且密钥导入失败。openssl 导出的 DER 长了 25 个字节,两个键中只有前 3 个字节相等。这是关键比较的图片:

并排键比较

如果我们仔细看这张图,我们可以看到 openssl 的密钥版本在第 3 个字节之后有某种额外的 24 字节头。到目前为止还没有弄清楚它是什么,但是如果我将这个硬编码的标头与我从 CryptEncodeObject 获得的输出与 RSA_CSP_PUBLICKEYBLOB 连接起来,它一切正常。不确定该标题是否始终相同。

0 投票
1 回答
849 浏览

node.js - NodeJS 中的 TLS 连接使用来自证书存储的证书和密钥

我已经通过 MQTT 实现了 TLS 连接,如下所示。

};

在这里,我传递了客户端密钥、证书和 CA 证书。相反,我需要使用来自 Windows 证书存储的信息进行连接。假设我已经在 Windows 证书存储中安装了客户端证书,我如何使用 nodeJS 从中读取私钥并建立连接?请指教。

0 投票
0 回答
736 浏览

java - SunMSCAPI 无法识别某些密钥库条目的私钥

我很抱歉,这太长了。如果您熟悉在 Java 中执行客户端身份验证,您可能可以略过/跳到底部。我花了很长时间从不同的来源找到所有相关的信息。也许这会帮助别人。

我正在研究概念验证,以使用 Windows 密钥库从 Java 客户端进行客户端身份验证。我创建了一个可以请求或要求客户端证书的 servlet。它只返回一个 HTML 响应,其中包含证书信息,包括主题 DN 和序列号。我已经对浏览器(主要是 Chrome 和 IE)进行了许多实验,以验证它是否正常工作。我使用 SSL 生成的证书和我公司内部 CA 颁发的证书都获得了成功的客户端身份验证。

我的下一步是拥有一个与 Java 中的 MSCAPI 密钥库一起工作的 Java 客户端。我走这条路的原因是我们要使用的证书是由我们的内部 CA 颁发的,并且会自动添加到 Windows 中的个人密钥库中,并标记为不可导出。我知道如果您是工作站的管理员,可以使用一些免费工具将私钥从密钥库中取出。在这种情况下,由于各种原因,这不是一个可行的选择。这是我最终得到的代码:

这可行,但是当我连接时,Java 客户端正在使用我之前生成的客户端证书进行身份验证。我没有看到强制选择特定密钥的明显方法,所以我认为它只是选择了主机信任的第一个密钥。然后我删除了我从 Windows 密钥库创建的这些证书,它不再进行身份验证。我三重检查了服务器端是否仍然可以与浏览器一起使用,并且确实如此。然后我将这些证书读取到个人密钥库中,并从服务器端删除了我的伪 CA 的信任。仍然在浏览器中工作,而不是在客户端。

我在我的 VM 参数中添加了 -Djavax.net.debug=ssl:handshake 并开始查看输出。我看到的一件事是我添加的每个证书的“找到密钥:[别名]”行,但不是通过 certmgr.msc 的“自我注册”功能添加的证书。最初我认为这是因为它们是可导出的,但我删除了它们并添加了一个作为不可导出的,Java 仍然可以使用它。我不知道为什么 SunMSCAPI 不会使用这些证书。我和内部CA创建的都是sha256RSA。两者都启用了客户端身份验证。当我添加以下代码时,我发现 isKeyEntry() 对于我要使用的所有密钥对都是错误的:

我在这里找到了其他有类似问题但没有明确答案的人。