使用测试证书以aspose.words对文档进行数字签名

时间:2011-10-24 18:58:36

标签: c# cryptography digital-signature x509certificate aspose

我正在尝试创建一个单元测试,生成一个类似于Aspose Words示例中的空测试文档。我使用makecert.exe在VS Command Promp中使用以下行创建了一个测试证书

makecert.exe -sv MyKey.pvk -n "CN=MY DIGITAL KEY" MyKey.cer

然后我使用以下行将其转换为.pvk文件

pvk2pfx.exe -pvk MyKey.pvk -spc MyKey.cer -pfx MyPFX.pfx

完成此操作后,我将.pfx文件复制到我的.net控制台应用程序中,并将复制参数设置为始终复制,以便在我在调试中测试应用程序时将文件复制到bin目录。

我的控制台应用程序随后包含以下代码行,这些代码尝试编写经过数字签名的pdf。

static void Main()
{
string MyDir = AppDomain.CurrentDomain.BaseDirectory;
// Create a simple document from scratch.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.Writeln("Test Signed PDF.");
// Load the certificate from disk.
// The other constructor overloads can be used to load certificates from different locations.
X509Certificate2 cert = new X509Certificate2(MyDir + "RpaKey.pfx", "");
Console.WriteLine("Loading certificate...");
// Pass the certificate and details to the save options class to sign with.
PdfSaveOptions options = new PdfSaveOptions();
options.DigitalSignatureDetails = new PdfDigitalSignatureDetails(
cert,
"Test Signing",
"Aspose Office",
DateTime.Now);
Console.WriteLine("Creating digital signature details...");
try
{
// Save the document as PDF with the digital signature set.
doc.Save(MyDir + "Document.Signed Out.pdf", options);
Console.WriteLine("File saved successfully.");
}
catch (Exception ex)
{
Console.WriteLine("File write failed.");
Console.WriteLine(ex.Message);
if (ex.InnerException != null)
{
Console.WriteLine("");
Console.WriteLine(ex.InnerException);
}
}
Console.ReadKey();
}

但是我一直收到“指定的无效算法”错误,没有内部异常。有没有人遇到这个问题?我错过了一步吗?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

从未使用过Aspose,但您应该首先确保从PVK到PFX格式的转换工作方式与您预期的一样。

改变这个:

X509Certificate2 cert = new X509Certificate2(MyDir + "RpaKey.pfx", "");
Console.WriteLine("Loading certificate...");

X509Certificate2 cert = new X509Certificate2(MyDir + "RpaKey.pfx", "");
Console.WriteLine("Loading certificate... private key available ? {0}", cert.HasPrivateKey);

请注意,它可能会成功,因为没有例外 - 但这至少会确认您的流程的第一部分是有效的: - )

如果显示 true ,则应更新问题以显示异常的完整堆栈跟踪,例如

catch (Exception ex)
{
    Console.WriteLine(ex);
}

所以我们将看看错误是来自Aspose还是BCL本身。

答案 1 :(得分:1)

我同意Poupou的看法,完整的堆栈跟踪有助于理解异常产生的确切位置和原因。此外,如果此问题在您的最后仍然存在,那么您也可以通过Aspose.Words forum与我们的支持团队联系。我们将不得不详细研究这个问题,看看它是否真的是由Aspose.Words引起的。如果是这样,我们将为您提供解决方案。

此外,当您创建一个非常简单的文档时,看起来问题可能是由签名引起的。你可以尝试一些其他签名文件吗?

披露:我在Aspose担任开发人员传播者。