web-dev-qa-db-ja.com

HTTPリクエストは、クライアント認証スキーム「匿名」で禁止されていました

SSLで動作するようにWCFサーバー\クライアントを構成しようとしています

次の例外が発生します。

HTTPリクエストは、クライアント認証スキーム「匿名」で禁止されていました

セルフホストのWCFサーバーがあります。 hhtpcfgを実行しましたが、クライアント証明書とサーバー証明書の両方がローカルマシンの個人および信頼できる人の下に保存されています

サーバーコードは次のとおりです。

binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
binding.Security.Mode = WebHttpSecurityMode.Transport;
_Host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerOrChainTrust;
_Host.Credentials.ClientCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
_Host.Credentials.ClientCertificate.Authentication.TrustedStoreLocation = StoreLocation.LocalMachine;
_Host.Credentials.ServiceCertificate.SetCertificate("cn=ServerSide", StoreLocation.LocalMachine, StoreName.My);

クライアントコード:

binding.Security.Mode = WebHttpSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 
WebChannelFactory<ITestClientForServer> cf =
                new WebChannelFactory<ITestClientForServer>(binding, url2Bind);
cf.Credentials.ClientCertificate.SetCertificate("cn=ClientSide", StoreLocation.LocalMachine, StoreName.My);
            ServicePointManager.ServerCertificateValidationCallback
                   += RemoteCertificateValidate;

Web_tracelog.svclogとtrace.logを見ると、サーバーがクライアント証明書を認証できないことがわかります。私の証明書は承認されたCAによって署名されていませんが、これが信頼できる人に追加した理由です。

私は何が欠けていますか?何が足りないのですか?

15
Dudi

秘訣は、クライアント証明書を有効にすることでした。

これを行うには、2つのオプションがあります。

1)自己署名してから、「信頼されたルート証明機関」の下に置きます。

明らかに、本番環境では、クライアント証明書を自己署名ではなく、信頼できるCAによって署名する必要があります。 http://msdn.Microsoft.com/en-us/library/ms733813.aspx を参照してください

2)作成した別の証明書(MyCAと呼びます)でクライアント証明書に署名し、MyCAを「信頼されたルート証明機関」に配置し、クライアント証明書を「信頼された人々」に配置します。このようにして、開発環境はデプロイメントにさらに近くなります。

証明書を作成して署名する方法: http://msdn.Microsoft.com/en-us/library/bfsktky3.aspx を参照してください。

これが私が使用した一連のコマンドです:

1)makecert -r -pe -ss My -sr LocalMachine -a sha1 -sky exchange -n cn = MyCA -sv "MyCAPrivate.pvk"

2)makecert -pe -ss My -sr LocalMachine -a sha1 -sky exchange -n cn = SignedClientCertificate -iv "MyCAPrivate.pvk" -ic "MyCAPublic.cer"

7
Dudi

このエラーが発生した理由は、webconfigでWebサービスのURLがhttp://localhost/myservicename.svcであり、開発サーバーでFQDN http://dev.myname.com/myservicename.svc.があったためです。

Web.configsを再確認して、WebサービスへのURLが適切な場所を指していることを確認します。

1
Flea