Сведения о свойстве AD FS и сертификате KeySpec

Спецификация ключа ("KeySpec") — это свойство, связанное с сертификатом и ключом. Он указывает, можно ли использовать закрытый ключ, связанный с сертификатом, для подписывания, шифрования или обоих.

Неправильное значение KeySpec может привести к ошибкам AD FS и прокси-сервера веб-приложения, таким как:

  • Не удалось установить подключение SSL/TLS к AD FS или прокси-серверу веб-приложения без регистрированных событий AD FS (хотя события SChannel 36888 и 36874 могут быть зарегистрированы)
  • Ошибка входа на странице аутентификации на основе форм AD FS или WAP, при этом на странице не отображается сообщение об ошибке.

В журнале событий может появиться следующее событие:

Log Name:   AD FS Tracing/Debug
Source: AD FS Tracing
Date:   2/12/2015 9:03:08 AM
Event ID:   67
Task Category: None
Level:  Error
Keywords:   ADFSProtocol
User:   S-1-5-21-3723329422-3858836549-556620232-1580884
Computer:   ADFS1.contoso.com
Description:
Ignore corrupted SSO cookie.

Что вызывает проблему

Свойство KeySpec определяет, как можно использовать ключ, созданный или полученный с помощью Microsoft CryptoAPI (CAPI) из устаревшего поставщика криптографических хранилищ Microsoft.

Значение KeySpec 1 или AT_KEYEXCHANGE можно использовать для подписывания и шифрования. Значение 2 или AT_SIGNATURE используется только для подписывания.

Наиболее распространенной ошибочной конфигурацией KeySpec является использование значения 2 для любого сертификата, кроме сертификата для подписи токенов.

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

Узнайте, как проверить допустимое значение KeySpec в следующем разделе этой статьи.

Example

Примером устаревшего криптографического провайдера является Расширенный криптографический провайдер Майкрософт.

Формат блоба ключа CSP Microsoft RSA включает идентификатор алгоритма, такой как CALG_RSA_KEYX или CALG_RSA_SIGN соответственно, для обработки запросов на ключи AT_KEYEXCHANGE или AT_SIGNATURE.

Идентификаторы алгоритма ключа RSA связываются со значениями KeySpec следующим образом.

Поддерживаемый поставщиком алгоритм Значение спецификации ключа для вызовов CAPI
CALG_RSA_KEYX : ключ RSA, который можно использовать для подписывания и расшифровки AT_KEYEXCHANGE (или KeySpec=1)
CALG_RSA_SIGN : ключ только для подписи RSA AT_SIGNATURE (или KeySpec=2)

Значения KeySpec и связанные значения

Ниже приведены значения различных значений KeySpec:

Значение Keyspec Means Рекомендуемое использование AD FS
0 Сертификат является сертификатом CNG Только SSL-сертификат
1 Для устаревшего сертификата CAPI (не CNG) ключ можно использовать для подписывания и расшифровки SSL, подпись токена, расшифровка токенов, сертификаты для связи служб
2 Для устаревшего сертификата CAPI (не CNG) ключ можно использовать только для подписывания. не рекомендуется

Проверка значения KeySpec для сертификатов и ключей

Чтобы просмотреть значение сертификата, можно использовать средство командной certutil строки.

Ниже приведен пример: certutil –v –store my. Эта команда сбрасывает сведения о сертификате на экран.

Сертификат Keypec

В разделе CERT_KEY_PROV_INFO_PROP_ID найдите две вещи:

  • ProviderType: Это означает, используется ли сертификат устаревшим поставщиком криптографических хранилищ (CSP) или поставщиком хранилища ключей на основе более новых API следующего поколения сертификатов (CNG). Любое ненулевое значение указывает на поставщика устаревшей технологии.

  • KeySpec: В следующей таблице показаны допустимые KeySpec значения сертификата AD FS:

    Устаревший поставщик CSP (ProviderType не равен 0):

    Назначение сертификата AD FS Допустимые значения KeySpec
    Обмен данными между службами 1
    Расшифровка токенов 1
    Подписывание токенов 1 и 2
    SSL 1

    Поставщик CNG (ProviderType = 0):

    Назначение сертификата AD FS Допустимые значения KeySpec
    SSL 0

Как изменить ключи для сертификата на поддерживаемое значение

Изменение значения KeySpec не требует повторного создания или повторного создания сертификата. КлючSpec можно изменить, повторно включив полный сертификат и закрытый ключ из PFX-файла в хранилище сертификатов, выполнив следующие действия.

  1. Проверьте и запишите разрешения закрытого ключа для существующего сертификата, чтобы их можно было перенастроить при необходимости после повторного просмотра.
  2. Экспортируйте сертификат, включая закрытый ключ, в PFX-файл.
  3. Выполните следующие действия для каждого сервера AD FS и WAP.
    1. Удалите сертификат (с сервера AD FS или WAP).
    2. Откройте командную строку PowerShell с повышенными привилегиями.
    3. Импортируйте PFX-файл на каждом сервере AD FS и WAP с помощью следующего синтаксиса, указав AT_KEYEXCHANGE значение (которое работает для всех целей сертификата AD FS):
      1. certutil –importpfx certfile.pfx AT_KEYEXCHANGE
      2. Введите пароль PFX.
    4. После завершения приведенного выше процесса выполните указанные ниже действия.
      1. Проверьте разрешения закрытого ключа.
      2. Перезапустите службу AD FS или WAP.