JavaでSSLなWebサービスのメソッドを呼び出す | パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

会員No.18です。

JavaでWebサービス(SSL)のメソッドを呼び出す方法を2つ紹介します。

■トラストストアにサーバー証明書をインポートする方法

まず、サーバー証明書取得します。 ※Firefox(16.02)の場合
・Firefoxを起動
・アクセスするWebサービスのWSDL等のURLにアクセス
・アドレスバーの左の錠前アイコンをクリック
・[詳細を表示]ボタンをクリック
・[セキュリティ]タブをクリック
・[証明書を表示]ボタンをクリック
・[詳細]タブをクリック
・[エクスポート]ボタンをクリックし任意のパスにサーバー証明書(XXX.crt ※XXXは任意)を保存

次に下記コマンドでトラストストアにサーバー証明書をインポートします。
・コマンドプロンプトを起動しサーバー証明書(XXX.crt)があるフォルダで下記コマンドを実行
"%JAVA_HOME%\bin\keytool" -import -alias XXX -file XXX.crt -keystore jssecacerts

キーストアのパスワードを入力してください: ← changeit //JDKお決まり
新規パスワードを再入力してください: ← changeit //JDKお決まり
この証明書を信頼しますか? [no]: ← yes
証明書がキーストアに追加されました。

・jssecacertsというファイルができるのでJDKの下記フォルダにコピー
%JAVA_HOME%\jre\lib\security

下記のようなコードでWebサービスメソッド(例:xxx())にアクセス可能です。

public static void main(String[] args) {
TestService testService = new TestService();
TestPort testPort = testService.getTestPort();

// Test Service URL
String serviceUrl = "https://xxx.yyyy.com:8443/test/";
((BindingProvider) testPort).getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serviceUrl);

// Webサービス呼び出し
testPort.xxx();

:
}



■自己証明(所謂オレオレ証明)等で、証明書検証エラーを無視する方法

下記のようなクラスを作った場合、Webサービスのメソッド(例:xxx())はTestBase.getTestPort().xxx()のように呼び出せます。


public class TestBase {

private static TestPort testPort;

public static TestPort getTestPort() {
return testPort;
}

static {
// Test Service class
TestService testService = new TestService();
testPort = testService.getTestPort();

// Test Service URL
String validatorUrl = "https://xxx.yyyy.com:8443/test/";
((BindingProvider) testPort).getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY, validatorUrl);

X509TrustManager xtm = new MyTrustManager();
TrustManager[] mytm = {xtm};
SSLContext ctx = null;

try {
ctx = SSLContext.getInstance("SSL");
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(TestBase.class.getName()).log(Level.SEVERE, null, ex);
}

try {
ctx.init(null, mytm, null);
} catch (KeyManagementException ex) {
Logger.getLogger(TestBase.class.getName()).log(Level.SEVERE, null, ex);
}

SSLSocketFactory sslFact = (SSLSocketFactory) ctx.getSocketFactory();

HostnameVerifier hv = new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
};

HttpsURLConnection.setDefaultSSLSocketFactory(sslFact);
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}

public static class MyTrustManager implements X509TrustManager {

MyTrustManager() {
}

@Override
public void checkClientTrusted(X509Certificate chain[], String authType)
throws CertificateException {
}

@Override
public void checkServerTrusted(X509Certificate chain[], String authType)
throws CertificateException {
}

@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
}