2009-03-04 6 views
0

XMLデータをサーブレットに送信してXMLデータを受け取ることができるJavaメインアプリケーションが自分のPC上で実行されています。 http://iamt.wisconsin.gov/IAM-WiEntUser/WiEntUserService?xml=SSL通信、どれくらい難しいですか?

I彼らは私がプライベート証明書をロードすることができたので、私はIEとFirefoxからhttps://iamt.wisconsin.gov/IAM-WiEntUser/WiEntUserService?xml=を使用することができます。

データの一部に機密性があるため、Javaメインアプリケーションからhttpsを使用します。私はMSG = unkown証明書でIOExceptionを取得します。確かに、Javaはプライベート証明書について知りません。

私は、FireFox証明書を信頼するようにJavaに指示するほど簡単であると考えていました。 System.setProperty( "javax.net.ssl.trustStore"、 "C:/ Documents and Settings/kendajm/Application Data/Mozilla/Firefox/Profiles/6f8ggdi7.default/cert8.db"); しかし、それはMSG =無効なキーストア形式のIOExceptionを与えます。

SSL通信は、どれくらい難しいでしょうか?私はこれを行う方法を追跡しようとした良い8時間を過ごした。非常に簡単で、文書化されていないか、または非常に難しく、誰も良い例がないようです。

ヘルプ。

答えて

1

私が理解しているように、問題はJavaが自己署名証明書を受け入れないことです。私が間違っているなら私を訂正してください!

Commons-HttpClientを試しましたか?これにはいくつかのオプションがあります。this pageには、自己署名証明書を受け入れるためのガイドがあります。またthis sample code

編集:Javaのhereに証明書をインポートする方法についてのガイドがあります - 明らかに、Javaアプリケーションが実行される各マシンでこれを行う必要があります。 HttpClientオプションは、必要なものに応じて柔軟性があります。

+0

+1; EasySSLProtocolSocketFactoryは、Commons-HttpClientなしでも使用できます。 – trunkc

1

私はkeytoolを使ってJavaで正しく登録した後、自己署名証明書を使用することができました。

このガイドを参照してください。基本的にhttp://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html

、あなたを: 1.それはそれは可能性があり、デフォルトのキーストアにファイルに

を 3.インポートし、自己署名証明書 2.エクスポートし、それを作成します。あなたが統合しようとしている政府のウェブサイトは、そのような自己署名証明書を拒否します。

4

Mozillaのcert8.dbキーストアフォーマットは、デフォルトでは読み込みができません(ただし、解析できるプロバイダは「プラグイン」できます)。デフォルトでサポートされているキーストアに証明書をインポートするのが最も簡単です。

まず、証明書のコピーが必要です。

Firefoxでは、問題のページにアクセスしてください。ウィンドウの右下隅にあるステータスバーの「ロック」アイコンをクリックします。表示されるダイアログで、[証明書の表示]ボタンをクリックします。新しいダイアログが表示されます。 「詳細」タブを選択します。証明書をファイルに保存するには、ウィンドウの下部にある[エクスポート]ボタンをクリックします(DERまたはPEM形式を使用します)。

ここで、Javaで使用されるキーストア形式に証明書を取得する必要があります。

は、JDKのkeytoolユーティリティ使用します。パスワードの入力を求められたら

keytool -import -keystore mykeystore.jks -alias iamt -file iamt.wisconsin.gov

を、キーストア内の証明書が改ざんされていないことを後で確認するために使用することができる新しいパスワードを選択してください。次に、keytoolは新しい証明書を信頼するかどうかを確認するメッセージを表示します—はいと入力してください! 「mykeystore.jks」という名前の新しいJavaキーストアファイル(または選択したもの)を用意する必要があります。

ここで、新しいキーストアファイルを "javax.net.ssl.trustStore"プロパティの値として指定して、プログラムを実行します。ところで


、私はあなたがあなたのサービスからJavaビーンズにXMLEncoder出力を返していることに気づきました。この「長期持続性」フォーマットは、JDKの見落とされた宝石ですが、信頼できないコンテンツを解析することは安全ではありません。この構文を使用すると、解析を実行するJVMでどのメソッドも呼び出すことができます。これは、信頼できないJSONの「評価」のようなものです。したがって、クライアントサービスを実装していたとしても、パースを信頼できないコードとして「サンドボックス化」する余分な作業をせずに、サービスからの結果を解析する意思はありません。そして、私はサービスが要求で同じフォーマットを解析すると仮定しています。これは同様にサーバーにとって危険です。


エラーメッセージに関する質問をすると(それが実際にjava.lang.StackOverflowErrorでない限り!)、それはスタックトレースを含むメッセージ全体を、投稿する素晴らしいアイデアです。それは無意味かもしれませんが、しばしば、問題を一瞬で見つけ出すために必要な情報があります。

0
  1. エクスポートエクスポート証明書のベース64符号化X.509(.CER)
  2. 実行キーツールとしてIEから証明書。 trustStoreファイルとパスワードを提供します。質問を信頼するには "はい"と答えます。 keytool -import -v -trustcacerts -alias IamtCert-file C:¥Work¥IAM¥Acceptance¥IamAcceptanceCertificate.cer -keystore N:¥WEB¥DEG¥CaCert.dat
  3. 2行のコードを追加します。 System.setProperty( "javax.net.ssl.trustStore"、 "N:\ WEB \ DEG \ CaCert.dat"); System.setProperty( "javax.net.ssl.trustStorePassword"、 "xxxxxx");

あなたは何をすべきか分かりません。残りのコードは同じです。 (サーブレットには、証明書を含まない呼び出し元を有効にする別の方法があります)

urlAddress += encodedXmlData; 
    URL url = null; 
    HttpURLConnection connection = null; 
    StringBuffer result = new StringBuffer(); 
    try { 
     url = new URL(urlAddress); 
     connection = (HttpURLConnection)url.openConnection(); 
    } 
    catch(IOException ioe) { 
     System.out.println(classMethod+": IOException: URL Msg="+ioe.getMessage()); 
     return(null); 
    }   
    connection.setDoInput(true); // Default value. 
    connection.setDoOutput(true); // Not the default value. 
    connection.setUseCaches(false); // Not the default value. 
    try { 
     connection.setRequestMethod("POST"); // Large pay load. 
    } 
    catch(ProtocolException pe){ 
     System.out.println(classMethod+": ProtocolException: URL Msg="+pe.getMessage()); 
     return(null); 
    } 
    // If true, this URL is being examined in a context in which it makes 
    // sense to allow user interactions such as popping up an 
    // authentication dialog. 
    connection.setAllowUserInteraction(false); 
    try { 
     connection.connect(); 
     BufferedReader bufferedReader = new BufferedReader(new 
       InputStreamReader(connection.getInputStream())); 

     // Retrieve the response 
     String inputLine = null; 
     while ((inputLine = bufferedReader.readLine()) != null) { 
      if (inputLine.indexOf("</void>") > -1) inputLine+='\n'; 
      result.append(inputLine); 
     } 
     bufferedReader.close(); 
     connection.disconnect(); 
    } 
    catch(IOException ioe) { 
     System.out.println(classMethod+": IOException: Read Msg="+ioe.getMessage()); 
     return(null); 
    } 
関連する問題