1

私たちは 1 週間、問題の解決策を探していましたが、多くの同様の投稿を調べ、利用可能なドキュメントをすべて読んだ後も、解決策はありませんでした。

現在の状況を説明し、誰かが問題を解決するのを手伝ってくれることを願っています.

別のプラットフォームのサーバー側 Web サービスと通信する Web サービス クライアントを JAX-WS で開発しました。通信は双方向SSLであり、サーバー側のCAを信頼して信頼し、サーバー側で識別するためのプライベート証明書を持っています。

私たちの Web サービス クライアントは Weblogic 10.3 にデプロイされており、サーバー側の Web サービスを呼び出すときに、トラストストアとキーストアを動的にロードします。これには証明書が 1 つだけロードされます。別の証明書を使用するため、静的キーストアのみを使用することはできません。

問題は、接続を確立し、ハンドシェイクをネゴシエートするときです。Weblogic は、呼び出しの前にロードしたトラストストアとキーストアを無視し、信頼できる証明書と Weblogic のキーストア内の秘密鍵のみを探すためです...

信頼できる証明書を Weblogic のトラストストアに入れて、通信を再開するとします。ハンドシェイクを開始し、サーバー側を信頼します (Weblogic がそのキーストアで CA を見つけるため)、しかし、Web サービス クライアントがサーバー側によって信頼される証明書を送信する必要がある場合、「証明書チェーン」は空であり、 「BAD_CERTIFICATE」を取得します。

Apache CXF と JAX-WS を試してみましたが、問題は同じで、システム プロパティとライブラリを使用してキーストアを設定しています...そのため、Web サービス クライアントが証明書を送信できない理由がわかりません。何らかの理由で Weblogic がサービスを提供していないようですが、おそらく Weblogic の構成ですが、わかりません。

私たちに何ができるか知っている人がいたら教えてください。

前もって感謝します。

4

3 に答える 3

0

Weblogic の設定を変更するまで、SSL と JAX-WS で多くの問題が発生しました: JSSE を使用します。weblogic のバージョン (10.3.x、x はすべてを変更します) によっては、これが可能な場合と不可能な場合があります。10.3.3 と 10.3.5 で動作しましたが、これらはすべて Weblogic 11g です。この変更は、コンソール (セキュリティ、高度) またはコマンド ライン -Dweblogic.security.SSL.enableJSSE=true を使用して行うことができます。

その理由は、SSL の以前の Oracle 実装 (JSSE を使用していない場合) では、アルゴリズムとキーのサイズによっては一部の証明書が受け入れられないためです。さらに、この実装は異なる設定を使用し、javax.net.ssl.keyStore などの設定には JSSE 設定を使用しません...

私は現在、この JSSE + -Djavax.net.debug=ssl:verbose を使用しており、すべてが明確です。

于 2013-09-03T09:47:09.877 に答える
0

問題は、クライアント側とサーバー側の SSL 構成です。SSL ハンドシェイクの問題は、Web サービスの構成とは関係ありません。Web サービスは HTTP を経由し、HttpsURLConnectionこれを処理するのは Java です。

双方向 SSL ハンドシェイクには次のものが必要です。

クライアント側

  • サーバー証明書はキーストアにある必要があります。または、Web サービス クライアントを使用する前に、説明に従ってこの設定を無効にすることもできます。

コード:

// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
      }

    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
      }
} };

// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
}
  • サーバー証明書の「サーバー名」は、Web サービス エンドポイント ( ) へのアクセスに使用している URL と一致する必要があります。checkURLSpoofingまたは、サービス クライアントを使用する前に、この検証設定をオフにしてください。

コード:

// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
       return true;
    }
};

// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
  • 証明書を正しく送信するようにクライアント側を構成します。Web サービス クライアントを使用する前にこれを設定します。

コード:

System.setProperty("javax.net.ssl.keyStore", "path/to/your/key");
System.setProperty("javax.net.ssl.keyStorePassword", "your-keystore-password");
System.setProperty("javax.net.ssl.keyStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "path/to/your/trust/keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "your-truststore-password");
System.setProperty("com.sun.net.ssl.dhKeyExchangeFix", "true");

サーバ側

  • サーバーが使用する信頼ストアにクライアント証明書を追加します

問題が続く場合は、スタックトレース (クライアントとサーバー) を追加して、何が起こっているかを確認してください。

于 2012-07-12T09:10:29.830 に答える
0

ステップバイステップの指示。

「 WebLogic ServerのSSL コンフィグレーション」、「クライアント アプリケーションの双方向 SSL のコンフィグレーション」 、および「双方向 SSL のコンフィグレーション」を参照してください。

keytool -genkey -alias server-alias -keyalg RSA -keypass changeit_0 -storepass changeit_1 -keystore server_keystore.jks -validity 1825
keytool -export -alias server-alias -storepass changeit_1 -file server.cer -keystore server_keystore.jks

keytool -genkey -alias client-alias -keyalg RSA -keypass changeit_2 -storepass changeit_3 -keystore client_keystore.jks -validity 1825
keytool -export -alias client-alias -storepass changeit_3 -file client.cer -keystore client_keystore.jks
#WLHOME\server\lib\cacerts
keytool -import -v -trustcacerts -alias client-alias -file client.cer -keystore cacerts -keypass changeit_2 -storepass changeit


Server->Keystores
Keystores: Custom Identity and Custom Trust
Custom Identity Keystore: server_keystore.jks
Custom Identity Keystore Type: JKS
Custom Identity Keystore Passphrase: changeit_1
Custom Trust Keystore: <WLHOME>\server\lib\cacerts
Custom Trust Keystore Type: JKS
Custom Trust Keystore Passphrase: changeit

Server->General
SSL Listen Port Enabled: true

Server->SSL
Private Key Alias: server-alias
Private Key Passphrase: changeit_0
Hostname Verification: None
Use Server Certs: true
Two Way Client Cert Behavior: Client Certs Requested and Enforced
SSLRejection Logging Enabled: true

1) サービスヘッダー。

@WebService
@Policy(uri = "policy:Wssp1.2-2007-Https-ClientCertReq.xml")

2) クライアント HandlerResolver。

package org.ru5.test;

import java.util.*;
import javax.xml.namespace.QName;
import javax.xml.ws.*;

public class MustUnderstandHeadersHandler implements HandlerResolver {
    @Override
    public List<Handler> getHandlerChain(PortInfo portInfo) {
        final List<Handler> handlerList = new ArrayList<Handler>(1);
        handlerList.add(new MustUnderstandHeadersSOAPHandler());
        return handlerList;
    }

    private class MustUnderstandHeadersSOAPHandler implements SOAPHandler<SOAPMessageContext> {
        private static final String LOCAL_PART = "Security";
        private static final String PREFIX = "wsse";
        private static final String URI =
                "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";

        @Override
        public Set<QName> getHeaders() {
            final QName securityHeader = new QName(URI, LOCAL_PART, PREFIX);
            final Set<QName> headers = new HashSet<QName>();
            headers.add(securityHeader);
            return headers;
        }

        @Override
        public boolean handleMessage(SOAPMessageContext context) {
            return true;
        }

        @Override
        public boolean handleFault(SOAPMessageContext context) {
            return true;
        }

        @Override
        public void close(javax.xml.ws.handler.MessageContext context) {
        }
    }
}
于 2013-06-03T08:56:26.600 に答える