2009-12-13 2 views
5

После установки сертификата на стороне клиента я получаю исключение «Объект содержит только открытую половину пары ключей. Также должен быть предоставлен закрытый ключ». Мое приложение - это приложение VC# .NET, работающее на платформе ASP.NET. Приложение также использует WSE 2.0 для импорта сертификатов в запросы SOAP.Объект содержит только открытую половину пары ключей

После исследования я обнаружил, что это исключение относится к типу System.Security.Cryptography.CryptographicException.

Я довольно уверен, что все мои настройки WSE настроены правильно, так как я смог найти аналогичный сертификат по теме-различающемуся имени. Любые идеи будут высоко оценены.

ответ

12

У меня была такая же проблема. Я нашел one explanation here, который работал для меня. В частности, разрешения для закрытого ключа. Полная информация копируется ниже.

Есть несколько вещей, которые я бы взгляд на первый:

  1. У вас есть закрытый ключ для этого сертификата?
  2. Вы дали разрешение на использование приложения youf для доступа к приватному ключам?

Вы можете установить, действительно ли у вас закрытого ключа, просмотрев сертификат через хранилище сертификатов Windows. Для этого выполните следующие действия:

  1. В меню «Пуск» Windows выберите «Выполнить».
  2. Тип mmc в поле «Открыть». Нажмите OK
  3. Выберите «Добавить/удалить оснастку» в меню «Файл».
  4. Нажмите кнопку «Добавить».
  5. Выберите «Сертификаты» из списка «Доступные автономные оснастки». Нажмите кнопку «Добавить».
  6. Выберите «Учетная запись компьютера». Нажмите "Далее.
  7. Выберите «Локальный компьютер». Нажмите «Готово».
  8. Нажмите Закрыть.
  9. Нажмите OK.
    1. Разверните узел Сертификаты под Корнем консоли и откройте Персональный магазин.
    2. Дважды щелкните по сертификату, который вы используете. Если у вас есть приватный ключ , в диалоговом окне появится сообщение внизу, в котором говорится: «У вас есть закрытый ключ , который соответствует этому сертификату ».

Если у вас есть закрытый ключ, а затем обеспечить , что ваше приложение имеет разрешения для доступа ключа:

  1. Откройте Проводник Windows.
  2. Перейдите в папку C: \ Documents and Settings \ All Users \ Application Папка данных \ Microsoft \ Crypto \ RSA \ MachineKeys .
  3. Выберите файлы, содержащие ключи, которые необходимо WSE, чтобы получить .
  4. В меню «Файл» выберите «Свойства».
  5. На вкладке «Безопасность» добавьте учетную запись ASPNET и выберите «Полный» .
  6. Примечания: 1. Определить, какой ключевой файл в папке MachineKeys равен , связанный с сертификатом, может быть сложно. Один простой способ - отметить дату и время создания, когда создает новый сертификат. Когда вы просмотрите файлы в каталоге MachineKeys , проверьте поле Дата изменения на соответствующую дату и раз. 2. Если вы настроили свою систему на работу под другой учетной записью , чем ASPNET, используйте эту учетную запись при предоставлении разрешений для доступа к сертификату .
+1

Спасибо. Это помогло. (У меня был закрытый ключ, но у моего приложения не было доступа к нему). – KKP

+0

проверить этот ответ о том, как узнать, какой ключ машины соответствует сертификату: http://serverfault.com/a/642279/401044 – jtate

0

Столкнувшись же исключение: System.Security.Cryptography.CryptographicException, объект содержит только открытый половину пары ключей, я доказал альтернативу, но менее оптимальное решение.

Ситуация: поиск сертификата/ключа отлично работает внутри Visual Studio IIS Express, но пока веб-приложение работает под надлежащей службой IIS, я всегда получал исключение «Содержит только открытую половину пары ключей».

Я использовал WSE3 CertificateTool, чтобы найти раздел секретного ключа в файловой системе и попытался подробно настроить параметры прав пользователя, чтобы предоставить разрешения пользователя ASP в соответствии с приведенным выше ответом.

Мое конечное исправление, которое было не совсем красивым, состояло в том, чтобы создать новый пул приложений IIS, специфичный для моего кода веб-службы, и установить идентификатор пользователя в качестве владельца локальной машины сертификата + закрытый ключ.

Конечным местом, в котором я установил сертификат, был «Локальный компьютер/Надежные люди».

Использование WSE3 CustomPolicyAssertion, C# .NET:

clientToken = X509TokenProvider.CreateToken(StoreLocation.LocalMachine, 
    StoreName.TrustedPeople, "soap.partnersite.com", X509FindType.FindBySubjectName); 

После обновления App Pool Идентичность, не закрытый ключ переопределяет файлов не были необходимы при смене владельца пула приложений.