Creating SSL client with Axis2/Java
我正在尝试连接到使用 SSL 但没有成功的 WebService。我使用 Axis2,我发现了一些有用的文章:http://people.apache.org/~dumindu/docs/HowToConfigureSSL.html,但它是针对 C 的。在这篇文章中,他们使用 axis2 设置了 SERVER_CERT、KEY_FILE 和 SSL_PASSPHRASE 的路径。 xml 或 C 编码。我试图更改配置文件,但这对我不起作用。如果有人知道如何在 Java 代码中设置此参数,请告诉我。
我为不同的端点初始化了 EasySSLProtocolSocketFactory 和协议实例,并使用这样的唯一键注册协议:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /** * 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; } |
当我必须调用 Web 服务时,我会这样做(基本上将 URL 中的"https"替换为 https1、https2 或其他内容,具体取决于您为该特定端点初始化的协议):
1 2 | httpClient.getHostConfiguration().setHost(host, port,Protocol.getProtocol(myProtocolPrefix)); initializeHttpMethod(this.url.toString().replace(HTTPS_PROTOCOL, myProtocolPrefix)); |
它就像一个魅力!
您可能对类似问题的回答感兴趣。特别是,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
(您可以从现有的密钥库构建 SSLContext,并使用此套接字工厂配置 HttpClient 3.1。)