Я реализую SOAP-клиент, используя Spring WS для службы, которая ожидает и возвращает заголовок безопасности подписи отпечатка.Согласно Spring WS javadoc, защита исходящего запроса не должна быть возможна с использованием алгоритма отпечатка пальца (он говорит: «Для подписи IssuerSerial и DirectReference действительны только.»):
https://docs.spring.io/spring-ws/site/apidocs/org/springframework/ws/soap/security/wss4j/Wss4jSecurityInterceptor.html#setSecurementSignatureKeyIdentifier(java.lang.String)
Но создание подписи на самом деле, кажется, работает просто отлично.Однако при попытке проверить подпись входящего ответа из Spring WS CryptographyCallbackHandler#handleX509CertificateRequest
выбрасывается UnsupportedCallbackException
;исходный код которого, кажется, действительно предполагает, что проверка подписи отпечатка пальца просто не реализована:
protected final void handleX509CertificateRequest(SignatureVerificationKeyCallback callback,
SignatureVerificationKeyCallback.X509CertificateRequest request)
throws UnsupportedCallbackException, IOException {
if (request instanceof SignatureVerificationKeyCallback.PublicKeyBasedRequest) {
handlePublicKeyBasedRequest(callback, (SignatureVerificationKeyCallback.PublicKeyBasedRequest) request);
}
else if (request instanceof SignatureVerificationKeyCallback.X509IssuerSerialBasedRequest) {
handleX509IssuerSerialBasedRequest(callback,
(SignatureVerificationKeyCallback.X509IssuerSerialBasedRequest) request);
}
else if (request instanceof SignatureVerificationKeyCallback.X509SubjectKeyIdentifierBasedRequest) {
handleX509SubjectKeyIdentifierBasedRequest(callback,
(SignatureVerificationKeyCallback.X509SubjectKeyIdentifierBasedRequest) request);
}
else {
throw new UnsupportedCallbackException(callback);
}
}
Во время выполнения запрос является экземпляром SignatureVerificationKeyCallback.ThumbprintBasedRequest
(что странным образом реализуется ,поэтому мне любопытно, почему фактическая проверка не ...), так что это действительно провалилось бы через эту if
/ else
цепочку.
Это правильно и Spring Spring не поддерживает проверку подписи отпечатка пальца?И если да, есть ли альтернатива и / или плагин для использования вместо?Если есть выделенная библиотека проверки подписи отпечатка SOAP, я мог бы написать свой собственный обработчик и использовать его, но я бы не стал сам реализовывать действительный код проверки.