CryptographicException «Набор ключей не существует», но только через WCF - PullRequest
146 голосов
/ 02 марта 2009

У меня есть код для вызова сторонней веб-службы, которая защищена с помощью сертификации X.509.

Если я вызываю код напрямую (с помощью модульного теста), он работает без проблем.

При развертывании этот код будет вызываться через службу WCF. Я добавил второй модульный тест, который вызывает службу WCF, однако он завершается неудачно с сообщением CryptographicException, "Keyset does not exist", когда я вызываю метод в сторонней веб-службе.

Я предполагаю, что это потому, что моя служба WCF будет пытаться вызвать стороннюю веб-службу, используя другого пользователя для меня.

Может кто-нибудь пролить дополнительный свет на эту проблему?

Ответы [ 15 ]

0 голосов
/ 31 июля 2018

Я только что переустановил свой сертификат на локальной машине, и тогда он работает нормально

0 голосов
/ 02 апреля 2018

Я столкнулся с этим в своем проекте сервисной фабрики после того, как истек срок действия сертификата, который использовался для аутентификации на нашем хранилище ключей, и был повернут, что изменило отпечаток. Я получил эту ошибку, потому что я пропустил обновление отпечатка в файле applicationManifest.xml в этом блоке, который в точности соответствует тому, что предлагали другие ответы, - предоставить NETWORK SERVICE (как все мои exe-файлы, стандартные конфигурации для кластера Azure Service Fabric) разрешения на зайдите в магазин сертификатов LOCALMACHINE \ MY.

Обратите внимание на значение атрибута "X509FindValue".

<!-- this block added to allow low priv processes (such as service fabric processes) that run as NETWORK SERVICE to read certificates from the store -->
  <Principals>
    <Users>
      <User Name="NetworkService" AccountType="NetworkService" />
    </Users>
  </Principals>
  <Policies>
    <SecurityAccessPolicies>
      <SecurityAccessPolicy ResourceRef="AzureKeyvaultClientCertificate" PrincipalRef="NetworkService" GrantRights="Full" ResourceType="Certificate" />
    </SecurityAccessPolicies>
  </Policies>
  <Certificates>
    <SecretsCertificate X509FindValue="[[THIS KEY ALSO NEEDS TO BE UPDATED]]" Name="AzureKeyvaultClientCertificate" />
  </Certificates>
  <!-- end block -->
0 голосов
/ 27 сентября 2013

Получил эту ошибку при использовании openAM Fedlet на IIS7

Изменение учетной записи пользователя для веб-сайта по умолчанию решило проблему. В идеале вы хотели бы, чтобы это была служебная учетная запись. Возможно, даже учетная запись IUSR. Предложите поискать методы отверждения IIS, чтобы полностью его закрепить.

0 голосов
/ 02 января 2013

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

0 голосов
/ 09 августа 2011

Если вы используете ApplicationPoolIdentity для своего пула приложений, у вас могут возникнуть проблемы с указанием разрешения для этого «виртуального» пользователя в редакторе реестра (такого пользователя нет в системе).

Итак, используйте subinacl - инструмент командной строки, который позволяет устанавливать ACL реестра, или что-то вроде этого.

...