使用 Axis2/Java 创建 SSL 客户端

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6465907/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 15:59:09  来源:igfitidea点击:

Creating SSL client with Axis2/Java

javasslaxis2

提问by avmatis

I'm trying to connect to the WebService that uses SSL but no success. I use Axis2, I found some usefull article: http://people.apache.org/~dumindu/docs/HowToConfigureSSL.html, but it is for C. In this article they set pathes to SERVER_CERT, KEY_FILE and SSL_PASSPHRASE using axis2.xml or C coding. I tried to change configuration file but this doesn't work for me. If somebody know how to set this parameters from within Java code, let me know.

我正在尝试连接到使用 SSL 但没有成功的 WebService。我使用 Axis2,我发现了一些有用的文章:http: //people.apache.org/~dumindu/docs/HowToConfigureSSL.html,但它是针对 C 的。在本文中,他们使用axis2 将路径设置为 SERVER_CERT、KEY_FILE 和 SSL_PASSPHRASE。 xml 或 C 编码。我试图更改配置文件,但这对我不起作用。如果有人知道如何从 Java 代码中设置此参数,请告诉我。

回答by Bruno

You may be interested in this answerto a similar question. In particular, Axis 2 seems to be using Apache HttpClient 3.x, according to this document:

您可能对类似问题的这个答案感兴趣。特别是,Axis 2 似乎正在使用 Apache HttpClient 3.x,根据此文档

If you want to perform SSL client authentication (2-way SSL), you may use the Protocol.registerProtocol feature of HttpClient. You can overwrite the "https" protocol, or use a different protocol for your SSL client authentication communications if you don't want to mess with regular https. Find more information at http://jakarta.apache.org/commons/httpclient/sslguide.html

如果要进行SSL客户端认证(2路SSL),可以使用HttpClient的Protocol.registerProtocol特性。如果您不想与常规 https 混淆,您可以覆盖“https”协议,或使用不同的协议进行 SSL 客户端身份验证通信。在http://jakarta.apache.org/commons/httpclient/sslguide.html 上查找更多信息

(You can build your SSLContext from your existing keystore, and configure HttpClient 3.1 using this socket factory.)

(您可以从现有的密钥库构建 SSLContext,并使用此套接字工厂配置 HttpClient 3.1 。)

回答by helios

I initialized EasySSLProtocolSocketFactoryand Protocol instances for different endpoints and register the protocol with unique key like this:

我为不同的端点初始化了EasySSLProtocolSocketFactory和 Protocol 实例,并使用唯一的密钥注册协议,如下所示:

/**
 * 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;
}   

When I have to invoke the web service, I do this (which basically replace "https" in the URL with https1, or https2 or something else depending on the Protocol you initialized for that particular endpoint):

当我必须调用 Web 服务时,我会这样做(基本上将 URL 中的“https”替换为 https1 或 https2 或其他内容,具体取决于您为该特定端点初始化的协议):

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

It works like a charm!

它就像一个魅力!