Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.04.2020(UTC) Сообщений: 45  Откуда: Москва Сказал(а) «Спасибо»: 24 раз
|
Разрешите еще вопрос, собственно продолжение. Не особо я продвинулся в части подписания файла PDF присоединенной подписью. По предыдущим шагам я не продвинулся далее чем: Код:CryptGetKeyParam(hPubKey, KP_CERTIFICATE, sb, ref pcbData, 0);
var pCertContext = CertCreateCertificateContext(X509_ASN_ENCODING, sb, (int)pcbData);
X509Certificate2 x509 = new X509Certificate2();
[b]x509[/b].Import(sb);
var isCapiValid = x509.Verify(); //проверка просто так
Далее я шел путем из примера SDK simple35 по подписанию PDF. И понимаю. что делаю что-то не так. Код далее (он собственно из примера): Код: PdfReader reader = null;
FileStream fs = null;
PdfStamper st = null;
string destFNameTmp = "";
string fPath = "";
fPath = "F:\\Etalon.pdf";
destFNameTmp = "F:\\Etalon-sign.pdf";
reader = new PdfReader(fPath);
fs = new FileStream(destFNameTmp, FileMode.Create, FileAccess.Write);
st = PdfStamper.CreateSignature(reader, fs, '\0', null, true);
AcroFields af = reader.AcroFields;
List<string> signFieldNames = new List<string>();
signFieldNames = af.GetSignatureNames();
PdfSignatureAppearance sap = st.SignatureAppearance;
sap.CertificationLevel = PdfSignatureAppearance.CERTIFIED_FORM_FILLING_AND_ANNOTATIONS;
X509CertificateParser parser = new X509CertificateParser();
Org.BouncyCastle.X509.X509Certificate[] chain =
new Org.BouncyCastle.X509.X509Certificate[] { parser.ReadCertificate(x509.RawData) };
sap.Certificate = chain[0];
sap.SignDate = DateTime.Now;
sap.Reason = "Reason!";
sap.Location = "Location!";
// Выбираем подходящий тип фильтра
PdfName filterName = new PdfName("CryptoPro PDF");
// Создаем подпись
PdfSignature dic = new PdfSignature(filterName, PdfName.ADBE_PKCS7_DETACHED);
dic.Date = new PdfDate(DateTime.Now);
dic.Name = "Sign-test";
dic.Reason = "Reason!";
dic.Location = "Location!";
sap.CryptoDictionary = dic;
int intCSize = 4000;
Dictionary<PdfName, int> hashtable = new Dictionary<PdfName, int>();
hashtable[PdfName.CONTENTS] = intCSize * 2 + 2;
sap.PreClose(hashtable);
Stream s = sap.GetRangeStream();
MemoryStream ms = new MemoryStream();
int read = 0;
byte[] buff = new byte[8192];
while ((read = s.Read(buff, 0, 8192)) > 0)
{
ms.Write(buff, 0, read);
}
ContentInfo contentInfo = new ContentInfo(ms.ToArray());
SignedCms signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner([b]x509[/b]); [b]//Кажется тут я делаю совершенно не верно, так как x509 не содержит ссылку на закрытый ключ на токене[/b]
byte[] pk = null;
try
{
// вываливаюсь на этой строке с ошибкой:
// { "Ключ не существует.\r\n"}
signedCms.ComputeSignature(cmsSigner, false); //если не ввести container password - исключение
pk = signedCms.Encode();
}
catch (Exception Ex)
{
}
byte[] outc = new byte[intCSize];
PdfDictionary dic2 = new PdfDictionary();
Array.Copy(pk, 0, outc, 0, pk.Length);
dic2.Put(PdfName.CONTENTS, new PdfString(outc).SetHexWriting(true));
sap.Close(dic2);
fs.Close();
st.Close();
reader.Close();
Вываливаюсь на этой строке с ошибкой: Код:signedCms.ComputeSignature(cmsSigner, false); //если не ввести container password - исключение
с ошибкой: { "Ключ не существует.\r\n"} Я понимаю, что кажется подменяю понятия использования Shappei, когда создается объект: Код:Gost3410_2012_256CryptoServiceProvider //и из него получается ссылка на
certGOST = cspGost.ContainerCertificate;
Вместо этого я впихиваю свой объект: Подскажите, пожалуйста, как исправить код? Хотя бы сценарий исправления.
|