我安装了 Inno Setup 和 Inno Script Studio,以及 Visual Studio 2013。我有一个数字证书,用密码保护,名为certificate.p12. 我还安装了 Windows 8.1 驱动程序 SDK(虽然我运行的是 Windows 7 Professional x64)。我在安装程序中包含的编译输出已经签名。
我使用名为的签名工具my_signtool和以下命令配置了 Inno Script Studio :
"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe" sign /f "z:\full\path\to\certificate.p12" /p "password" $f
Run Code Online (Sandbox Code Playgroud)
...在我的.iss文件中,我有:
SignTool=my_signtool
Run Code Online (Sandbox Code Playgroud)
在我的计算机上使用此设置,它可以完美运行。我编译项目,Inno Setup 会自动对安装程序及其卸载程序进行签名。
但是,我有一个同事应该是完全相同的设置。他拥有 Visual Studio 2013、Inno Setup 和 Inno Script Studio、证书副本及其密码。当他尝试编译它时, Inno Setup 失败,说试图针对uninst.e32.tmp返回运行 signtool 0x1。当他运行它尝试在命令提示符下手动运行的确切命令时,它失败了,指出uninst.e32.tmp不可用,但这似乎很正常,因为我怀疑 Inno Setup 只是在错误发生后自行清理(或者是吗?)。
我试过用$q符号工具的定义替换引号无济于事。事实上,除了通向signtool.exe自身的路径之外,所涉及的路径都没有任何空间。
我们的两个输出最初都是这样的。紧接着就是他们分歧的地方:我的继续运行,他抱怨签名工具失败了0x1。
Starting compile. [Monday, January 12 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Protobuf 序列化/反序列化子消息。这样做的原因是签署。我希望能够签署我的部分信息。为了能够做到这一点,我需要以某种方式规范化它。
如果重要的话,我将 protbuf 3.0.0-alpha(使用 proto2 语言)与 Python3.4 一起使用。
示例文件:testp.proto
package my_package;
message my_mess {
message data {
optional uint64 x = 1;
optional uint64 y = 2;
optional uint64 z = 3;
}
optional bytes signature = 4;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我想对消息的数据部分进行签名。因此我只想序列化my_mess.data,签名,将签名放入my_mess.signature,然后序列化完整的消息my_mess。
编译 testp.proto:
$ protoc -I=. --python_out=. testp.proto
[libprotobuf WARNING google/protobuf/compiler/parser.cc:471] No syntax specified for the proto file. Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)
Run Code Online (Sandbox Code Playgroud)
我注意到 mm.data 有方法 …
我正在关注这个关于使用 .NET 进行数字签名/验证数据的精彩教程。我修改了该示例代码以使用 SHA256 并遇到“指定的算法无效”异常,这让我想到了这个关于在 .NET 4.0 中使用 SHA256 对数据进行签名的问题。
该帖子中的一个答案帮助我弄清楚如何通过显式加载支持 SHA256 的加密提供程序而不依赖可导出的私钥来正确生成数字签名(请参阅以下方法底部的代码,其中构造了RSACryptoServiceProvider ):
static string mKeyContainerName;
static byte[] SignText(string text, string publicCertPath)
{
// Access Personal (MY) certificate store of current user
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
// Load the certificate we'll use to verify the signature from a file.
X509Certificate2 publicCert = new X509Certificate2(publicCertPath);
publicCert.Verify();
string publicHash = publicCert.GetCertHashString();
// Find the certificate we'll use …Run Code Online (Sandbox Code Playgroud) 我正在尝试遵循以下规范来验证 SAML 响应的签名:https : //www.w3.org/TR/xmldsig-core/#sec-PKCS1
这是我的工作流程:我收到 SAML 响应。我摆脱了签名信封,将其规范化,检查摘要,然后检查签名。我能够成功计算转换后的 SAML 响应的 SHA1 摘要并对其进行验证。然而,RSA-SHA1 签名检查仍然让我望而却步。
SAML 响应包括签名方法算法:http : //www.w3.org/2000/09/xmldsig#rsa-sha1
我有这个方法来检查签名:
public static boolean verifySignature(String signatureType, PublicKey publicKey, byte[] contentBytes, byte[] sigBytes) {
try {
Signature sig = Signature.getInstance(signatureType);
sig.initVerify(publicKey);
sig.update(contentBytes);
return sig.verify(sigBytes);
} catch (Exception e) {
Logger.log(e);
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我做这样的事情来称呼它:
String publicKeyStr = "MIIDNDCCAhwCCQCEk14scLMSGjANBgkqhkiG9w0BAQsFADBcMR8wHQYDVQQDDBZhdXRoLnJldHJvZmljaWVuY3kuY29tMQ4wDAYDVQQKDAVSZXRybzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24wHhcNMTYwMzAyMTU1NTQ4WhcNMTcwMzAyMTU1NTQ4WjBcMR8wHQYDVQQDDBZhdXRoLnJldHJvZmljaWVuY3kuY29tMQ4wDAYDVQQKDAVSZXRybzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDwUlZ+qOA61kYh0MGHKTe4JtSL1qJVT/8/i6sWFqbAiGdV33pxSm8iBpqLNPG+fr8aZKugik8mN3y0kZEDwD+EATXGUpqT1v1R6Wr4rRUwsC0wl6d6EiWfdSsu66T11hdrugXF/psjyy4mmvIMMU4RlSaZmT2+gpe57IWPO522Y1HqbuvSvKJgjdyrlhIKLmw7HvZ1ZrQ1j01Hd3/rdK41+zWpSCLuSellHowiDmOzNnyFpTw+SZA0GKE+cm3BOTj/cM36GR2XJd0kIRqj1qqu29cGMlBjQ3cMleG6HoHR9oPNFwYtW1fDTHG6MnxRXYCfZiPeBdX3eBDSuz7GQAv5AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAEuQEPhpWdAGg46PSbE20bNt4YH+PjiIzPaXzN5UmpJjyl2kbR18HYXZHEtAXc+ItrYnK+oe+6FhwJ9aiwlrf1/p+U61iyvA9/HWzyW4vflaLWRQ8FxNhAJiVu57IQObjZ13EQfu1O8RK4wzNUVJhOz+pp9toqTHn8wmUPApzqMIl0KpDCPy1TNrwItaiy/gzWQngBMgIcrDeycR8wK2EH6txT8BzI+aqdIc3gBXsn/kS90lelbvYreXqF7VHoMs8fVEPN5fTRjqT9oZb60b1DxcniiTEknZtqprYuMpgEzpOHrzmlbCoNU2yBHuNTQWBz3lG+XtSMtgh16v5Vm48ag=";
PublicKey publicKey = Security.getPublicKey(publicKeyStr); // uses Certificate class
String sig = "QfAcRJM2P65JucyBpqn6j48/zd1oSLPBJ0lYI1grH5/xenwBEh0D4Eh0S1J3535OUmldpW7D+G7DW6eAT5N8TdoqUvMXuIAUpFHHDR45KZykPXJPUtli+z2rwlCCHypZWnniT/wrcQYdpp1zzNJBBtKdkaqQg0NMktPSQ/0ti+ruMI3qwfTaL9kDQ3Zyi/a2J3RCAPA0RfviLnDLlid0PthiV1NEbs0AvnguDi57fWXAILk0L1Cx20sliQckxlFQ9u4OaHeMscXdjh3SfESkM9m0Y9PppisZWTrCYzGmvDwsZTCBPD3f/ZFIit+Smgh2fi1u8/gZq0yizPyacR3Y/A==";
String newXMLToOperateOn = "<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema" ID="_420cc1a25a3890bd5df1f4c04bd7e986" ...";
boolean sign = …Run Code Online (Sandbox Code Playgroud) java saml shibboleth digital-signature public-key-encryption
我的目标是使用证书在 Windows 上签署一个未签名的可执行文件。根据我的一般知识,我知道我需要一个公钥和一个私钥对来进行数字签名。我还安装了 Windows SDK,它提供signtool.exe和makecert.exe.
我已经在线获得了证书,包括 CER、PEM 和 CRT 文件。
我现在的问题是我必须如何使用这些工具和证书文件来签署可执行文件。根据这里,CRT 文件是私钥。从我目前了解到的情况来看,CER 和 PEM 文件基本相同,但编码不同。它们是干什么用的?它们是公钥吗?以及如何签署我的可执行文件?
编辑:我尝试将 CRT 文件安装到证书存储区,然后使用该证书进行签名:
"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe" sign /debug /fd SHA256 /a /n "<Issued_To>" /t http://timestamp.comodoca.com/authenticode <Filename>
Run Code Online (Sandbox Code Playgroud)
这里<Issued_To>用证书中的数据替换,<Filename>是我要签名的文件的名称。我从 signtool 得到的输出如下:
The following certificates were considered:
...
Issued to: ...
Issued by: Certum Code Signing CA SHA2
Expires: Thu Oct 12 14:37:04 2017
SHA1 hash: BA081A67D3F2DDDC9268121DCBA04F43D6CD37FB
...
After EKU filter, 1 certs were left.
After expiry …Run Code Online (Sandbox Code Playgroud) 我得到一个Org.BouncyCastle.Security.InvalidKeyException错误消息公钥呈现不证书签名验证用PDF时LtvVerifier。
在绕过 CRL LDAP URI 的问题后出现了此问题。用于执行验证的代码与上一篇文章相同:
public static bool Validate(byte[] pdfIn, X509Certificate2 cert)
{
using (var reader = new PdfReader(pdfIn))
{
var fields = reader.AcroFields;
var signames = fields.GetSignatureNames();
if (!signames.Any(n => fields.SignatureCoversWholeDocument(n)))
throw new Exception("None signature covers all document");
var verifications = signames.Select(n => fields.VerifySignature(n));
var invalidSignature = verifications.Where(v => !v.Verify());
var invalidTimeStamp = verifications.Where(v => !v.VerifyTimestampImprint());
if (invalidSignature.Any())
throw new Exception("Invalid signature found");
}
using (var reader = new PdfReader(pdfIn)) …Run Code Online (Sandbox Code Playgroud) 我的目标是创建一个网站,要求用户登录、上传文档并使用区块链(单签或多签)对其进行签名,就像signatura或blocksign 一样。
我已经看过这两个网站,并且对它们的工作原理有所了解。但这是我没有得到的技术图片。
所以作为一个中级python开发者,我有一些问题。请回答。
如果各方都成功签名(技术上),则从将文档上传到我的网站后下载之前的总体流程。
如何生成私钥和公钥,我是否会将它们与用户信息一起存储?
如何与区块链api交互。我已经通过了 api,但对我来说没有任何意义。
我无法使用数字签名的 WIX 安装程序引导 exe 继续安装。
以下是突出显示问题的日志摘录。
[39B8:26D4][2017-09-04T20:03:31]i371:更新注册表项:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall{c6dca553-993e-473c-be4b-8ffa184cd19f},恢复:活动,重新启动否,禁用简历:否
[3904:3A84][2017-09-04T20:03:31]i336:获取容器:WixAttachedContainer,复制自:F:\Digital Signature\MyApp.exe
[3904:3A84][2017-09-04T20:03:31]i000:将字符串变量 'WixBundleLastUsedSource' 设置为值 'F:\Digital Signature\'
[3904:19F4][2017-09-04T20:03:31]e000:错误 0x80070001:无法从容器中提取所有文件,erf:1:2:0
[3904:3A84][2017-09-04T20:03:31]e000:错误 0x80070001:无法等待操作完成。
[3904:3A84][2017-09-04T20:03:31]e000:错误 0x80070001:无法打开容器。
[3904:3A84][2017-09-04T20:03:31]e000:错误 0x80070001:无法打开容器:WixAttachedContainer。
[3904:3A84][2017-09-04T20:03:31]e312:无法从容器中提取有效负载:WixAttachedContainer 到工作路径:C:\Users\Admin\AppData\Local\Temp{18826196-247C-4057-B849 -948AF1A2A7E5}\14B0A9896E9807C47A99BA7BF6B295B54ACE22FD,错误:0x80070001。
[3904:39A4][2017-09-04T20:03:31]e000:错误 0x80070001:缓存失败,中止执行。
[39B8:26D4][2017-09-04T20:03:31]i372:注册表项:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall{c6dca553-993e-473c-be4b-8ffa184cd19f},恢复:无,重启:无,禁用简历:否
[39B8:26D4][2017-09-04T20:03:31]i330:删除了包依赖提供者:{c6dca553-993e-473c-be4b-8ffa184cd19f}
[39B8:26D4][2017-09-04T20:03:31]i352:删除缓存包:{c6dca553-993e-473c-be4b-8ffa184cd19f},来自路径:C:\ProgramData\Package Cache5{c673c3eca5 -be4b-8ffa184cd19f}\
我可以使用 WIX 非签名引导程序 exe 进行安装。数字签名的引导程序有什么问题?请让我知道是否有人有类似的问题和解决方案。
windows installation windows-installer wix digital-signature
我正在尝试使用 AWS lambda 快速验证使用 sec256r1 创建的签名。
消息:“一些要签名的文本”
也用 sha256 进行了哈希处理
签名将采用 base64
encoding:MEYCIQCPfWhpzxMqu3gZWflBm5V0aetgb2/S+SGyGcElaOjgdgIhALaD4lbxVwa8HUUBFOLz+CGvIioDkf9oihSnXHCqh8yV
Run Code Online (Sandbox Code Playgroud)
公钥看起来像这样:
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXIvPbzLjaPLd8jgiv1TL/X8PXpJN
gDkGRj9U9Lcx1yKURpQFVavcMkfWyO8r7JlZNMax0JKfLZUM1IePRjHlFw==
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
澄清,
我正在尝试使用 lambda 来验证来自客户端的签名,并在需要时使用其公钥加密数据。
这是代码:
const crypto = require('crypto');
const verify = crypto.createVerify('SHA256');
verify.write('some text to sign');
verify.end();
const l1 = "-----BEGIN PUBLIC KEY-----\n"
const l2 =
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXIvPbzLjaPLd8jgiv1TL/X8PXpJNgDkGRj9U9Lcx1yKURpQFVavcMkfWyO8r7JlZNMax0JKfLZUM1IePRjHlFw=="
const l3 = "\n-----END PUBLIC KEY-----"
const publicKey = l1 + l2 + l3
const signature = "MEYCIQCPfWhpzxMqu3gZWflBm5V0aetgb2/S+SGyGcElaOjgdgIhALaD4lbxVwa8HUUBFOLz+CGvIioDkf9oihSnXHCqh8yV";
console.log(verify.verify(publicKey, signature));// Prints: true or false
Run Code Online (Sandbox Code Playgroud) 背景
我已经使用 iTextSharp 一段时间了。我创建了一个带有两个可签名 PdfFormFields 的 pdf 文档。如果我打开 pdf 文档,我可以手动对每个字段进行签名。我希望这可以通过 iTextSharp 完成。
我目前正在从 X509Store 检索证书。到此为止,我可以想通了。
题
有人可以告诉我如何使用这个 X509Certificate2 来签署一个已经存在的签名 AcroField。
参考
访问了以下参考资料,但找不到我正在寻找的答案。 签署pdf文件
这个链接让我相信我是最接近的,但是使用的几行是无效的,我不知道我是否可以通过包含其他一些库来修复它。 https://www.dotnetportal.cz/blogy/15/Null-Reference-Exception/5250/Digitalni-podepisovani-PDF-souboru-vC-cast-2
c# ×3
itext ×2
pdf ×2
python ×2
windows ×2
.net ×1
blockchain ×1
certificate ×1
code-signing ×1
hash ×1
inno-setup ×1
installation ×1
java ×1
node.js ×1
rsa ×1
saml ×1
shibboleth ×1
wix ×1