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によって署名されていませんが、これが信頼できる人に追加した理由です。
私は何が欠けていますか?何が足りないのですか?
秘訣は、クライアント証明書を有効にすることでした。
これを行うには、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"
このエラーが発生した理由は、webconfigでWebサービスのURLがhttp://localhost/myservicename.svc
であり、開発サーバーでFQDN http://dev.myname.com/myservicename.svc.
があったためです。
Web.configsを再確認して、WebサービスへのURLが適切な場所を指していることを確認します。