问题标签 [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 投票
1 回答
1222 浏览

java - 使用 Java (SunMSCAPI) 访问 Windows 本地计算机个人密钥库

有没有办法使用SunMSCAPI使用 Java 访问 Windows本地机器个人密钥存储?

通常,您可以使用WINDOWS-ROOT(大致相当于Java中的受信任存储)或WINDOWS-MY(包含个人证书,大致相当于Java中的密钥存储)从windows证书中检索证书贮存。

这对用户来说很好,但即使在模拟 SYSTEM 用户时,我也无法检索本地机器的个人证书。

存在一些使用 JNA的问题(我想避免,特别是因为从那里检索私钥似乎很复杂)。
此外,有人使用 psexec来模拟 SYSTEM 用户(使用psexec -s)。我也试过这个,但没有成功。最后, Java Bug System 中
还有一个未公开的错误。

如果有人知道如何使用 Java 从 Windows 中的本地计算机个人存储中检索证书,我将不胜感激。

0 投票
1 回答
879 浏览

cng - Microsoft MSCAPI-CSP 和 CNG 兼容性

我们之前开发了一个 RSA MSCAPI CSP 用于经典的 Windows 加密 API,并且多年来一直运行良好。不幸的是,在 AES 加密的情况下,较新版本的 Outlook 拒绝使用此 CSP。它仍然支持 3DES 但不支持 AES。这很奇怪,因为它实际上不是处理对称解密的 CSP,但显然微软不想支持 MS-CAPI 的 AES 案例。对于 AES 支持,RSA 密钥需要采用较新的提供程序类型,即符合 CNG 框架的密钥存储提供程序。好的,但问题是:如何确保拥有依赖 MS-CAPI 接口的软件的客户端的向后兼容性?
根据我的理解(这可能是错误的),MSCAPI 和 CNG 的证书存储是相同的。区别在于如何引用私钥。该证书有一个属性“CERT_KEY_PROV_INFO_PROP_ID”,其中包含许多字段,包括提供者名称、容器名称和提供者类型。如果提供者类型为“0”(这在旧 API 中不是合法值),则表明指定的提供者实际上是新的 CNG 提供者之一。

旧应用程序将使用来自 CERT_KEY_PROV_INFO_PROP_ID 的值来使用旧函数获取加密上下文,即 CryptAcquireContext()。但是,在 CNG 提供程序(即提供程序类型 = 0)的情况下,此函数会失败 - 这里似乎程序将不得不使用新的 CNG 函数,即 NCryptOpenStorageProvider、NCryptOpenKey 等再次传递来自 CERT_KEY_PROV_INFO_PROP_ID 的值。因此,如果这种理解/测试是正确的,则意味着不可能迁移到 CNG 提供商并且从遗留应用程序的角度来看仍然具有相同的证书/密钥。我无法在文档中明确说明这一点,但似乎每个应用程序都需要查看 CERT_KEY_PROV_INFO_PROP_ID 内容,并有一个开关:如果它是提供者类型 = 0,这是 CNG 提供程序中的一个键,因此程序将使用新的 CNG 功能。另一方面,如果提供程序类型 > 0,则程序应使用遗留函数。但当然,遗留程序不会有这种逻辑,因此在 CNG 提供程序中的密钥的情况下会失败。这意味着不可能同时满足新程序和旧程序的需求,因为您必须在 CERT_KEY_PROV_INFO_PROP_ID 中输入对旧提供程序或新提供程序的引用,但您不能同时拥有两者。Outlook 只希望引用新的提供程序,而旧程序只能与旧提供程序一起使用。遗留程序将不具有此逻辑,因此在 CNG 提供程序中的密钥的情况下将失败。这意味着不可能同时满足新程序和旧程序的需求,因为您必须在 CERT_KEY_PROV_INFO_PROP_ID 中输入对旧提供程序或新提供程序的引用,但您不能同时拥有两者。Outlook 只希望引用新的提供程序,而旧程序只能与旧提供程序一起使用。遗留程序将不具有此逻辑,因此在 CNG 提供程序中的密钥的情况下将失败。这意味着不可能同时满足新程序和旧程序的需求,因为您必须在 CERT_KEY_PROV_INFO_PROP_ID 中输入对旧提供程序或新提供程序的引用,但您不能同时拥有两者。Outlook 只希望引用新的提供程序,而旧程序只能与旧提供程序一起使用。

但这真的可以吗,还是我缺少某些东西或我的理解有一些错误?微软似乎有多种方法可以帮助程序具有某种类型的互操作性(例如,旧程序可以使用旧 API 使用新的 KSP)。

0 投票
1 回答
279 浏览

java - Java 8 打开 Windows 自定义 csp 提供程序并检索密钥

我正在尝试找到一种方法来从 JAVA 加载存储在 Utimaco HSM CSP 中的 HSM 密钥

到目前为止,我从搜索中获得了可能使用 SunMscApi 提供程序的线索,但是我找不到任何可以指定Utimaco CryptoServer CSP为提供程序的示例?加密上下文?和容器名称TEST_CSP_HSM。我发现的唯一示例是从 Windows-My 密钥库加载证书,但它不存在。

Utimaco CSP 工具

0 投票
1 回答
98 浏览

java - 带有 MSCAPI 密钥库的 OpenPGP(充气城堡)

我正在尝试使用充气城堡(v1.65)在java中进行加密/解密。所以我需要将我的 MSCAPI(Windows-MY) 密钥转换为 PGP 密钥。当我尝试使用 PSCK12 或 PSCK8 时,它就像一个魅力。但是对于 MSCAPI(Windows-MY) Store,它不起作用。

这是我的代码:

使用 MSCAPI(Windows-MY) 密钥,我遇到了这个异常:

sun.security.mscapi.CPrivateKey cannot be cast to java.security.interfaces.RSAPrivateCrtKey

有人可以帮我吗?

0 投票
1 回答
141 浏览

c++ - 如何在cryptoki中重命名容器名称

我编写了一些代码,在令牌中写入公钥和私钥的密钥对。从密钥对中,我创建 pkcs10,然后从中生成证书文件。证书文件将被插入到令牌中。这一切都运行成功,但不知何故,CAPI 或 Internet Explorer 无法读取证书。如果我插入一个 p12 文件,它会毫不费力地运行。我怀疑 CKA_LABEL 和 CKA_ID 是这里的罪魁祸首。在 p12 中,所有内容都使用相同的名称约定。来自容器、公钥、私钥和证书。但是在我的方法中,容器名称看起来像是自动生成的。如何将其转换为与 CKA_ID 相同?下面是我生成保存在容器中的密钥对的代码。

它保存在容器名称中,例如

cont_4440xxxxxxxx

如何将容器名称更改为与 CKA_ID 完全相同?任何人都可以帮忙吗?

0 投票
1 回答
95 浏览

cryptography - 如何在 Windows 中使用 MSCAPI 扩展 HSM (Linux) 的功能?

我是 HSM 的新手。

我想使用 MSCAPI 在 Linux 环境中从 HSM 访问加密功能。

我的客户要求是应该可以使用 MSCAPI 访问 HSM。

因此,我对如何使用 MSCAPI 在 Windows 中扩展 HSM(在 Linux 中运行的 HSM)功能感到非常困惑

请帮忙。

问候, Virudhai Paul

0 投票
0 回答
63 浏览

c# - .NET Framework 4.8 中来自 AesCryptoServiceProvider 的 PlatformNotSupportedException

我正在开发基于 .NET Framework 4.8 的桌面应用程序。我们的数据收集已开始显示许多客户遇到AesCryptoServiceProvider. 突然之间,它的构造函数抛出了一个PlatformNotSupportedException. 我们的应用程序的新旧版本都会发生这种情况。这意味着我们的代码中没有任何更改触发了这种行为。根据 MS-CAPI,查看源代码时,如果根本找不到支持的 AES 密钥大小,则会引发此异常。

更奇怪的是,RijndaelManaged似乎工作正常。

我们在各种 Windows 10 版本、Windows 8.1 和 Windows Server 2012、各种计算机制造商以及世界各地都看到了这个问题。

有谁知道这可能是什么原因造成的?