Аутентификация доверия цепочки сертификатов WCF: «вызывающая сторона не была аутентифицирована службой». - PullRequest
6 голосов
/ 07 сентября 2011

Я хотел бы использовать шифрование и проверку на основе сертификатов при взаимодействии со службой WCF. Поэтому я создал тестовые сертификаты, «TempCA» в качестве моего корневого CA и «SignedByCA» в качестве клиентского сертификата, подписанного этим CA.

Когда я помещаю сертификат клиента в «Local Computer \ Trusted People» и использую certificateValidationMode="PeerTrust", служба распознает клиента, и все работает как положено. Но с проверкой цепочки доверия (certificateValidationMode="ChainTrust") я сталкиваюсь с ошибкой «Вызывающая сторона не была аутентифицирована службой».

Соответствующая конфигурация на стороне сервера:

<behaviors>
      <serviceBehaviors>
        <behavior name="customServiceBehavior">
            [...]
            <serviceCredentials>
                <clientCertificate>
                    <authentication certificateValidationMode="ChainTrust" trustedStoreLocation="LocalMachine" mapClientCertificateToWindowsAccount="false"  />
                </clientCertificate>
                <serviceCertificate findValue="TempCA"
                                    storeLocation="LocalMachine"
                                    storeName="My"
                                    x509FindType="FindBySubjectName" />
            </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
        <wsHttpBinding>
            <binding name="soapBindingConfiguration">
                <security mode="Message">
                    <message clientCredentialType="Certificate" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>

Соответствующая конфигурация клиента (остальные автоматически создаются с помощью «Добавить ссылку на службу»):

<endpointBehaviors>
    <behavior name="customClientBehavior">
        <clientCredentials>
            <clientCertificate findValue="SignedByCA" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
        </clientCredentials>
    </behavior>
</endpointBehaviors>

Как клиентские, так и серверные сертификаты хранятся со своим закрытым ключом в «Local Computer \ Personal» (потому что я тестирую на один компьютер), и «TempCA» (мой корневой сертификат) также в «Локальный компьютер \ доверенные корневые центры сертификации».

Что мне здесь не хватает? Есть рабочие примеры?

Ответы [ 2 ]

5 голосов
/ 08 сентября 2011

Я наконец выяснил, в чем проблема.Проверка отзыва должна быть отключена.Мой тестовый CA, очевидно, не имеет связанного CRL, поэтому в этом случае WCF, кажется, блокирует каждого клиента, потому что его невозможно проверить.

0 голосов
/ 07 сентября 2011

Кажется, что то, что вы делаете, должно работать на основе этой статьи MSDN об использовании сертификатов с WCF. При использовании подхода с доверенным корневым сертификатом может потребоваться удалить сертификат из личного хранилища.

Если это тоже не сработает, возможно, развертывание корневого сертификата также требует применения групповой политики к вашему компьютеру. Посмотрите на раздел «Если вы не используете корневой центр сертификации Microsoft Enterprise и хотите использовать только группы компьютеров» этой статьи TechNet. В нем говорится, что компьютеры могут не доверять корневому сертификату автоматически, если групповая политика не выполняется. т применяется. Две статьи, кажется, противоречат друг другу, поэтому я не уверен, что сработает.

...