Rampart: как использовать сертификат JKS без пароля - PullRequest
0 голосов
/ 03 октября 2019

У меня следующая ситуация:

файл хранилища ключей JKS без пароля, содержащий закрытый ключ, ТАКЖЕ незащищенный. Я попытался настроить Rampart для использования этого хранилища ключей, но я продолжаю получать следующую ошибку:

Caused by: org.apache.rampart.RampartException: No password supplied by the callback handler for the user : "username"

мой обработчик обратного вызова пароля выглядит следующим образом:

открытый класс PWCBHandlerCertificate реализует CallbackHandler{

public void handle( Callback[] callbacks ) throws IOException, UnsupportedCallbackException {

    for ( int i = 0; i < callbacks.length; i++ ) {
        WSPasswordCallback pwcb = (WSPasswordCallback) callbacks[i];

        String id = pwcb.getIdentifer();
        int usage = pwcb.getUsage();            
        if ( usage == WSPasswordCallback.DECRYPT || usage == WSPasswordCallback.SIGNATURE ) {                              
            Element temp = pwcb.getCustomToken();
            // used to retrieve password for private key
            if ( "username".equals( id ) ) {
                pwcb.setPassword( "" );
            }

        }
    }
}

}

что мне не хватает?

Заранее спасибо

1 Ответ

0 голосов
/ 03 октября 2019

Оказалось, что rampart 1.5.2 (я не знаю о более новых версиях, я должен сохранить этот ...) заставляет сертификат иметь действительный пароль (не нулевой и не пустой). Я загрузил исходный код для rampart 1.5.2 и обнаружил следующий код внутри класса BindingBuilder.java (пакет org.apache.rampart.builder):

WSPasswordCallback[] cb = { new WSPasswordCallback(user,
                WSPasswordCallback.SIGNATURE) };

        try {
            handler.handle(cb);
            if(cb[0].getPassword() != null && !"".equals(cb[0].getPassword())) {                
                password = cb[0].getPassword();
                log.debug("Password : " + password);
            } else {
                //If there's no password then throw an exception
                throw new RampartException("noPasswordForUser", 
                        new String[]{user});
            }
        }

Проблема заключается в следующем:

if(cb[0].getPassword() != null && !"".equals(cb[0].getPassword()))

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

if(cb[0].getPassword() != null /*&& !"".equals(cb[0].getPassword())*/)

Я перекомпилировал класс и заменил полученный .class внутри rampart-core-1.5.2.jar

Исключение исчезло, теперь я могу успешно использовать сертификат без пароля.

Надеюсь, это поможет.

...