WCF сертификат безопасности с моно - PullRequest
3 голосов
/ 22 июля 2011

Я пытаюсь перенести существующее приложение в 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 объект сертификата теперь имеет закрытый ключ. Исключение остается прежним. Так что это не проблема хранилища сертификатов.

1 Ответ

2 голосов
/ 22 июля 2011

Да, сертификаты, созданные в Windows, обычно не содержат закрытый ключ. Их можно найти в каком-то кеше. Вы должны быть в состоянии создать сертификат с закрытым ключом, используя эту инструкцию. X509Certificate2 должен использовать файл без проблем. Вы также можете попробовать процедуру, описанную здесь . В случае каких-либо проблем просто напишите.

Также стоит добавить, что сертификаты, созданные таким образом в Linux, прекрасно работают и в Windows.

Обновление:

Я не уверен, правильно ли я понял ваш комментарий. Вы можете загрузить сертификат PFX, используя такой код:

var myCert = new X509Certificate2("filename.pfx", "password");

Учитывая, что сертификат содержит ключ, он работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...