0

次のシナリオに進む方法がわかりません。

次のようなセキュリティでWCFサービスを稼働させています。

<binding name="SSLBinding">
   <security mode="Transport">
     <transport clientCredentialType="None"/>
     <!--<message clientCredentialType="UserName"/>-->
   </security>
 </binding>

IIS 5.0 でダミーの証明書を作成できたので、この WCF を HTTPS で公開できます。

最後に、.Net クライアントを使用して、次のようにサービスと通信できます。

private void randomMethod
    {
        //This is necesary, cause the certificate isn´t valid
        ServicePointManager.ServerCertificateValidationCallback =
        new RemoteCertificateValidationCallback(IgnoreCertificateErrorHandler);            

            RefHTTPS.GestionesServiceClient service = new RefHTTPS.GestionesServiceClient();                

            richTextBox1.Text = service.version();                            
    }

    public static bool IgnoreCertificateErrorHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }

問題: Java クライアントでこれを実行しようとすると、例外が発生します。

誰かがこのようなことをすることができました。ここでいくつかのガイダンスが必要です。

ウェブでたくさんの投稿を読みましたが、何もうまくいきません。


編集(OPの追加コンテンツからマージされ、質問として投稿され、フラグが付けられました):

これは完全な構成です (構成タグがありますが、表示されていません):

<?xml version="1.0"?>
<system.web>
    <compilation debug="true">          
    </compilation>              
</system.web>  

<system.serviceModel>
    <bindings>

 <binding name="SSLBinding">
   <security mode="Transport">
     <transport clientCredentialType="None"/>
   </security>
 </binding>

</bindings>
<serviceHostingEnvironment>
  <baseAddressPrefixFilters>
    <add prefix="https://x.x.x.x"/>
  </baseAddressPrefixFilters>
</serviceHostingEnvironment>

<services>
   <service behaviorConfiguration="WSGestiones.GestionesServiceBehavior" name="WSGestiones.GestionesService">
      <endpoint address="https://x.x.x.x/GestionesWS/GestionesService.svc"
         binding="basicHttpBinding" bindingConfiguration="SSLBinding" contract="WSGestiones.IGestionesService">            
        <identity>
          <dns value="localhost" />              
         </identity>
      </endpoint>
      <endpoint address="https://x.x.x.x/GestionesWS/GestionesService.svc/mex"
         binding="mexHttpsBinding" contract="IMetadataExchange">
         <identity>
            <dns value="IPADDRESS" />
         </identity>
      </endpoint>
   </service>      
</services>    

<behaviors>
  <serviceBehaviors>
    <behavior name="WSGestiones.GestionesServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" httpsGetUrl="https://x.x.x.x/GestionesWS/GestionesService.svc" />
      <serviceDebug includeExceptionDetailInFaults="true" />          
    </behavior>        

   </serviceBehaviors>
</behaviors>

PC の信頼できるリストに証明書を追加することができました。また、JDK または Java の任意の場所にも追加しました。

私のエラーのいくつかは次のとおりです。

Exception in thread "main" javax.xml.ws.WebServiceException: Cannot find 'https://x.x.x.x/GestionesWS/GestionesService.svc?wsdl' wsdl. Place the resource correctly in the classpath.

HTTP transport error: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present

Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)

Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.io.IOException: HTTPS hostname wrong:  should be <x.x.x.x>

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: An error occurred when verifying security for the message.

Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 401: Access Denied

エラーが発生し、オンラインで検索して「修正」するたびに、新しいエラーが表示されます....「修正」の5日目に、「これは無限ループです」と言います。

だから....エラーを修正しようとする代わりに、「ロジックを修正する」ことを考えていました。

4

1 に答える 1

0

また、Netbeans 経由でサービス エンドポイントの自己署名証明書を使用してサーバーに接続しようとしていました。新しい接続オブジェクトを作成しようとしたときに、次の実行時例外が発生しました。

javax.xml.ws.WebServiceException: java.io.IOException: HTTPS hostname wrong: should be <hostname as in the certificate>

そして、Metro のドキュメントで、この例外に関するセクションをようやく見つけました。残念ながら、彼らが提供するコードは一時的な解決策のみを意図しているように見えますが、少なくともこの問題を回避できるようです.

サービスのために接続するサイトを常に「検証」するメインメソッドの上部で呼び出す静的メソッドを作成することにより、提供されたコードを変更しました。

private static void overrideDefaultHostnameVerifier() {
    //WORKAROUND. TO BE REMOVED.
    javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
            new javax.net.ssl.HostnameVerifier() {
                @Override
                public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
                    return true;
                }
            });
}

この問題の真の解決策は、サービス エンドポイントをホストするサーバーで実際に発行された証明書を取得することです。

于 2013-01-17T15:56:19.040 に答える