这是一个问题1072540,'WinVerifyTrust检查特定签名?'的后续问题..
我想写一个C++函数让我们调用它TrustedByUs的形式:
bool TrustedByUs(std::string pathToBinary, std::string pathToPublicKey)
Run Code Online (Sandbox Code Playgroud)
我们的想法是,我们为此函数指定一个已使用数字签名签名的二进制.dll或.exe文件的路径.该pathToPublicKey字符串的路径,我们特别签名证书的公钥.
使用http://support.microsoft.com/kb/323809中的代码,可以非常直接地验证该pathToBinary文件实际上是否受操作系统的信任.
现在我和问题1072540的作者在同一个地方,我知道操作系统信任这个二进制文件的签名者,但我想知道我的组织的RSA密钥是否是签署二进制文件的密钥.
KB323809显示了如何从嵌入在我们的二进制文件中的证书中提取字符串.此示例显示如何在其GetProgAndPublisherInfo函数中从签名证书中提取字符串,但是使用字符串匹配来验证证书时我感到很不舒服.
我想要做的是从嵌入式签名中提取公钥,并将其与首先签署我的二进制文件的私钥对应的公钥进行比较.
该文档CryptMsgGetParam说明CMSG_SIGNER_CERT_ID_PARAM
参数'返回消息签名者识别签名者公钥所需的信息'.我成功使用此密钥获取证书的序列号.我的代码看起来像这样:
// Get message handle and store handle from the signed file.
fResult = CryptQueryObject(CERT_QUERY_OBJECT_FILE,
L"C:\\Program Files\\MySignedProgram.exe",
CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,
CERT_QUERY_FORMAT_FLAG_BINARY,
0, &dwEncoding, &dwContentType, &dwFormatType, &hStore, &hMsg, NULL);
// Get the public key information about the signer
// First get the size
DWORD dwCertIdSize(0);
fResult = CryptMsgGetParam(hMsg, CMSG_SIGNER_CERT_ID_PARAM,
0, NULL, &dwCertIdSize);
BYTE* …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试为我的小型电子邮件发送脚本(使用Python 3.x和python-gnupg模块)添加PGP签名支持.
签署消息的代码是:
gpg = gnupg.GPG()
basetext = basemsg.as_string().replace('\n', '\r\n')
signature = str(gpg.sign(basetext, detach=True))
if signature:
signmsg = messageFromSignature(signature)
msg = MIMEMultipart(_subtype="signed", micalg="pgp-sha1",
protocol="application/pgp-signature")
msg.attach(basemsg)
msg.attach(signmsg)
else:
print('Warning: failed to sign the message!')
Run Code Online (Sandbox Code Playgroud)
(这basemsg是email.message.Message类型.)
而messageFromSignature函数为:
def messageFromSignature(signature):
message = Message()
message['Content-Type'] = 'application/pgp-signature; name="signature.asc"'
message['Content-Description'] = 'OpenPGP digital signature'
message.set_payload(signature)
return message
Run Code Online (Sandbox Code Playgroud)
然后我将所有需要的标题添加到消息(msg)并发送它.
这适用于非多部分消息,但在basemsg多部分(multipart/alternative或multipart/mixed)时失败.
手动验证相应文本的签名是否有效,但Evolution和Mutt报告签名是错误的.
任何人都能指出我的错误吗?
我正在编写一个汇编信息应用程序,用于我们的软件构建过程,并尝试从已签名的.Net程序集中读取数字签名信息.
我想在我的C#代码中执行Windows资源管理器可以通过右键单击已签名的程序集并选择"数字签名"选项卡然后单击"详细信息"按钮来执行的操作.例如


