私は解決できない問題があります。詳細を説明しましょう。私はこの技術が初めてだから間違った言葉を使っているかもしれません。理解していない場合は、説明を訂正し、説明を求めてください。 私はWPFアプリケーションでホストされている、自己ホストWCF RESTサーバーを作成しています。 WebHttpSecurityMode.Transportでhttps、SLLを使用します。自分で生成した証明書を使用しています。 このサービスを使用するWinFormsクライアントを作成したいと思います。サーバーからの応答形式はJSONです。 X509CertificateValidatorから継承したカスタムバリデーターを使用してクライアント上の証明書を検証したいとします。WCF、REST、SSL、クライアント、カスタム証明書の検証
これは私のサーバー側のコードです。私はうまく動作するカスタムユーザー名バリデータを使用しています。自分のマシン上のIISマネージャーで、証明書(Windows 7)を生成した既定のWebサイト>バインディングの証明書を構成しました。呼び出しservice.GetCustomers上
WebServiceHost sh = new WebServiceHost(typeof(ReachService));
string uri = "https://localhost:9000/Service";
WebHttpBinding wb = new WebHttpBinding();
wb.Security.Mode = WebHttpSecurityMode.Transport;
wb.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
sh.AddServiceEndpoint(typeof(IReachService), wb, uri);
sh.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new CustomUserNameValidator();
sh.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
sh.Open();
と、これは私のクライアントコードである
Uri uri = new Uri("https://localhost:9000/Service");
WebChannelFactory<ReachService> cf = new WebChannelFactory<IReachService>(uri);
WebHttpBinding wb = cf.Endpoint.Binding as WebHttpBinding;
wb.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
wb.Security.Mode = WebHttpSecurityMode.Transport;
cf.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
cf.Credentials.ServiceCertificate.Authentication.CustomCertificateValidator = new CustomCertificateValidator("PL2"); // this is the name that issued the certificate
cf.Credentials.UserName.UserName = "user1";
cf.Credentials.UserName.Password = "user1";
IReachService service = cf.CreateChannel();
try
{
CustomersList auth = service.GetCustomers();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
()私が手: は権威 とSSL/TLSのセキュリティで保護されたチャネルの信頼関係を確立できませんでした「localhostの:9000を' InnerExceptionメッセージ: 基になる接続が閉じられました:SSL/TLSセキュアチャネルの信頼関係を確立できませんでした。 InnerExceptionメッセージ: 検証手順に従って、リモート証明書が無効です。
ブラウザでテストするとサーバーが正常に動作しています。 しかし、カスタムのcertバリデータークラスに移動しないため、クライアントコードが間違っています。このクラスはMSDNのhttp://msdn.microsoft.com/en-us/library/system.identitymodel.selectors.x509certificatevalidator.aspxの例と同じです。
誰でもこのアプローチでどこが間違っているのか教えてください。
さらに詳しい情報が必要な場合はお尋ねください。あなたは、クライアント上でWCFを使用し、その後WebHttpBindingを使用していない、それははるかに良い仕事しますSOAPのものに固執する場合
はあなたに
こんにちはダレルを、あなたの答えに感謝。私はWebHttpBindingを使用しているので、モバイルプラットフォーム上で複数のタイプのクライアントをサポートできます(つまり、Win7、Android、iPhone)をサポートしています。私は最初にWinFormsクライアントを作成して、自分が何をする必要があるのか理解したかったのです。 – elector
@electorそれは素晴らしいです。 WCFチャンネルの代わりに標準HTTPクライアントを使用していることを確認してください。そうすれば、異なるプラットフォーム間のクライアントがより一貫して動作します。 –
Darrelさん、ありがとうございますが、標準のhttpクライアントが何を意味するのか分かりません。 :)あなたはC#の例をすぐに知っていますか?それとも私は何のためにgoogleする必要がありますか?私が言うように、私はこれに新しいので、情報のすべてのビットが多くの助けになります。 – elector