我目前正在使用CertGetNameString
提取每个主题属性的值,如下所示:
CertGetNameString(pCertificate,
CERT_NAME_ATTR_TYPE,
0,
szOID_ORGANIZATIONAL_UNIT_NAME,
buf,
_countof(buf));
Run Code Online (Sandbox Code Playgroud)
但是,我发现的一些证书具有组织单位名称(OU)的多个值,并且CertGetNameString
只能读取第一个.例如,这是Adobe证书的主题:
CN = Adobe Systems, Incorporated
OU = Acrobat Engineering
OU = Digital ID Class 3 - Microsoft Software Validation v2
O = Adobe Systems, Incorporated
L = San Jose
S = California
C = US
Run Code Online (Sandbox Code Playgroud)
如何使用CryptoAPI读取OU(和其他)属性的所有值?
CryptProtectMemory
DPAPI中的API允许您传递该CRYPTPROTECTMEMORY_SAME_PROCESS
标志,从而防止其他进程解密内存。解决此问题的一种方法是使用OpenProcess
,WriteProcessMemory
和CreateRemoteThread
将代码注入目标进程并进行调用CryptUnprotectMemory
,从而解密内存并将其泄漏给另一个进程。
假设两个进程都在Windows Vista或更高版本上的同一受限特权用户(即非管理员)的上下文中运行,这是否仍然可能?我给人的印象是,无论进程ACL是什么,进程内存写操作都被限制的用户拒绝,但我可能是错的。
我有一个CERT_CONTEXT结构,我通过CryptoAPI从Windows上的智能卡中提取.我需要将此结构转换为与OpenSSL一致的DER编码字节数组.到目前为止,我所得到的最接近的匹配是通过CryptEncodeObject使用X509_ASN_ENCODING和X509_CERT_TO_BE_SIGNED修改它接受CERT_INFO结构作为输入.
问题是它与OpenSSL i2d_X509函数产生的输出不匹配.使用2048位x509证书作为输入,OpenSSL产生1789字节的编码输出,而Windows CryptoAPI产生1638字节的编码输出.
我能看到的唯一选择是使用CERT_CONTEXT结构中的值动态创建X509证书,并使用i2d_X509函数直接对结果对象进行编码.唯一的问题是我无法从智能卡中提取私钥,因此这可能会导致x509证书创建例程出现问题.
如果有人能就这些问题提供任何见解/建议/提示,我会非常感激.
我正在尝试在C++中使用WinCrypt API.
我的应用程序需要密码,解密,签名和验证文件,一旦我有正确的密钥,我知道如何做到这一点.但我的问题实际上是,这与生成这些密钥的应用程序不同.
我所拥有的是PEM格式的文件中的公钥和私钥:
-----BEGIN RSA PRIVATE KEY-----
[Base64 encoded]
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
而且:
-----BEGIN RSA PUBLIC KEY-----
[Base64 encoded]
-----END RSA PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
经过一些研究,我发现如何导入公钥:这里和这里,使用以下方法:
但现在,我的问题是用私钥做同样的事情.任何帮助真的很感激:)谢谢.
我是一名C++开发人员,但在Windows开发方面没有强大的背景.
我的主要问题围绕使用Crypto API.我将使用CryptAcquireContext等函数.在研究有关此API的更多信息时,仅将其描述为"Win32加密API".我想知道是否有"Win64加密API"?
如果没有,如果我开发一个在Visual Studio中使用"Win32 Crypto API"并编译为64位模式的应用程序.如果我用32位编译会更好吗?
我该怎么做才能开发一个使用Crypto API的64位应用程序?
如果可能,请在使用加密API,检索证书,携带签名等时报告您为64位开发应用程序时遇到的任何问题.
文章非常受欢迎.
我想与SunMSCAPI
提供商签署文件.由于需要使用MS Crypto API导入公钥和签名.
通常生成签名SHA1withRSA
,最终使用big-endian到little-endian(字节顺序)转换.
//generate keystore with java keytool
$Keytool -genkey -alias tsign -keystore c:\test\tsignjks.p12 - keyalg rsa -storetype pkcs12
Run Code Online (Sandbox Code Playgroud)
在Java应用程序中:
//for signing and getting keystore, assuming windows certificate is installed
..ks = KeyStore.getInstance("Windows-MY","SunMSCAPI");
PrivateKey priv = ks.getKey("tsign",password);
Signature rsa = Signature.getInstance("SHA1withRSA","SunMSCAPI");
rsa.initSign(priv);
..
rsa.update(buffer, 0, len);
..
byte[] realSig = rsa.sign();
//for writing public key for ms crypto api or exporting it from windows certificate store
Certificate cert = ks.getCertificate("tsign");
byte[] encodedCert = cert.getEncoded();
FileOutputStream …
Run Code Online (Sandbox Code Playgroud) 美好的一天,
我正在尝试将时间戳信息嵌入到pdf签名中,以便adobe会向我报告签名是时间戳.目前,我所获得的只是Adobe报告"签名包含嵌入式时间戳,但无法验证",当您查看日期/时间属性时,它表示"时间戳授权"不可用和"显示证书"是灰色的.
显然,我在构建PKCS#7消息时做错了.但我现在不知道.有人可以通过描述我需要采取的步骤来帮助我,以便我的签名有时间戳吗?或者建议一个可以帮我找到问题的工具?
我正在使用Crypto API.我目前遵循的步骤如下:
如何检查数据是否正确,以便adobe可以告诉我签名已被加上时间戳?
此致,玛格达
微软正在远离SHA1.结果,许多可执行文件现在具有两个或更多个签名; 一个使用SHA1摘要以实现向后兼容,另一个使用SHA256.
例如,如果您查看vstest.executionengine.exe
Visual Studio 2013的属性(查看Windows 8或Server 2012上的属性),您将看到它有来自3个不同证书的3个不同签名.
我已经有一个使用的组合代码CryptQueryObject
,CryptMsgGetParam
和.NET SignedCms
,但它只能看到3个签名1.一个签名者似乎只有一条消息.
我需要获取所有签名的证书信息.如何对多个签名进行建模 - 是单个消息中的多个消息还是多个签名者?Microsoft是否添加了新的API或新标志来访问多个签名?
多年以来,我们一直将强名密钥保存在密钥容器中。Visual Studio不直接支持它,但是,如果您只编辑.csproj文件并添加:
<KeyContainerName>MyKeyName</KeyContainerName>
Run Code Online (Sandbox Code Playgroud)
我们通过执行以下操作将密钥安装到密钥存储中:
sn -m Y
sn -i MyKeyFile.snk MyKeyName
Run Code Online (Sandbox Code Playgroud)
然后,我们可以从该计算机上删除MyKeyFile.snk,并且密钥更加安全。
最近,重新启动后这已成为问题。我们怀疑问题是由VS 2015引入的,但可能是Windows 8和/或10引起的。我们将密钥安装到密钥容器中,一切正常。然后,我们重新启动该计算机,并且构建失败并显示以下内容:
CSC : error CS7028: Error signing output with public key from container 'MyKeyName' -- Keyset does not exist (Exception from HRESULT: 0x80090016)
Run Code Online (Sandbox Code Playgroud)
看起来密钥容器在重新启动时丢失了,但是,如果这样做,则:
sn -m Y
sn -i MyKeyFile.snk MyKeyName
Run Code Online (Sandbox Code Playgroud)
它失败并显示:
Failed to install key pair -- Object already exists.
Run Code Online (Sandbox Code Playgroud)
我们必须使用sn -d删除密钥容器,然后将其重新添加,Visual Studio很高兴。
这里发生了什么?当sn可以看到它时,为什么Visual Studio在重新启动后看不到我们的密钥容器?密钥容器实际存储在哪里?
为什么CertGetCertificateChain
有一个设施可以返回多个“简单链”?什么是简单链条以及我应该期待哪些其他类型的链条?
在测试运行中通过如下证书......
root
|- parent
|- my certificate
Run Code Online (Sandbox Code Playgroud)
...结果是一个简单的链:
0. my certificate
1. parent
2. root
Run Code Online (Sandbox Code Playgroud)
在什么情况下我们会看到多个简单链被返回?