私はこれに長い時間を費やしましたが、最終的に実際に機能する例を見つけました。これは Glassfish と Netbeans ベースですが、いじってみると他の環境 (Eclipse や Tomcat など) でも動作するようになると思います。
http://java.sun.com/webservices/reference/tutorials/wsit/doc/WSIT_Security9.html#wp162511
私が見つけた問題は、glassfish にプリインストールされている証明書ではなく、独自の証明書を使用する場合です。
注: 私はセキュリティの専門家ではありません。これを本番環境にデプロイしないでください!
これを行うために、NetBeans 6.9、JDK 1.6、GlassFish 3.0.1、および OpenSSL v1.0 を使用しています (非公式の Win32 バイナリを使用しています)。
# Create the CA
mkdir ca server client
cd ca
openssl req -new -x509 -days 3650 -extensions v3_ca -keyout ca.key -out ca.pem
echo 02 > serial.txt
cd ..
# Creating the Server Keystore
openssl req -days 3650 -newkey rsa:1024 -keyout server/server.key -out server/server.req
openssl x509 -extensions usr_cert -extfile C:\testbed\OpenSSL-Win32\bin\openssl.cfg -CA ca/ca.pem -CAkey ca/ca.key -CAserial ca/serial.txt -req -in server/server.req -out server/server.crt
openssl pkcs12 -export -inkey server/server.key -in server/server.crt -out server/server.p12 -name server
keytool -importkeystore -destkeystore server/server.jks -deststoretype jks -srckeystore server/server.p12 -srcstoretype pkcs12
keytool -exportcert -alias server -keystore server/server.jks -file server/server.cer
# Create the Client Keystore
openssl req -days 3650 -newkey rsa:1024 -keyout client/client1.key -out client/client1.req
openssl x509 -extensions usr_cert -extfile C:\testbed\OpenSSL-Win32\bin\openssl.cfg -CA ca/ca.pem -CAkey ca/ca.key -CAserial ca/serial.txt -req -in client/client1.req -out client/client1.crt
openssl pkcs12 -export -inkey client/client1.key -in client/client1.crt -out client/client1.p12 -name client1
keytool -importkeystore -destkeystore client/client1.jks -deststoretype jks -srckeystore client/client1.p12 -srcstoretype pkcs12
keytool -exportcert -alias client1 -keystore client/client1.jks -file client/client1.cer
# Import public keys and certificates into each others keystores
keytool -import -noprompt -trustcacerts -alias client1 -file client/client1.cer -keystore server/server.jks
keytool -import -noprompt -trustcacerts -alias server -file server/server.cer -keystore client/client1.jks
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore server/server.jks
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore client/client1.jks
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\cacerts.jks"
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore "C:\Program Files\Java\jdk1.6\jre\lib\security\cacerts"
move "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\keystore.jks" "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\keystore.jks.backup"
copy server\server.jks "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\keystore.jks"
GlassFish 管理コンソールで、http リスナーのセキュリティを有効にし、SSL3、TLS、およびクライアント認証のボックスにチェックを入れ、証明書のニックネームをサーバーに、キー ストアを config\keystore.jks に、トラスト ストアを config\keystore.jks に設定します。 、信頼アルゴリズムを PKIX に変更し、証明書の最大長を 5 のままにします。
NetBeans で、新しい Web アプリケーション プロジェクトを作成します。その中で、新しい Web サービスを作成します。
私の Web サービス コードは次のようになります。
@WebService()
public class ListProducts {
@Resource WebServiceContext context;
@WebMethod(operationName = "listProducts")
public String listProducts() {
return context.getUserPrincipal().toString();
}
}
Web サービスを右クリックし、[Web サービス属性の編集] を選択します。[セキュア サービス] ボックスにチェックを入れ、[セキュリティ メカニズム] として [相互証明書セキュリティ] を選択します。[構成...] ボタンをクリックし、[署名の暗号化] ボックスにチェックを入れます。Use Development Defaults ボックスのチェックを外し、Keystore ボタンをクリックします。server.jks キーストアの場所を設定し、server
エイリアスを選択します。トラストストア構成についても同じことを行います (ただし、ここでエイリアスを選択する必要はありません)。
client1.p12 クライアント証明書をブラウザーにインポートします。Web サービスを Glassfish にデプロイします。ブラウザーで Web サービスを開き、デプロイされた WSDL を HTTPS 経由で参照します。WSDL およびその他のスキーマをダウンロードします。WSDL2Java を使用するときに NetBeans がリモート リソースを使用しないように、参照されているスキーマの名前をローカル コピーに変更します。(この段落は、承認された証明書を持つクライアントに WSDL を制限したためですが、問題の証明書にアクセスできないため、NetBeans はそれをリモートでフェッチできません)。
新しい Java プロジェクトを作成します。新しい Web サービス クライアントを作成します。プロンプトが表示されたら、保存した WSDL ファイルを NetBeans に指定します。METRO2.0 ライブラリ ファイルをインポートします ( C:\Program Files\Netbeans 6.9\enterprise\modules\ext\metr\webservices-*.jar
)。私のコードは次のようになりました:
public static void main(String[] args) {
System.getProperties().put("javax.net.ssl.keyStore", "C:\\NetBeansProjects\\security-04\\ssl\\client\\client1.jks");
System.getProperties().put("javax.net.ssl.keyStorePassword", "changeit");
System.getProperties().put("javax.net.ssl.trustStore", "C:\\NetBeansProjects\\security-04\\ssl\\client\\client1.jks");
System.getProperties().put("javax.net.ssl.trustStorePassword", "changeit");
System.out.println(new ListProductsService().getListProductsPort().listProducts());
}
webservices-api.jar を Java\jdk1.6\jre\lib\endorsed ディレクトリにコピーします。Web サービス参照を右クリックし、[Web サービス属性の編集] を選択します。キーストアの場所を client1.jks に設定し、エイリアスを に設定しclient1
ます。トラストストアの場所を client1.jks に設定し、エイリアスを に設定しserver
ます。
うまくいけば、クライアントを実行できるようになり、次のような出力が表示されるはずです。
EMAILADDRESS=bob@anonymous.org, CN=Bob Smith, OU=Something, O=SomethingElse, L=AnyTown, ST=AnyState, C=US