2016-01-04 2 views
1

Я создаю XML-цифровую подпись так же, как она упоминается почти во всех примерах, которые я нашел:Является ли поставщик xmldsig apache santuario несовместимым с поставщиком jdk?

String providerName = System.getProperty("jsr105Provider", 
"org.jcp.xml.dsig.internal.dom.XMLDSigRI"); 

XMLSignatureFactory fac = 
XMLSignatureFactory.getInstance("DOM", 
(Provider) Class.forName(providerName).newInstance()); 
...and so on... 

Мы отправляем полученный файл XML для нашего клиента, который проверяет эту подпись. Все тесты прошли, и до сих пор все работало нормально.

В производственной системе вдруг наш клиент отправляет обратно «цифровая подпись - это неправильно». После перезапуска сервера приложений все кажется прекрасным снова, и некоторые из файлов были успешно проверены клиентом. Но через несколько минут/часов клиент снова отправляет «цифровую подпись неправильно». Только перезапуск сервера приложений решал проблему временно.

Я узнал, что вызывает эту проблему, но я не понимаю. Где-то в WSS4J приложения используется, инициализация выглядит следующим образом (org.apache.ws.security.WSSConfig):

public static synchronized void init() { 
    if (!staticallyInitialized) { 
     if (addJceProviders) { 
      setXmlSecIgnoreLineBreak(); 
      AccessController.doPrivileged(new PrivilegedAction<Boolean>() { 
       public Boolean run() { 
        addXMLDSigRI(); <-- this line causes the problem 
        addJceProvider("BC", "org.bouncycastle.jce.provider.BouncyCastleProvider"); 
        Security.removeProvider("STRTransform"); 
        appendJceProvider(
         "STRTransform", new org.apache.ws.security.transform.STRTransformProvider() 
        ); 

        return true; 
       } 
      }); 
     } 
     staticallyInitialized = true; 
    } 
} 

addXMLDsigRI() добавляет поставщик ApacheXMLDSig на месте 2, когда он не существующие в текущая конфигурация поставщика (java.security). По умолчанию поставщик XMLDSig jdk находится на месте 8.

После этой инициализации WSS4J каким-то образом происходит изменение цифровой подписи xml, и клиент говорит, что «цифровая подпись ошибочна».

Я могу воспроизвести ошибку клиента, когда я вручную зарегистрирую поставщик ApacheXMLDSig на месте 2. Если я добавлю провайдера в 10 место (после поставщика jdk), он снова будет работать.

Версии:

  • XML безопасности 1.5.6
  • WSS4J 1.6.10
  • jdk1.7.0_13
  • сервер приложений Tomcat 7

Я явно с помощью Поставщик jdk: org.jcp.xml.dsig.internal.dom.XMLDSigRI

Почему регистрация провайдера Apache «уничтожает» функциональность поставщика jdk и как я могу это решить?

ответ

1

Вы можете отключить регистрацию поставщика Apache Сантуарио в WSS4J по телефону:

WSSConfig.setAddJceProviders (ложь);

Смотрите здесь:

https://svn.apache.org/repos/asf/webservices/wss4j/tags/1_6_10/src/main/java/org/apache/ws/security/WSSConfig.java

+0

Да, это возможно. Но действительно ли это решение без побочных эффектов? Я имею в виду, что это поведение по умолчанию wss4j, поэтому я не знаю, является ли это хорошим решением для изменения этого поведения. Я также хочу знать, почему он несовместим. – soilworker

Смежные вопросы