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;
}
}
}