WCF: ошибки при конфигурировании сертификатов
Для целей разработки и тестирования достаточно часто используются self signed сертификаты, что иногда вызывает проблемы, если использовать настройки, выставленные по умолчанию в WCF, т.к. эти настройки ориентированы на промышленную среду. Далее постараюсь рассказать, как в среде разработке можно преодолеть некоторые ошибки.
Keyset does not exist.
Данная ошибка может быть связана с тем, что у обращающегося пользователя не достаточно прав на доступ к приватному ключу сертификата.
Права могут быть даны с использование утилиты WinHttpCertCfg.exe: WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s "<сертификат>" -a "<пользователь>".
Либо с использованием MMC Certificates: выбираете сертификат и команду "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:
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.