특정 org.apache.axis.client.Call에 사용자 정의 트러스트 관리자를 할당하고 싶습니다. Java에서 일반 HTTP 클라이언트를 사용하면 SSLContext 및 TrustManager를 만들 수 있습니다.Apache Axis 사용자 지정 트러스트 매니저
어쨌든 Apache Axis에서 가능합니까?
특정 org.apache.axis.client.Call에 사용자 정의 트러스트 관리자를 할당하고 싶습니다. Java에서 일반 HTTP 클라이언트를 사용하면 SSLContext 및 TrustManager를 만들 수 있습니다.Apache Axis 사용자 지정 트러스트 매니저
어쨌든 Apache Axis에서 가능합니까?
이것은 Apache Axis에서 매우 가능하며 사용자 정의 SSLContext 및 TrustManager를 만들 때 생각 나게됩니다. Axis SecureSocketFactory 인터페이스를 구현하고 사용자 정의 소켓을 리턴하는 create() 메소드를 정의하는 클래스를 작성할 수 있습니다. 평소대로 축 전화를 호출 할 수 있습니다, 그 후
AxisProperties.setProperty("axis.socketSecureFactory", "com.ade.martini.YourSecureSocketFactory");
: 당신이 당신의 전화를 호출하기 전에, 당신은 다음의 코드로이 커스텀 소켓 팩토리를 사용하려는 축 말할 필요
Service service = new Service();
Call call = (Call) service.createCall();
// set your endpoint, operation, etc.
call.invoke(...);
당신은 당신이 execu를 얻을 수 있음을 알 것이다
create()
방법에 중단 점을 배치하면
package com.ade.martini;
import org.apache.axis.components.net.BooleanHolder;
import org.apache.axis.components.net.SecureSocketFactory;
import javax.net.ssl.*;
import java.io.*;
import java.net.Socket;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.Hashtable;
public class YourSecureSocketFactory implements SecureSocketFactory {
private String KEYSTORE_TYPE = "JKS";
private String PROTOCOL = "SSL";
private String ALGORITHM = "SunX509";
private int DEFAULT_PORT = 443;
protected SSLSocketFactory sslFactory = null;
private String keystoreFile;
private String keystorePass;
private KeyStore kstore = null;
public AxisSecureSocketFactory(Hashtable attributes) {
}
public Socket create(String host, int port, StringBuffer otherHeaders, BooleanHolder useFullURL)
throws Exception {
if (sslFactory == null) initFactory();
if (port<=0) port = DEFAULT_PORT;
Socket sslSocket = sslFactory.createSocket(host, port);
return sslSocket;
}
protected void initFactory() throws IOException {
/* One way to find certificates */
keystoreFile = "yourkeystore.jks";
keystorePass = "password";
try {
SSLContext sslContext = getContext();
sslFactory = sslContext.getSocketFactory();
} catch (Exception e) {
if (e instanceof IOException) {
throw (IOException) e;
}
throw new IOException(e.getMessage());
}
}
/* this method will accept all certificates and therefore should NOT
be used in most production settings */
private TrustManager[ ] getTrustManagers() {
TrustManager[ ] certs = new TrustManager[ ] {
new X509TrustManager() {
public X509Certificate[ ] getAcceptedIssuers() { return null; }
public void checkClientTrusted(X509Certificate[ ] certs, String t) { }
public void checkServerTrusted(X509Certificate[ ] certs, String t) { }
}
};
return certs;
}
protected SSLContext getContext() throws Exception {
kstore = initKeyStore(keystoreFile, keystorePass);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(ALGORITHM);
kmf.init(kstore, keystorePass.toCharArray());
SSLContext sslContext = SSLContext.getInstance(PROTOCOL);
sslContext.init(kmf.getKeyManagers(), getTrustManagers(), new SecureRandom());
return (sslContext);
}
private KeyStore initKeyStore(String keystoreFile, String keystorePass)
throws IOException {
try {
KeyStore kstore = KeyStore.getInstance(KEYSTORE_TYPE);
ClassLoader classLoader = YourSecureSocketFactory.class.getClassLoader();
File file = new File(classLoader.getResource(keystoreFile).getFile());
InputStream istream = new FileInputStream(file);
kstore.load(istream, keystorePass.toCharArray());
return kstore;
} catch (FileNotFoundException fnfe) {
throw fnfe;
} catch (IOException ioe) {
throw ioe;
} catch (Exception ex) {
ex.printStackTrace();
throw new IOException("Exception trying to load keystore " + keystoreFile + ": " + ex.getMessage());
}
}}
: 여기
클래스 YourSecureSocketFactory
이 어떻게 보이는지이다 축 호출을 호출 할 때 ted. 이 코드가 실행되는 것을 확인하는 것은 Axis가 정의한 사용자 정의 TrustManager와 함께 사용자 정의 소켓을 사용하고 있다는 확인입니다.
예제 코드에서 사용 된 TrustManager가 인증서를 서버에서 수신한다는 점에 유의하십시오. 이것은 일반적으로 프로덕션에서 원하는 동작이 아닙니다.