2011-06-25 68 views
3

org.codehaus.mojo axistools-maven-pluginプラグインバージョン1.4を使用してコードを生成しました。 httpsを介してWebサービスに接続しようとしています。 jssecacertsにサーバー証明書をインストールし、このキーストアを/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/フォルダにコピーしました。つまり、クライアントのキーストアにサーバー証明書があることを意味します。また、kestore.ImportKeyキーストアにサーバーの秘密キーと証明書をインポートしました。私はこれをトラストストアとして使用しなければならないと思う。さて、どのように私は一緒にJavaクライアントでこれらすべてを接続するには? クライアント側で自動生成スタブを使用しています。私は以下を使ってみましたが、うまくいきません。Axis2 Javaクライアントで自己署名証明書を使用するにはどうすればよいですか?

System.setProperty("javax.net.ssl.trustStore","certs/keystore.ImportKey"); 
System.setProperty("javax.net.ssl.trustStorePassword", "importkey"); 

以下の例外が発生しています。

証明書は、同じホストに対してHTTPSクライアントで同じ証明書を使用しているため有効です。また、私は、同じ証明書を使用することに成功したカール要求を見ることができました。実際には、https以上のAxis2 soap Javaクライアントを自己署名入りのサーバ証明書を使って書く方法がわかりません。誰かがステップの例で私を指示することができます。

答えて

2

感謝を。ブラウザでwebservice URLを開こうとすると、クライアント証明書が要求されました。つまり、すでにjvmのサーバ証明書をjssecacertにインポートしていたため、クライアントにクライアント証明書がありませんでした。したがって、javax.net.ssl.trustStorejavax.net.ssl.trustStorePasswordプロパティを設定する代わりに、javax.net.ssl.keyStorejavax.net.ssl.keyStorePasswordプロパティを設定して正常に動作しています。秘密鍵と証明書がキ​​ーストアにインポートされる前に私は逃しました。 ImportKeyは、基本的にクライアント証明書であり、私はそれがサーバー証明書であると言っている人から長い時間をかけて受け取りました。それは私を誤解していました。ですから、もし誰かがそれを探しているなら、私は解決策を要約しましょう。

  1. サーバ証明書をダウンロードし、システムパス上のJVM cacertsまたはjssecacertsにインポートします。 私はthis postを使用しました。

  2. ブラウザでwebservice URLを開き、クライアント証明書を要求すると、クライアントからの証明書を要求するようにサーバーが設定されていることを意味します。自己署名証明書の場合は、サーバーからの自己署名証明書をすでに持っている必要があります。これらをキーストアにインポートし、キーストアのシステムプロパティを設定します。実際には以下のようにWebサービスを呼び出す前にトラストストアは設定しないでください。これは、すでにクライアント証明書ストア(cacerts)にサーバー証明書をインポートしているためです。

コード:私の場合はさらに

MySoap12Stub stub = (MySoap12Stub) new MyLocator().getMySoap12(new java.net.URL(WSUrl)); 

System.setProperty("javax.net.ssl.keyStore", "certs/keystoreQA.Importkey"); 
System.setProperty("javax.net.ssl.keyStorePassword", "importkey"); 

、サーバーは、SOAPヘッダに設定されたユーザートークンとパスワードを期待しています。これは私がSOAPヘッダにこれを設定する方法である:

((Stub) stub).setHeader(HeaderHandler.getSecurityHeader(User, password)); 

public class HeaderHandler { 

    public static SOAPHeaderElement getSecurityHeader(String user,String password) throws Exception { 
     SOAPHeaderElement wsseSecurity = new SOAPHeaderElement(new PrefixedQName(
      "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", 
      "Security", "wsse")); 
     wsseSecurity.setActor(null); 
     wsseSecurity.setMustUnderstand(true); 

     SOAPElement usernameToken = wsseSecurity.addChildElement("UsernameToken", "wsse"); 
     usernameToken.setAttribute("xmlns:wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); 
     SOAPElement username = usernameToken.addChildElement("Username", "wsse"); 
     username.addTextNode(user); 

     SOAPElement password = usernameToken.addChildElement("Password", "wsse"); 
     password.setAttribute("Type","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 
     password.addTextNode(password); 
     return wsseSecurity; 
    } 
} 

私は、これははUserTokenとパスワードを使用して、HTTPSを介してWebサービスを呼び出すのAxis2クライアントでトークンとパスワード、自己署名証明書を使用する方法の詳細とWSSEユーザーに説明したいと考えています。

乾杯!今行くには良いです。

2

クライアント側では、サーバーを信頼するために証明書の秘密キーは必要ありません。あなたはあなたの質問に、keystore.ImportKeyの証明書と鍵をインポートしたと書きましたので、PrivateKeyEntryとしてインポートされていると思います(keytoolでキーストア内のエントリの種類を確認できます)。

ただし、証明書をトラストアンカーとして使用する場合は、証明書をTrustedCertificateEntryとしてインポートする必要があります。 keytoolで達成することができます:

keytool -importcert -trustcacerts -alias myTrustAnchor -file /path/to/cert.crt -keystore /path/to/keystore 

次にアプリケーションでトラストストアを設定することができます。これは私がこの問題を解決する方法である

@Jcs

System.setProperty("javax.net.ssl.trustStore","/path/to/keystore"); 
関連する問題