WCF: ошибки при конфигурировании сертификатов

Для целей разработки и тестирования достаточно часто используются self signed сертификаты, что иногда вызывает проблемы, если использовать настройки, выставленные по умолчанию в WCF, т.к. эти настройки ориентированы на промышленную среду. Далее постараюсь рассказать, как в среде разработке можно преодолеть некоторые ошибки.

Keyset does not exist.

Данная ошибка может быть связана с тем, что у обращающегося пользователя не достаточно прав на доступ к приватному ключу сертификата.

Права могут быть даны с использование утилиты WinHttpCertCfg.exe: WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s "<сертификат>" -a "<пользователь>".

Либо с использованием MMC Certificates: выбираете сертификат и команду "Manage private keys", далее выбираете пользователя и выставляете ему соответствующие права.

Manage private keys

The certificate CN= must have a private key that is capable of key exchange. The process must have access rights for the private key.

Ошибка означает, что используемый сертификат должен содержать в себе приватный ключ, т.е. сертификат должен быть сгенерирован, например, с префиксом -pe. Проверить наличие приватного ключа можно через консоль Certificates:

Viewing private key

The X.509 certificate CN= 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.

Ошибка означает, что достоверность сертификата не можут быть проверена, обычно подобная ошибка относится к self signe сертификатом. Для устранения ошибки правила проверки подлинности сертификатов могут быть изменены:

<

behaviors>

<

endpointBehaviors>

<

behavior name="ClientCertificateBehavior">

<

clientCredentials>

<

serviceCertificate>

<

authentication certificateValidationMode="PeerOrChainTrust" />

<!--

<authentication certificateValidationMode="None" />-->

</

serviceCertificate>

</

clientCredentials>

</

behavior>

</

endpointBehaviors>

</

behaviors>

Could not establish secure channel for SSL/TLS with authority

Данная проблема может быть связана с различиями в имени компьютера и полем issue-to сертификата. Для устранения проблемы же можно применить кастомную проверку сертификата:

Приведенный ниже пример всегда возвращает true, что означает "правильность" сертификата.

ServicePointManager

.ServerCertificateValidationCallback = (obj, certificate, chain, errors) => true.