2

StackOverflow、ブログ、その他のサイトで約 1000 の投稿を見てきましたが、私が抱えている問題を明らかにするものはありませんでした。

設定:

  • .NET Framework 3.5 (申し訳ありませんが、アップグレードできません)、WebHttpBinding を使用する WCF セルフホステッド サービス (IIS ではありません)
  • インターフェイスで WebGet を使用する単一のエンドポイント
  • NO .config ファイル -- すべてがプログラムで作成されています
  • サービスはカスタム ポートにバインドされており、他のサービスや Web サイトとポートを共有していません

導入対象:

  • XP SP3、2003、Vista、7、8、2008

問題: Vista、7、8、2008 では問題ありません。HTTP と HTTPS でサービスを起動し、localhost にバインドされた自己署名証明書とカスタム ポートのマシン名を使用して実行しています。

  • しかし、XP では、HTTP でしか機能しないため、サービス自体が適切に機能していることはわかっています。HTTPS で、SSL の障害により接続できません。
  • ブラウザで直接 URL にアクセスすると、SSL 例外が表示されます。
  • IE では、証明書が信頼されていないという警告が表示されます。例外を許可すると、サービスに到達して実行されます。信頼できるサイトに追加https://localhostすると、警告が表示されなくなり、問題なく URL にアクセスできます。
  • Chrome で同じ URL にアクセスすると、エラー 107 ERR_SSL_PROTOCOL_ERROR が表示され、バイパスできません。
  • Firefox で ssl_error_rx_record_too_long エラーが発生し、これもバイパスできません。

証明書のいくつかの順列とサービスへの割り当て方法 (httpcfg など) を試しましたが、結果はすべて同じ (またはさらに悪い) でした。そこで、自分が行ったことを把握しようとして行ったり来たりして、既存の設定をバラバラにする代わりに、2 つの質問があります。

  1. IISなしでローカルホスト用のXPで信頼できる証明書を作成することさえ可能ですか...
  2. プログラムですべてを実行して、自己ホスト型の WCF サービスにバインドする最良の方法は何ですか? これを繰り返すのは、これらの問題について支援を得ようとする他の試みは、常に構成ファイルに何を入れるべきかを教えてくれる人々につながるからです。

心に留めておくべきこと:私はすでに、自己署名証明書を使用した SSL の下で Windows バージョン > XP/2003 でこれをすべて正常に動作させているので、基本がある程度健全であることを知っています。XPでlocalhost用に証明書をセットアップできないようです。

4

2 に答える 2

0

私の答えは、クライアント コードから WCF 呼び出しを行っていた場合、「SSL/TLS セキュアの信頼関係を確立できませんでした....」という例外が発生するという仮定に基づいています。

その場合は、カスタムの ICertificatePolicy を実装し、WCF の呼び出し中に使用することをお勧めします。実装例を次に示します。

using System.Net;  
using System.Net.Security;  
using System.Security.Cryptography.X509Certificates;  

namespace Foo.bar
{  
       public class MyCertificatePolicy : ICertificatePolicy  
        {


            public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)  
            {  
                //Due an Invalid Certificate used in the  site, we must return true to all invalid SSL Request. Alternately, write the logic to validate the server certificate 
                return true;  
            }



            public static bool RemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)  
            {  
                //Due an Invalid Certificate used in the site, we must return true to all invalid SSL Request  
                return true;  
            }  
        }  
    }  
于 2013-01-07T16:01:53.217 に答える
0

私の場合、私は次のようにします:

ServiceHost host = new ServiceHost(typeof(MyRequests), baseAddresses);

次に、メタデータをセットアップします。

ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpsGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);

Windows 認証とメッセージ セキュリティのために、ws バインディングを作成してセットアップします。

WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);

b.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
b.MaxReceivedMessageSize = Int32.MaxValue;
// auth setup
X509ClientCertificateAuthentication myAuthProperties =
    host.Credentials.ClientCertificate.Authentication;
myAuthProperties.IncludeWindowsGroups = true;
// add endpoint
ServiceEndpoint endpnt = host.AddServiceEndpoint(typeof(IMyRequests), b, "MyService");

//GO!
host.Open();

これが役立つことを願っています。

于 2013-01-09T11:57:39.670 に答える