Robię zabezpieczenie/szyfrowanie serwisu WCF certyfikatem. Moje podejście jest trochę inne bo nie instaluję certyfikatu na komputerze tylko czytam go z pliku.
Powinno to zadziałać w sposób, że po stronie klienta będzie certyfikat tylko z kluczem publicznym (.cer) a po stronie serwisu z publicznym i prywatnym (.pfx)
Tymczasem jeżeli umieszczę po stronie klienta certyfikat tylko z kluczem publicznym (.cer) przy próbie odezwania się do serwisu otrzymuję wyjątek: "Klucz prywatny nie występuje w certyfikacie X.509." Dlaczego ? Jest to certyfikat który wygenerowałem sobie sam ale chyba nie powinno mieć to znaczenia. Tak wygląda kod.
KLIENT:
Odzywam się do serwisów poprzez chanellFactory
channelFactory = new ChannelFactory<IMyService>("IMyService", myEndpoint);
using (var stream = Assembly.GetManifestResourceStream("KlientProject.Certificate.Cert.cer"))
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
channelFactory.Credentials.ClientCertificate.Certificate = new X509Certificate2(bytes, string.Empty);
}
channelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.Custom;
channelFactory.Credentials.ServiceCertificate.Authentication.CustomCertificateValidator = new CustomCertificateValidator();
//WALIDATOR I CERTYFIKAT ZNAJDUJĄ SIĘ PO STRONIE KLIENTA
SERWER
var myServiceHost = new ServiceHost(typeof(MyService));
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyService.Host.Certificate.Cert.pfx"))
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
myServiceHost.Credentials.ServiceCertificate.Certificate = new X509Certificate2(bytes, string.Empty);
}
var authentication = myServiceHost.Credentials.ClientCertificate.Authentication;
authentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
authentication.CustomCertificateValidator = new CustomCertificateValidator();
myServiceHost.Open();
//WALIDATOR I CERTYFIKAT ZNAJDUJĄ SIĘ PO STRONIE SERWERA
Macie jakieś pomysły dlaczego mam ten błąd? Pomyślałem jeszcze że moooże moooże jak ten certyfikat będzie wydany przez CA to tego błędu nie będzie ale wątpię.
- Drugie pytanie dziwi mnie dlaczego to działa w ten sposób że jak robię zapytanie z klienta do serwisu poprzez chanellFactory to wygląda to tak:
- wywołanie metody z callera
- wywołanie customCertificateValidator po stronie klienta i tutaj PYTANIE ->** do parametru certificateToValidate w tej metodzie wpada certyfikat z serwisu czyli mogę sobie podejrzeć go. W sumie nie wiem jakie tam są dane przekazane ale zastanawiam się po co jest po stronie klienta CustomCertificateValidator dlaczego nie jest tylko po stronie serwera?**
- CustomCertificateValidator po stronie serwisu
- wywołanie metody