有没有人知道如何在C#中以编程方式执行此操作?我目前正在使用Mono Cecil库从程序集中获取其余信息.非常感谢您的帮助.
我无法获得Windows 8(发布预览版)接受inf2cat或makecat方法描述为问题的解决方案
除非我禁用验证.
我现在没有使用任何证书签署这些证书,只是试图通过错误来阻止驱动程序安装.
Windows 8给了我一个非常不明显的错误:
"尝试将驱动程序添加到商店时遇到问题."
查看事件日志,没有任何用处; 只是来自"Windows错误报告"的信息条目,表示PnPdriverimporterror.
当我使用与inf不匹配的cab文件的原始文件时,我得到其他人列出的错误:
指定的目录文件中不存在该文件的哈希.
我有一个.inf文件,我需要生成一个.catfor.
也许我做错了什么.想法?
c:\win_xp_vista32_64>inf2cat /driver:"." /os:XP_X86,XP_x64,Vista_X86,Vista_x64,7_X86,7_X64,8_X86,8_X64
.......................
Signability test complete.
Errors:
None
Warnings:
22.9.10: usbser.sys in [drivercopyfiles.nt] is missing from [SourceDisksFiles] s
ection in \mchpcdc.inf; ok if file source is provided via LayoutFile in [Version
].
22.9.10: %driverfilename%.sys in [drivercopyfiles.ntamd64] is missing from [Sour
ceDisksFiles] section in \mchpcdc.inf; ok if file source is provided via LayoutF
ile …Run Code Online (Sandbox Code Playgroud) 我正在使用Java实现C#SignedCms功能.
我正在使用bouncycastle libs.问题是我得到的java签名与使用SignedCms生成的签名不同.
X509Certificate2 certificate = new X509Certificate2("myCertPath", "myPass");
String text = "text";
ContentInfo contentInfo = new ContentInfo(System.Text.Encoding.UTF8.GetBytes(text));
SignedCms cms = new SignedCms(contentInfo, false);
CmsSigner signer = new CmsSigner(certificate);
signer.IncludeOption = X509IncludeOption.None;
signer.DigestAlgorithm = new Oid("SHA1");
cms.ComputeSignature(signer, false);
byte[] signature = cms.Encode();
print(signature);
Run Code Online (Sandbox Code Playgroud)
Security.addProvider(new BouncyCastleProvider());
char[] password = "myPass".toCharArray();
String text = "text";
FileInputStream fis = new FileInputStream("myCertPath");
KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(fis, password);
String alias = ks.aliases().nextElement();
PrivateKey pKey = (PrivateKey)ks.getKey(alias, password);
X509Certificate cert = (X509Certificate)ks.getCertificate(alias);
java.util.List …Run Code Online (Sandbox Code Playgroud) 我需要在JAVA中对我的XML消息进行数字签名:生成的XML签名应具有以下格式:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<DigestValue>DsP5NLca+plhp9tZvGwykfb2whQYt3CQ5sbsVd9Q9aE=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>
LrfE0po3YPvVxB/m77iBWWiR07Ghiuhuj7tO2C2LKqZK2cLrAiidt+3tjbJ3m16quCFxfh7bmjRtJsGi7a3HKtK
qY4auqrjNB62AtYrxvm+7Qd/cRacom4e3M9uF9JD1zTfoGun9w4WDfDrDaoZ+ZwUgNtf6sTYO5Ctcj5sYcD0=
</SignatureValue>
<KeyInfo>
<KeyName>7D665C81ABBE1A7D0E525BFC171F04D276F07BF2</KeyName>
</KeyInfo>
</Signature>
Run Code Online (Sandbox Code Playgroud)
谁能提供一些代码帮助?
编辑:
我想出了这段代码:
private static Document sign(Document doc) throws InstantiationException, IllegalAccessException, ClassNotFoundException,
NoSuchAlgorithmException, InvalidAlgorithmParameterException, KeyException, MarshalException, XMLSignatureException,
FileNotFoundException, TransformerException {
String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI");
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
Reference ref = fac.newReference("", fac.newDigestMethod(DigestMethod.SHA256, null));
// Create the SignedInfo
SignedInfo si = fac.newSignedInfo(
fac.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE, (C14NMethodParameterSpec) null),
fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), …Run Code Online (Sandbox Code Playgroud) 我需要使用ruby签署xml,有人知道任何方法或lib吗?
我的xml骨架是:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Message>
<MessageId>
<ServiceId>service</ServiceId>
<Version>1.0</Version>
<MsgDesc>Service Description</MsgDesc>
<Code>4</Code>
<FromAddress>from</FromAddress>
<ToAddress>to</ToAddress>
<Date>2012-10-29</Date>
</MessageId>
<MessageBody/>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>??????</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>????????????</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>????????</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</message>
Run Code Online (Sandbox Code Playgroud)
我为DigestValue尝试了这个代码,我测试了它,将它与我的java示例进行比较,但是DigestValue与我的java示例的响应不匹配:
require 'base64'
require 'openssl'
to_sign_xml = File.read 'service.xml'
digest = OpenSSL::Digest::SHA1.digest(to_sign_xml)
digest = Base64.encode64(digest.to_s).gsub(/\n/, '')
raise digest.inspect
Run Code Online (Sandbox Code Playgroud)
我的文件service.xml包含:
<Message>
<MessageId>
<ServiceId>service</ServiceId>
<Version>1.0</Version>
<MsgDesc>Service Description</MsgDesc>
<Code>4</Code>
<FromAddress>from</FromAddress>
<ToAddress>to</ToAddress>
<Date>2012-10-29</Date>
</MessageId>
<MessageBody/>
<Message>
Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能使用iText(我用于签名)或Java中的其他工具,在pdf上添加生物识别数据.
我会更好地解释一下:在签名牌上签名时,我会收集笔压,签名速度等签名信息.我想用pdf上的签名存储这些信息(java中的变量)togheter.显然隐藏和加密,如签名信息.
pdf上是否存在某种隐藏数据字段或可能包含此类信息的内容?我认为将它存储在诸如作者等的元数据字段中是不合适的.
我有存储在网络上的X509证书.我可以从远程Windows证书库中读取链.我需要签署一些数据并在签名中包含链,以便以后验证它.
问题是我找不到将证书链放到CsmSigner的方法.我已经读过它从构造函数参数获取证书并尝试使用X509Chain.Build构建一个链.它忽略了证书列表值并且(显然)失败,因为在本地Windows证书库中找不到证书.
请在下面找到我的测试代码(仅当证书本地保存到Windows证书库时才有效)
protected byte[] SignWithSystem(byte[] data, X509Certificate2 cert, X509Certificate[] chain)
{
ContentInfo contentInfo = new ContentInfo(data);
SignedCms signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner(cert);
cmsSigner.DigestAlgorithm = new Oid("2.16.840.1.101.3.4.2.1"); //sha256
cmsSigner.IncludeOption = X509IncludeOption.WholeChain;
if (chain != null)
{
//adding cert chain to signer
cmsSigner.Certificates.AddRange(chain);
signedCms.Certificates.AddRange(chain);
}
signedCms.ComputeSignature(cmsSigner); //fails here with System.Security.Cryptography.CryptographicException : A certificate chain could not be built to a trusted root authority.
byte[] signedPkcs = signedCms.Encode();
return signedPkcs;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让它无需上传证书到本地商店?我应该使用任何替代签名者吗?
我可以尝试将证书上传到商店,但问题是这样
我必须添加和删除证书(必须授予权限)
有几个进程应用签名,因此必须添加跨进程同步.
这不是我想做的.
是否可以使用纯JavaScript在浏览器中签署XML文档?
我相信这里有严格的安全限制,但也许有一些方法可以做到这一点.