Xml подписей подтверждает ОК в. NET, но не в Java - PullRequest
0 голосов
/ 15 апреля 2020

Я публикую это в SO, потому что нигде не смог найти решения и потратил много времени, чтобы выяснить, в чем проблема. Я надеюсь, что какой-нибудь разработчик, столкнувшийся с той же проблемой, найдет этот пост в будущем:)

C14N-преобразование, похоже, реализовано по-разному в NET и Java. Два разных «стандарта».

Никогда не добавляйте вручную пространство имен xmlns: xml в ваш xml -документ, если Java клиент может нуждается в проверке содержащегося xml подпись. Java, кажется, удаляет xmlns: xml объявление ДО проверки подлинности подписи (!)

enter image description here

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Обвините это в XML Канонизации спец. c. Раздел 4.6 (Избыточные объявления пространства имен) гласит, во-первых:

Ненужные объявления пространства имен не делаются в канонической форме.

, что подразумевает, что объявление пространства имен XML удаляется, а затем говорит

Элемент документа root обрабатывается специально, поскольку у него нет родительского элемента. Все объявления пространства имен в нем сохраняются, за исключением того, что объявление пустого пространства имен по умолчанию автоматически опускается.

, что означает, что объявление пространства имен XML сохраняется.

Запись спецификации это сложно!

0 голосов
/ 15 апреля 2020

Удалите (не добавляйте вручную!) Все объявления xmlns: xml (красное поле), если подпись использует преобразование C14N (желтое поле). Не проверено, но это может относиться и к преобразованиям Executive C14N.

  • Java (преобразование C14N) удаляет все xmlns: xml объявления пространства имен ПЕРЕД проверкой подписи
  • . NET (преобразование C14N) сохраняет объявление пространства имен xmlns: xml как есть ПЕРЕД проверкой подписи

Следовательно, xml -hashvalues ​​будет другим, и Java сообщит Сигнатурный сбой while. NET сообщит, что все в порядке (если все в порядке, конечно).

Эта проблема проверена только для Java и. NET, но может применяться к другим API-сигнатурам. тоже.

...