2014-12-04 4 views
1

특정 org.apache.axis.client.Call에 사용자 정의 트러스트 관리자를 할당하고 싶습니다. Java에서 일반 HTTP 클라이언트를 사용하면 SSLContext 및 TrustManager를 만들 수 있습니다.Apache Axis 사용자 지정 트러스트 매니저

어쨌든 Apache Axis에서 가능합니까?

답변

1

이것은 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가 인증서를 서버에서 수신한다는 점에 유의하십시오. 이것은 일반적으로 프로덕션에서 원하는 동작이 아닙니다.