Я пытаюсь перенести существующее приложение в Mono (v2.10.2).
Поэтому я создал тестовую службу WCF с BasicHttpBinding и защитой сообщений. Клиент отлично работает с .NET, но при работе с Mono происходит сбой.
Фабрика клиента создается следующим образом:
//var certificate = CertificateUtil.GetCertificate(StoreLocation.LocalMachine,
// StoreName.My, X509FindType.FindBySubjectDistinguishedName, CertName, true);
var certificate = new X509Certificate2("certificate.pfx", "password");
var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.Message;
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
var epa = new EndpointAddress(
new Uri("http://localhost:53076/Service1.svc"),
new X509CertificateEndpointIdentity(certificate));
var factory = new ChannelFactory<IService1>(binding, epa);
factory.Credentials.ServiceCertificate.DefaultCertificate = certificate;
factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
factory.Credentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
factory.Credentials.ClientCertificate.Certificate = certificate;
var client = factory.CreateChannel();
В Mono происходит сбой приложения в CreateChannel, вызывая исключение:
System.InvalidOperationException: привязка не поддерживает ни один из типов каналов, которые разрешены контрактом IService1.
Я отладил исходный код Mono и обнаружил, что проблема в том, что AsymmetricSecurityBindingElement.InitiatorTokenParameter == null.
Я новичок в Mono, возможно, вы могли бы указать мне документацию / учебник, который охватывает эту тему.
UPDATE:
С помощью konrad.kruczynski объект сертификата теперь имеет закрытый ключ. Исключение остается прежним. Так что это не проблема хранилища сертификатов.