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