问题标签 [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.
java - “Windows-MY”密钥库不会列出所有可用的别名
我在列出我的个人(Windows)密钥库中安装的所有可用证书时遇到问题。
我使用以下代码获取所有证书别名的列表:
它工作正常,列出了我最近安装的 2 个证书。
然而。
计算机重新启动后,代码仅列出一个证书别名,尽管在系统中(使用 certmgr.msc)我仍然有两个处于活动状态的证书。
更重要的是 - 安装的证书来自智能卡: - ENCARD(使用 ENIGMA CAPI) - UNIZETO CARD(不知道详细信息)
当我将 ENCARD 与 API 一起使用时,似乎出现了问题。重新启动后,UNIZETO 卡仍然可以正常工作。
有任何想法吗?
windows - CryptImportKey 在 Windows 8 上失败
使用 Crypto32 Windows,函数CryptoImportKey
在 Windows 8.1 上失败,返回 ERROR_INVALID_PARAMETER。它适用于所有先前版本的 Windows。
有人对此有一些提示吗?
代码是:
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
验证方法是:
encodingType
是System.Text.Encoding.UTF8
。
结果无效。
我再次使用 CAPICOM 签名,我看到在这种情况下签名消息的长度比 OpenSSL 创建的签名消息的长度长。
请帮我理解!
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 ?
c - 用私钥签名并用公钥验证
OpenSSL 的 rsautl 允许使用私钥进行签名。这是没有哈希的。然后使用公钥恢复签名文件。
我看过,CryptCreateHash/CryptSignHash/CryptHashData
但我不知道该怎么做。我相信这些函数只会对数据的哈希进行签名,而不是对数据本身进行签名。
有什么方法可以用私钥签名而不涉及哈希?
编辑:对 jww 的建议进行了必要的更改。
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 对我来说是一个性能问题。
java - 从密钥库获取证书不是基于java中的别名
我使用以下代码根据别名从密钥库获取证书,
有没有办法从当前令牌中获取别名而不是从密钥库中获取?
提前致谢。
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 连接起来,它一切正常。不确定该标题是否始终相同。
node.js - NodeJS 中的 TLS 连接使用来自证书存储的证书和密钥
我已经通过 MQTT 实现了 TLS 连接,如下所示。
};
在这里,我传递了客户端密钥、证书和 CA 证书。相反,我需要使用来自 Windows 证书存储的信息进行连接。假设我已经在 Windows 证书存储中安装了客户端证书,我如何使用 nodeJS 从中读取私钥并建立连接?请指教。
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() 对于我要使用的所有密钥对都是错误的:
我在这里找到了其他有类似问题但没有明确答案的人。