Добрый день!
К сожалению, не разделяю Вашего оптимизма по поводу взаимной проверки. (InfoPath 2007 Eng, Windows 7 Eng)
У меня получился противоположный результат в обе стороны.
1. Файл пoдписанный InfoPath выдает отрицательный результат программой Verify SDK, хотя сертификат подписанта находится
2. Программа подписанная модифицированной программой SignTransform, проверяется успешно Verify SDK, но понимается InfoPath как невалидная и даже сертификат не определяется
Прикладываю: 1. Исходный файл XML 1_ish.xml ; 2.файл подписанный только InfoPath 1.xml ; 3. файл с двумя подписями InfoPath и Крипто-Про 4.XSLT
Фрагмент модификации SignTransform
// Подписывание XML файла и сохранение подписи в новом файле.
static void SignXmlDocument(XmlDocument doc,
AsymmetricAlgorithm Key, X509Certificate Certificate)
{
// Создаем объект SignedXml по XML документу.
SignedXml signedXml = new SignedXml(doc);
// Добавляем ключ в SignedXml документ.
signedXml.SigningKey = Key;
// Создаем ссылку на node для подписи.
// При подписи всего документа проставляем "".
Reference reference = new Reference();
reference.Uri = "";
// Явно проставляем алгоритм хеширования,
// по умолчанию SHA1.
reference.DigestMethod =
CPSignedXml.XmlDsigGost3411Url;
// Добавляем transform на подписываемые данные
// для удаления вложенной подписи.
XmlDsigEnvelopedSignatureTransform env =
new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
// Добавляем transform на подписываемые данные
// для удаления вложенной подписей, не только
// собственной.
XmlDsigXsltTransform xsltransform = CreateXsltTransform();
reference.AddTransform(xsltransform);
// Добавляем transform для канонизации.
XmlDsigC14NTransform c14 = new XmlDsigC14NTransform();
reference.AddTransform(c14);
// Добавляем ссылку на подписываемые данные
signedXml.AddReference(reference);
// Создаем объект KeyInfo.
KeyInfo keyInfo = new KeyInfo();
// Добавляем сертификат в KeyInfo
keyInfo.AddClause(new KeyInfoX509Data(Certificate));
// Добавляем KeyInfo в SignedXml.
signedXml.KeyInfo = keyInfo;
// Можно явно проставить алгоритм подписи: ГОСТ Р 34.10.
// Если сертификат ключа подписи ГОСТ Р 34.10
// и алгоритм ключа подписи не задан, то будет использован
// XmlDsigGost3410Url
// signedXml.SignedInfo.SignatureMethod =
// CPSignedXml.XmlDsigGost3410Url;
// Вычисляем подпись.
signedXml.ComputeSignature();
// Получаем XML представление подписи и сохраняем его
// в отдельном node.
XmlElement xmlDigitalSignature = signedXml.GetXml();
// Добавляем node подписи в XML документ.
doc.DocumentElement.AppendChild(doc.ImportNode(
xmlDigitalSignature, true));
}
Преобразование. Здесь сразу есть отличие в служебном слове xsl по сравнению с оригиналом InfoPath. Но без него выдавались ошибки при подписи. (См приложенный файл. txt)
Прошу высказать Ваше авторитетное мнение и совет!
C уважением, Андрей
Отредактировано пользователем 13 апреля 2010 г. 16:10:40(UTC)
| Причина: Не указана
Вложение(я):
Trans.rar
(15kb) загружен 30 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.