Создание клиента SSL с Axis2 / Java - PullRequest
1 голос
/ 24 июня 2011

Я пытаюсь подключиться к WebService, который использует SSL, но безуспешно. Я использую Axis2, я нашел некоторую полезную статью: http://people.apache.org/~dumindu/docs/HowToConfigureSSL.html,, но это для C. В этой статье они устанавливают пути к SERVER_CERT, KEY_FILE и SSL_PASSPHRASE, используя axis2.xml или C-кодирование. Я пытался изменить файл конфигурации, но это не работает для меня. Если кто-то знает, как установить эти параметры из кода Java, дайте мне знать.

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Я инициализировал EasySSLProtocolSocketFactory и экземпляры протокола для разных конечных точек и регистрирую протокол с уникальным ключом, например:

/**
 * This method does the following:
 * 1. Creates a new and unique protocol for each SSL URL that is secured by client certificate
 * 2. Bind keyStore related information to this protocol
 * 3. Registers it with HTTP Protocol object 
 * 4. Stores the local reference for this custom protocol for use during furture collect calls
 * 
 *  @throws Exception
 */
public void registerProtocolCertificate() throws Exception {
    EasySSLProtocolSocketFactory easySSLPSFactory = new EasySSLProtocolSocketFactory();
    easySSLPSFactory.setKeyMaterial(createKeyMaterial());
    myProtocolPrefix = (HTTPS_PROTOCOL + uniqueCounter.incrementAndGet());
    Protocol httpsProtocol = new Protocol(myProtocolPrefix,(ProtocolSocketFactory) easySSLPSFactory, port);
    Protocol.registerProtocol(myProtocolPrefix, httpsProtocol);
    log.trace("Protocol [ "+myProtocolPrefix+" ] registered for the first time");
}

/**
 * Load keystore for CLIENT-CERT protected endpoints
 */
private KeyMaterial createKeyMaterial() throws GeneralSecurityException, Exception  {
    KeyMaterial km = null;
    char[] password = keyStorePassphrase.toCharArray();
    File f = new File(keyStoreLocation);
    if (f.exists()) {
        try {
            km = new KeyMaterial(keyStoreLocation, password);
            log.trace("Keystore location is: " + keyStoreLocation + "");
        } catch (GeneralSecurityException gse) {
            if (logErrors){
                log.error("Exception occured while loading keystore from the following location: "+keyStoreLocation, gse);
                throw gse;
            }
        }
    } else {
        log.error("Unable to load Keystore from the following location: " + keyStoreLocation );
        throw new CollectorInitException("Unable to load Keystore from the following location: " + keyStoreLocation);
    }
    return km;
}   

Когда мне нужно вызвать веб-сервис, я делаю это (который в основном заменяет «https» в URL на https1, или https2, или что-то еще, в зависимости от протокола, который вы инициализировали для этой конкретной конечной точки):

httpClient.getHostConfiguration().setHost(host, port,Protocol.getProtocol(myProtocolPrefix));
initializeHttpMethod(this.url.toString().replace(HTTPS_PROTOCOL, myProtocolPrefix));

Это работает как шарм!

1 голос
/ 24 июня 2011

Вас может заинтересовать этот ответ на аналогичный вопрос. В частности, Axis 2, похоже, использует Apache HttpClient 3.x, согласно этого документа :

Если вы хотите выполнить SSL-клиент аутентификация (двухсторонний SSL), вы можете использовать Protocol.registerProtocol особенность HttpClient. Вы можете переписать протокол "https" или использовать другой протокол для вашего SSL аутентификация клиента если вы не хотите связываться с обычным HTTPS. Найти больше информации на http://jakarta.apache.org/commons/httpclient/sslguide.html

(Вы можете создать свой SSLContext из существующего хранилища ключей и настроить HttpClient 3.1, используя фабрику сокетов .)

...