I am trying to add timestamp to my pdf file and it fails silently, and outputs error only to console.
1. Is it possible to override failure logic? I would like to throw exception instead.
2. Is there something wrong with my code?
I am able to do TSA request using cmd
- Code: Select all
C:\Users\spark\Desktop>openssl ts -query -data file.pdf -sha256 -cert -out request.tsq
Using configuration from /usr/ssl/openssl.cnf
C:\Users\spark\Desktop>curl -H "Content-Type: application/timestamp-query" --data-binary "@request.tsq" http://tsa.swisssign.net -o response.tsr % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 6929 100 6859 100 70 85222 869 --:--:-- --:--:-- --:--:-- 88833
C:\Users\spark\Desktop>openssl ts -reply -in response.tsr -text
Using configuration from /usr/ssl/openssl.cnf
Status info:
Status: Granted. Status description: Operation Okay
Failure info: unspecified
TST info:
Version: 1
Policy OID: 2.16.756.1.89.1.1.3.5 Hash Algorithm: sha256
Message data:
0000 - 75 b1 62 98 78 0d 47 04-5c 8c ca 67 a7 a9 1d 78 u.b.x.G.\..g...x
0010 - 1d 39 56 52 f3 4e ee f2-c7 71 10 f0 7a fb 4a 16 .9VR.N...q..z.J.
Serial number: 0x68DDC4FF2BC4E8E9
Time stamp: Aug 25 13:59:07 2025 GMT
Accuracy: unspecified seconds, 0x01F4 millis, unspecified micros
Ordering: no
Nonce: 0xB56282593BCC2C84 TSA: DirName:/C=CH/O=SwissSign AG/CN=SwissSign ZertES TSA UNIT A 2024 - 2
Extensions:
Here is my code and console output.
- Code: Select all
using Spire.Pdf;
using Spire.Pdf.Security;
namespace ConsoleApp1;
internal class Program
{
static void Main(string[] args)
{
var parsedArgs = ParseArgs(args);
if (!parsedArgs.ContainsKey("input") || !parsedArgs.ContainsKey("output"))
{
Console.WriteLine("Usage: app.exe --input <input.pdf> --output <output.pdf>");
return;
}
Spire.Pdf.License.LicenseProvider.SetLicenseKey(@"xxx");
string inputPath = Path.GetFullPath(parsedArgs["input"]);
string outputPath = Path.GetFullPath(parsedArgs["output"]);
var doc = new PdfDocument(inputPath);
PdfCertificate cert = new PdfCertificate(parsedArgs["cert"],
parsedArgs["password"]);
var signature = new PdfSignature(doc, doc.Pages[0], cert, "TimestampSignature")
{
Bounds = new System.Drawing.RectangleF(0, 0, 0, 0),
DocumentPermissions = PdfCertificationFlags.ForbidChanges
};
signature.ConfigureTimestamp("http://tsa.swisssign.net");
doc.SaveToFile(outputPath);
Console.WriteLine("Conversion done!");
}
static Dictionary<string, string> ParseArgs(string[] args)
{
var dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
for (int i = 0; i < args.Length - 1; i++)
{
if (args[i].StartsWith("--"))
{
string key = args[i].Substring(2);
string value = args[i + 1];
dict[key] = value;
i++; // skip value
}
}
return dict;
}
}
- Code: Select all
C:\Users\spark\Desktop\tsa\publish>ConsoleApp1.exe --input file.pdf --output output.pdf --cert mycert.pfx --password ODk7jAE4jIoYiJ0eHbrlpzNP5C3
invalid tsa http://tsa.swisssign.net.response.code 128
at Spire.Pdf.Interactive.DigitalSignatures.TSAHttpService.?(Byte[] A_0)
at Spire.Pdf.Interactive.DigitalSignatures.TSAHttpService.Generate(Byte[] signature)
at Spire.Pdf.Interactive.DigitalSignatures.PdfPKCS7Formatter.?.?(IDictionary A_0)
invalid tsa http://tsa.swisssign.net.response.code 128
at Spire.Pdf.Interactive.DigitalSignatures.TSAHttpService.?(Byte[] A_0)
at Spire.Pdf.Interactive.DigitalSignatures.TSAHttpService.Generate(Byte[] signature)
at Spire.Pdf.Interactive.DigitalSignatures.PdfPKCS7Formatter.?.?(IDictionary A_0)
Conversion done!
Kind regards,
Yehor