Цепочка сертификатов WCF, проверьте программно - PullRequest
7 голосов
/ 25 августа 2011

Я пытаюсь использовать сертификаты программно, а не в магазине. Я создаю X509Certificate2 с именем файла и паролем.

Это прекрасно работает, когда я вручную добавил корневой сертификат в хранилище сертификатов в Trusted People. Однако я бы предпочел не делать этого при каждом развертывании - я бы предпочел также заниматься этим программно.

Когда я удаляю корневой сертификат из хранилища сертификатов, я получаю исключение.

Все, что я прочитал, похоже, говорит о том, что мне нужно вручную добавить корневой сертификат в хранилище сертификатов, иначе трастовая цепочка не будет работать.

Вопрос: существует ли программный способ настройки трастовой цепочки, поэтому мне не нужно делать это вручную?

Код выглядит так:

        var serverCert = new X509Certificate2("FullPathToMyCertificate.cer", "Password");
        Client.ClientCredentials.ServiceCertificate.DefaultCertificate = serverCert;

Исключение, возникающее при попытке использования Клиента:

System.IdentityModel.Tokens.SecurityTokenValidationException 

The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US is not in the trusted people store. 
The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US chain building failed. 
The certificate that was used has a trust chain that cannot be verified. 
Replace the certificate or change the certificateValidationMode. 
A certificate chain could not be built to a trusted root authority.

1 Ответ

4 голосов
/ 26 августа 2011

Используемый компонент проверяет цепочку по умолчанию - когда цепочка не может быть проверена, вы получаете это исключение. Если вы хотите сделать все, включая проверку цепочки в коде, вам нужно реализовать «пользовательскую проверку» и интегрировать ее в хост WCF :

Client.ServiceCertificate.Authentication.CertificateValidationMode =
              X509CertificateValidationMode.Custom;
Client.ServiceCertificate.Authentication.CustomCertificateValidator =
    new MyCertificateValidator();

Другой вариант - отключить валидацию ( НЕ для производства !!! )

Client.ServiceCertificate.Authentication.CertificateValidationMode =
              X509CertificateValidationMode.None;

РЕДАКТИРОВАТЬ - после комментария:

Для самостоятельной проверки цепочки вы должны взглянуть на X509Chain и X509Store - чтобы понять, как можно реализовать такую ​​проверку цепочки, взгляните на Mono's реализация Verify ... в основном, вы используете метод Find для поиска X509Certificate2Collection для родителя и так далее ... критерии проверки с пользовательской проверкой до вас ( действительная подпись, срок действия которой не истек ...).

некоторые справочные ссылки на MSDN:

...