При подписании документов с внешней стороной, реализующей интерфейс IPdfExternalSigner, в методе «Sign» я предполагается, что он выдает массив байтов с именем «timeStampResponse». Я предполагаю, что это ответ от доверенного сервера меток времени.
Я позвонил на внешний сервер моего центра подписи и получил «представление DER в кодировке Base64 токена метки времени в соответствии с RFC3161. Оно включает в себя сертификат подписи TSA в SignedData.CertificatesSet."
Я проанализировал байты этого токена в Rfc3161TimestampToken, поэтому я почти уверен, что сам токен правильный, и байты содержат то, что говорит орган власти. сделать.
Но что бы я ни помещал в запрошенный массив интерфейса, никаких ошибок или предупреждений не появляется, но когда я открываю полученный подписанный PDF-файл в Adobe, он всегда говорит
подпись содержит встроенную временную метку, но ее не удалось проверить
Остальная часть процесса подписания работает отлично, документ подписан, имеет зеленые галочки, есть LTV, все в порядке. Проблема только в временной метке.
Я пробовал передавать байты токена в том виде, в котором они поступают от органа (представление DER).
У меня есть пробовал передавать байты из rfc3161TimestampToken.AsSignedCms().Encode().
Но ничего не изменилось.
Учитывая полное отсутствие никакой документации по этому полю я потерялся.
Кто-нибудь знает, что мне нужно передать в этот массив байтов, чтобы увидеть проверенную временную метку?
(И да, я открыл заявку в службу поддержки, но никогда раньше с ними не имел дела, понятия не имею, насколько быстро это будет и насколько компетентным будет ответ. Надеюсь, кто-нибудь здесь делал это раньше или подсказал, что я могу сделать неправильно.)
Поскольку кто-то, незнакомый с проблемой, просто нажмет кнопку «Закрыть», потому что кода нет, вот мой код... хотя немного не имеет отношения к проблеме:
Код: Выделить всё
public byte[] Sign(byte[] message, out byte[] timeStampResponse)
{
var sha256MessageDigest = SHA256.HashData(message);
var hexEncodedSha256MessageDigest = Convert.ToHexString(sha256MessageDigest);
var globalSignTimeStampToken = // call their server with hexEncodedSha256MessageDigest and receive token
// token is supposed to be Base64 encoded DER representation
// of timestamp token according to RFC3161. It includes the
// TSA signing certificate in SignedData.CertificatesSet.
var timeStampTokenBytes = Convert.FromBase64String(globalSignTimeStampToken);
if (Rfc3161TimestampToken.TryDecode(timeStampTokenBytes, out var rfc3161TimestampToken, out var bytesConsumed))
{
timeStampResponse = rfc3161TimestampToken.AsSignedCms().Encode();
}
else
{
timeStampResponse = [];
}
var hexEncodedSignatureValue = // call their server with hexEncodedSha256MessageDigest and receive signature
return Convert.FromHexString(hexEncodedSignatureValue);
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... -authority