Произошла следующая ошибка 2148073494

Проблема

При попытке создания цифровой подписи PDF в Adobe Acrobat 8 или 9 для Windows приложение возвращает сообщение об ошибке: «Не удалось закончить создание этой подписи. Исключение на уровне платформы». Вслед за сообщением об ошибке находится одно из этих выражений:

  • «Объект уже существует. Код ошибки: 2148073487»
  • «Keyset не существует. Код ошибки: 2148073494»
  • «Ключ недействителен для использования в указанном состоянии. Код ошибки: 2148073483″

Решение. Повторно создайте цифровое удостоверение и/или папку Crypto

Используйте одно или оба из предлагаемых решений:

Повторно создайте цифровое удостоверение

  1. Выберите пункт меню «Дополнительно» > «Настройки безопасности».

  2. В списке «Категории» в левой части окна «Настройки безопасности» выберите «Цифровое удостоверение».

  3. Выберите цифровое удостоверение, с помощью которого вы пытались подписать файл PDF.

  4. Нажмите кнопку «Удалить идентификатор».

  5. В диалоговом окне подтверждения нажмите «ОК».

  6. Нажмите кнопку «Добавить идентификатор».

  7. Следуйте инструкциям на экране для воссоздания цифрового удостоверения.

Повторно создайте папку Crypto

  1. Выполните одно из следующих действий в Проводнике Windows:

    • В системе Windows XP перейдите к папке C:Documents and Settings[имя-пользователя]Application DataMicrosoft.
    • В системе Windows Vista перейдите к папке C:Users[имя-пользователя]AppDataRoamingMicrosoft.

    Примечание. Эти пути включают скрытые папки. Чтобы сделать скрытые папки видимыми, см. раздел «Отображение скрытых файлов и папок в ОС Windows 10 и более ранних версиях».

  2. Переименовать папку Crypto в папку Crypto Old.

  3. Откройте Acrobat. Папка Crypto будет автоматически создана заново.

Перестали работать удаленные рабочие места. Следующая ошибка:

103    Критическое    Microsoft-Windows-TerminalServices-Gateway    Microsoft-Windows-TerminalServices-Gateway/Operational    15.03.2014 20:54:34
Службе шлюза удаленных рабочих столов не предоставлены разрешения, необходимые для доступа к SSL-сертификату, который требуется для приема подключений. Чтобы устранить эту проблему, свяжите (сопоставьте) действительный SSL-сертификат при помощи диспетчера шлюза удаленных рабочих столов. Дополнительные сведения см. в разделе справки диспетчера «Получение сертификата для сервера шлюза удаленных рабочих столов». Произошла следующая ошибка: «2148073494».

Вот еще какая-то общая ошибка:

В сети: счетчики производительности не запущены    15.03.2014 21:29:58    00183-90000-00001-AA422 (активировано)

единственное что приходит в ум — проблема появилась после смены коммутатора.

  • Remove From My Forums
  • Общие обсуждения

  • Перестали работать удаленные рабочие места. Следующая ошибка:

    103    Критическое    Microsoft-Windows-TerminalServices-Gateway    Microsoft-Windows-TerminalServices-Gateway/Operational    15.03.2014 20:54:34
    Службе шлюза удаленных рабочих столов не предоставлены разрешения, необходимые для доступа к SSL-сертификату, который требуется для приема подключений. Чтобы устранить эту проблему, свяжите (сопоставьте) действительный SSL-сертификат при помощи
    диспетчера шлюза удаленных рабочих столов. Дополнительные сведения см. в разделе справки диспетчера «Получение сертификата для сервера шлюза удаленных рабочих столов». Произошла следующая ошибка: «2148073494».

Проблема

При попытке создания цифровой подписи PDF в Adobe Acrobat 8 или 9 для Windows приложение возвращает сообщение об ошибке: «Не удалось закончить создание этой подписи. Исключение на уровне платформы». Вслед за сообщением об ошибке находится одно из этих выражений:

  • «Объект уже существует. Код ошибки: 2148073487»
  • «Keyset не существует. Код ошибки: 2148073494»
  • «Ключ недействителен для использования в указанном состоянии. Код ошибки: 2148073483″

Решение. Повторно создайте цифровое удостоверение и/или папку Crypto

Используйте одно или оба из предлагаемых решений:

Повторно создайте цифровое удостоверение

  1. Выберите пункт меню «Дополнительно» > «Настройки безопасности».

  2. В списке «Категории» в левой части окна «Настройки безопасности» выберите «Цифровое удостоверение».

  3. Выберите цифровое удостоверение, с помощью которого вы пытались подписать файл PDF.

  4. Нажмите кнопку «Удалить идентификатор».

  5. В диалоговом окне подтверждения нажмите «ОК».

  6. Нажмите кнопку «Добавить идентификатор».

  7. Следуйте инструкциям на экране для воссоздания цифрового удостоверения.

Повторно создайте папку Crypto

  1. Выполните одно из следующих действий в Проводнике Windows:

    • В системе Windows XP перейдите к папке C:Documents and Settings[имя-пользователя]Application DataMicrosoft.
    • В системе Windows Vista перейдите к папке C:Users[имя-пользователя]AppDataRoamingMicrosoft.

    Примечание. Эти пути включают скрытые папки. Чтобы сделать скрытые папки видимыми, см. раздел «Отображение скрытых файлов и папок в ОС Windows 10 и более ранних версиях».

  2. Переименовать папку Crypto в папку Crypto Old.

  3. Откройте Acrobat. Папка Crypto будет автоматически создана заново.

Hi,

In all probability the digital ID has expired. There is an expiration date listed in the Security Settings dialog, what does it say? If the digital ID has indeed expired, and you would like to remove it from the Windows Certificate Store you need to do it through a Windows interface, not through Acrobat. Like many things, there are more then one way to go about this, but the simplest is to start Internet Explorer. From Internet Explorer select the Tools menu or button, and then Internet Options from the drop-down menu. Next, select the Contents tab on the Internet Option dialog and then click the Certificates button.

Here is where you’ll see the digital IDs loaded into the Windows Certificate Store. You can highlight the expired ID that you would like to delete and click the Remove button, BUT FIRST, I strongly suggest that you Export the ID to a file in case you ever need to get back to it for some reason. Think of this as escrowing or archiving the digital ID just in case. Once you’ve saved the digital ID to a file, then you can remove it knowing that you could resurrect it at some time in the future.

Of course, if it has expired you will need to procure a fresh digital ID if you want to continue to digitally sign PDF files, but that’s a separate discussion.

Steve

Hi,

In all probability the digital ID has expired. There is an expiration date listed in the Security Settings dialog, what does it say? If the digital ID has indeed expired, and you would like to remove it from the Windows Certificate Store you need to do it through a Windows interface, not through Acrobat. Like many things, there are more then one way to go about this, but the simplest is to start Internet Explorer. From Internet Explorer select the Tools menu or button, and then Internet Options from the drop-down menu. Next, select the Contents tab on the Internet Option dialog and then click the Certificates button.

Here is where you’ll see the digital IDs loaded into the Windows Certificate Store. You can highlight the expired ID that you would like to delete and click the Remove button, BUT FIRST, I strongly suggest that you Export the ID to a file in case you ever need to get back to it for some reason. Think of this as escrowing or archiving the digital ID just in case. Once you’ve saved the digital ID to a file, then you can remove it knowing that you could resurrect it at some time in the future.

Of course, if it has expired you will need to procure a fresh digital ID if you want to continue to digitally sign PDF files, but that’s a separate discussion.

Steve

Это исключение возникало периодически, когда наша служба приложений Azure была перемещена в среду службы приложений. Мы используем Identity Server 4, и исключение происходит при подписании токена. Это можно увидеть в стеке вызовов ниже.

Сертификат подписи никогда не сохраняется в хранилище сертификатов, он загружается из базы данных в виде байтового массива:

new X509Certificate2(rawData, password,
                    X509KeyStorageFlags.MachineKeySet |
                    X509KeyStorageFlags.PersistKeySet);

Эти ссылки кажутся одной и той же проблемой:

.NET Core X509Certificate2.PrivateKey выбрасывает ошибку nte_bad_keyset

https://github.com/dotnet/corefx/issues/2583

< Сильный > Edit: Изначально мы думали, что это что-то особенное для Env службы приложений в Azure, но теперь мы видим исключение в стандартных службах приложений. В качестве теста мы создали веб-задание Azure, которое загружает сертификат из байтового массива и создает токены JWT (для подписи которых требуется закрытый ключ). Это повторяет ошибку. Также следует отметить, что веб-задание Azure даже не запускается, когда определенные флаги передаются в X509Certificate2 ctor (например, X509KeyStorageFlags.UserKeySet).

Трассировка стека каждый раз одинакова:

System.Security.Cryptography.CryptographicException:
   at Internal.NativeCrypto.CapiHelper.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
   at System.Security.Cryptography.RSACryptoServiceProvider.get_SafeProvHandle()
   at System.Security.Cryptography.RSACryptoServiceProvider.get_SafeKeyHandle()
   at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 keySize, CspParameters parameters, Boolean useDefaultKeySize)
   at System.Security.Cryptography.RSACryptoServiceProvider..ctor(CspParameters parameters)
   at Internal.Cryptography.Pal.CertificatePal.<>c.<GetRSAPrivateKey>b__59_0(CspParameters csp)
   at Internal.Cryptography.Pal.CertificatePal.GetPrivateKey[T](Func`2 createCsp, Func`2 createCng)
   at Internal.Cryptography.Pal.CertificatePal.GetRSAPrivateKey()
   at Internal.Cryptography.Pal.CertificateExtensionsCommon.GetPrivateKey[T](X509Certificate2 certificate, Predicate`1 matchesConstraints)
   at Microsoft.IdentityModel.Tokens.X509SecurityKey.get_PrivateKey()
   at Microsoft.IdentityModel.Tokens.X509SecurityKey.get_HasPrivateKey()
   at Microsoft.IdentityModel.Tokens.AsymmetricSignatureProvider.HasPrivateKey(SecurityKey key)
   at Microsoft.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(SecurityKey key, String algorithm, Boolean willCreateSignatures)
   at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateSignatureProvider(SecurityKey key, String algorithm, Boolean willCreateSignatures)
   at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateForSigning(SecurityKey key, String algorithm)
   at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.CreateEncodedSignature(String input, SigningCredentials signingCredentials)
   at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.WriteToken(SecurityToken token)
   at IdentityServer4.Services.DefaultTokenCreationService.CreateJwtAsync(JwtSecurityToken jwt)
   at IdentityServer4.Services.DefaultTokenCreationService.<CreateTokenAsync>d__3.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Services.DefaultTokenService.<CreateSecurityTokenAsync>d__9.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at IdentityServer4.ResponseHandling.TokenResponseGenerator.<CreateAccessTokenAsync>d__10.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.ResponseHandling.TokenResponseGenerator.<ProcessTokenRequestAsync>d__8.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.ResponseHandling.TokenResponseGenerator.<ProcessAsync>d__6.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Endpoints.TokenEndpoint.<ProcessTokenRequestAsync>d__6.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Endpoints.TokenEndpoint.<ProcessAsync>d__5.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Hosting.IdentityServerMiddleware.<Invoke>d__3.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Hosting.FederatedSignOutMiddleware.<Invoke>d__6.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Hosting.AuthenticationMiddleware.<Invoke>d__2.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.<Invoke>d__7.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Hosting.BaseUrlMiddleware.<Invoke>d__2.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.ApplicationInsights.AspNetCore.ExceptionTrackingMiddleware.<Invoke>d__4.MoveNext()

3 ответа

Лучший ответ

Чтобы решить эту проблему, мы переключились с сертификатов X509 (X509Certificate2) на сгенерированные RSA ключи (RSACryptoServiceProvider). Identity Server 4 поддерживает оба. Исключение больше не возникает.


1

J. Andrew Laughlin
7 Мар 2017 в 17:41

Эта ошибка означает, что где-то после того, как сертификат узнал, где хранится ключ, он был удален.

  • Может быть, что-то вызывает CngKey.Delete
  • Возможно, что-то клонирует это в RSACryptoServiceProvider и устанавливает PersistKeyInCsp в false.
  • Может быть, что-то просто очищает каталог ключей машины после свершившегося факта.
  • Другой (очень редкий) известный случай — это когда два потока загружают PFX параллельно (они не должны быть в одном и том же процессе), причем один из них не имеет PersistKeySet, заявленного во время импорта.

Если вы загружаете и удаляете сертификаты, вам не следует устанавливать PersistKeySet. Каждый раз, когда вы открываете PFX, на диске для каждого содержащегося в нем закрытого ключа создается другой файл … эти файлы очищаются нормально (до тех пор, пока процесс не завершается ненормально), но PersistKeySet предотвращает эту очистку.

Если ничто в анализе кода не выявит два очевидных местоположения удаления ключей (PersistKeyInCsp=false — хитрое), вам придется следовать рекомендациям по аудиту файловой системы в . NET Core X509Certificate2.PrivateKey выдает ошибку nte_bad_keyset .


0

Community
23 Май 2017 в 12:02

Возможно, вы не предоставили IIS доступ к своим закрытым ключам. У меня была такая же ошибка, но вместо ключей нужно было использовать сертификаты X509. Я только что дал разрешение на чтение закрытых ключей из сертификата для IIS_IUSRS на MMC. Это помогает мне.

Полный ответ от @thames: Как предоставить ASP.NET доступ к закрытому ключу в сертификате в хранилище сертификатов?

< Сильный > UPD :

Пошаговое руководство:

  1. Создать / купить сертификат с закрытым ключом
  2. Импортируйте сертификат в учетную запись «Локальный компьютер» (не «Текущий пользователь»). Установите флажок «Разрешить экспорт закрытого ключа» в мастере импорта.
  3. Откройте консоль MMC и добавьте оснастку «Сертификаты». Выберите «Учетная запись компьютера».
  4. Найдите свой сертификат и щелкните по нему правой кнопкой мыши. Выберите «Все задачи»> «Управление личными ключами»
  5. Добавьте доступ на чтение к своему ключу для пользователя IIS_IUSRS или IIS AppPool (зависит от версии и конфигурации IIS. Для отображения всех возможных параметров лучше использовать кнопку «Дополнительно»)
  6. Перезапустите ваше приложение


0

Eugene Voynov
26 Июл 2017 в 13:39

Мы начали видеть, что это исключение происходит с перерывами, когда наша служба приложений Azure перенесена в среду обслуживания приложений. Мы используем Identity Server 4, и исключение происходит во время подписания токена. Это можно увидеть в стеке вызовов ниже.

Сертификат подписи никогда не сохраняется в хранилище сертификатов, он загружается из базы данных в виде массива байтов:

new X509Certificate2(rawData, password,
                    X509KeyStorageFlags.MachineKeySet |
                    X509KeyStorageFlags.PersistKeySet);

Эти ссылки выглядят одинаково:

.NET Core X509Certificate2.PrivateKey вызывает ошибку nte_bad_keyset

https://github.com/dotnet/corefx/issues/2583

Edit: Первоначально мы думали, что это что-то особенное для App App Env в Azure, но теперь мы видим исключение в стандартных приложениях. В качестве теста мы создали веб-задачу Azure, которая загружает сертификат из массива байтов и создает токены JWT (для которых требуется закрытый ключ для подписи). Это повторяет ошибку. Также следует отметить, что работа Azure Web даже не запускается, когда определенные флаги передаются в X509Certificate2 ctor (например, X509KeyStorageFlags.UserKeySet).

Трассировка стека одинакова каждый раз:

System.Security.Cryptography.CryptographicException:
   at Internal.NativeCrypto.CapiHelper.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
   at System.Security.Cryptography.RSACryptoServiceProvider.get_SafeProvHandle()
   at System.Security.Cryptography.RSACryptoServiceProvider.get_SafeKeyHandle()
   at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 keySize, CspParameters parameters, Boolean useDefaultKeySize)
   at System.Security.Cryptography.RSACryptoServiceProvider..ctor(CspParameters parameters)
   at Internal.Cryptography.Pal.CertificatePal.<>c.<GetRSAPrivateKey>b__59_0(CspParameters csp)
   at Internal.Cryptography.Pal.CertificatePal.GetPrivateKey[T](Func'2 createCsp, Func'2 createCng)
   at Internal.Cryptography.Pal.CertificatePal.GetRSAPrivateKey()
   at Internal.Cryptography.Pal.CertificateExtensionsCommon.GetPrivateKey[T](X509Certificate2 certificate, Predicate'1 matchesConstraints)
   at Microsoft.IdentityModel.Tokens.X509SecurityKey.get_PrivateKey()
   at Microsoft.IdentityModel.Tokens.X509SecurityKey.get_HasPrivateKey()
   at Microsoft.IdentityModel.Tokens.AsymmetricSignatureProvider.HasPrivateKey(SecurityKey key)
   at Microsoft.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(SecurityKey key, String algorithm, Boolean willCreateSignatures)
   at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateSignatureProvider(SecurityKey key, String algorithm, Boolean willCreateSignatures)
   at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateForSigning(SecurityKey key, String algorithm)
   at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.CreateEncodedSignature(String input, SigningCredentials signingCredentials)
   at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.WriteToken(SecurityToken token)
   at IdentityServer4.Services.DefaultTokenCreationService.CreateJwtAsync(JwtSecurityToken jwt)
   at IdentityServer4.Services.DefaultTokenCreationService.<CreateTokenAsync>d__3.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Services.DefaultTokenService.<CreateSecurityTokenAsync>d__9.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at IdentityServer4.ResponseHandling.TokenResponseGenerator.<CreateAccessTokenAsync>d__10.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.ResponseHandling.TokenResponseGenerator.<ProcessTokenRequestAsync>d__8.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.ResponseHandling.TokenResponseGenerator.<ProcessAsync>d__6.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Endpoints.TokenEndpoint.<ProcessTokenRequestAsync>d__6.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Endpoints.TokenEndpoint.<ProcessAsync>d__5.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Hosting.IdentityServerMiddleware.<Invoke>d__3.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Hosting.FederatedSignOutMiddleware.<Invoke>d__6.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Hosting.AuthenticationMiddleware.<Invoke>d__2.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware'1.<Invoke>d__18.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware'1.<Invoke>d__18.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.<Invoke>d__7.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IdentityServer4.Hosting.BaseUrlMiddleware.<Invoke>d__2.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware'1.<Invoke>d__18.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware'1.<Invoke>d__18.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware'1.<Invoke>d__18.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware'1.<Invoke>d__18.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.ApplicationInsights.AspNetCore.ExceptionTrackingMiddleware.<Invoke>d__4.MoveNext()

При разворачивании минимальной конфигурации RDS на скорую руку, в очередной раз сталкиваюсь с проблемами и в очередной раз забываю как их решать. Первое что нужно сделать перед развертыванием это конечно прочитать best practices, а потом составить план. Выписать все что необходимо заранее, подготовить, запросить. 

Например сертификат SSL и доменное имя типа remote.mycompany.ru (DNS запись A).  Даже развертывая очень маленький терминальный сервер для очень маленькой компании имеет смысл прикупить SSL если планируется доступ из сети интернет. Сегодня удаленный доступ нужен только с одного ноутбука, а завтра потребуется еще на десятке смартфонов. Замучаешься устанавливать везде свой локальный сертификат в корневые. Тем более что SSL сертификат сейчас стоит копейки. Я последнее время беру на https://www.ssls.com/ , с кодом 3.88DEAL  вообще копейки. И оплатить можно даже биткойнами. Проще всего запрос сертификата сделать установив на сервер роль IIS, тем более что он все равно потребуется для развертывания шлюза. В IIS есть раздел SSL, там визарды для создания запроса сертификата и для его установки (есть смысл запрашивать сертификат минимум 2048 bit ).

Часто сервер физически один, а службы удаленного доступа хотят иметь в своем составе шлюз, сервер лицензирования, сам терминальный сервер. Да и домен в ряде случаев не поднят. Технически возможна установка RDS на сервер в рабочей группе, но если есть возможность, можно сразу поднять контроллер домена. Если был куплен Windows Server Standard и выше, то его можно установить в двух экземплярах в виде виртуалок на одном физическом хосте. Если есть возможность — почему не использовать? Например DC аппаратный хост, а RDS на нем в Hyper-v. Или наоборот. Да DC в одном экземпляре, да еще и виртуальном, но ведь у нас нет 100500 ПК в этом домене. Всего один сервер и нужно просто иметь логины и пароли локальных админов.

В случае развертывания RDS в малом бизнесе очень часто IP адрес внешний один и нет возможности или желания докупать еще. В итоге создается конкуренция между внутренними сервисами за порты на этом IP. HTTP и HTTPS часто заняты другими ресурсами, и это создает массу проблем при развертывании RDS Gateway. Приходится переносить на другие порты, ручками местами прописывать потом эти порты.

Например, вместо 80 ставим 81, а вместо 443 — 442. Теряется красота ссылок на ресурсы, вместо https://remote.mycompany.ru/rdweb получаем https://remote.mycompany.ru:442/rdweb . Кроме того, наживаем кучу проблем с прописыванием этих самых 442 в разных местах. Есть пара решений, нашел на Windowsitpro.com. В оснастке диспетчера служб удаленных рабочих столов можно указать порты. Кроме того, для RemoteApp нужно тоже прописать порт, иначе приложения будут ссылаться на стандартный 443. Можно отредактировать реестр, указав порт:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionTerminal ServerCentralPublishedResourcesPublishedFarms<farm>DeploymentSettings, в нем ищем DeploymentRDPSettings и добавляем к gatewayhostname:s:remote.mycompany.ru:442 номер порта. Сделать это нужно до того как опубликовали приложения RemoteApp, в противном случае приложения придется распубликовать и опубликовать повторно. Можно не реестром, а через PowerShell:

Set-RDSessionCollectionConfiguration –CollectionName «Your Collection» -CustomRdpProperty «gatewayhostname:s:<GATEWAY.FQDN>:<442>» -ConnectionBroker <Your Connection Broker> 

Но у меня на эти часть команд PS ругался, считал что RDS не установлены на сервере.Часто возникает проблема с SSL и hostname. SSL мы получили вида remote.mycompany.ru, а сервер у нас что-то вроде rdsserver.mycompany.local . Поэтому при первых же подключениях можно получить как минимум предупреждение «Имя сервера отличается от имени указанного в сертификате». Это если мы конечно прописали сертификат везде где надо:

  • Привязки в IIS к порту 442 (можно и к 443)

  • В диспетчере серверов (Настройка развертывания служб удаленных рабочих столов)

  • В диспетчере шлюза удаленных рабочих столов ( у меня не прописался сам, пришлось ручками).

В некоторых случаях предупреждение можно просто игнорировать. На некоторых платформах игнорировать нельзя. 

Решить проблему можно либо командой:

Set-RDSessionCollectionConfiguration –CollectionName QuickSessionCollection -CustomRdpProperty “use redirection server name:i:1 `n alternate full address:s:remote.mycompany.ru”либо скриптом.
.Set-RDPublishedName.ps1 «remote.mycompany.ru:442»
Скрипт у меня сразу не запустился, нашел ряд решений, например —
powershell.exe -noprofile -executionpolicy bypass -file .Set-RDPublishedName.ps1

Я зачем-то еще настроил на DC DNS зону mycompany.ru, и в ней создал DNS запись A «remote.mycompany.ru», указывающую на внутренний адрес RDS сервера, но это скорее по привычке.

Все бы ничего, но как только мы решили проблему с несоответствием имени указанном в SSL сертификате и имени сервера к которому подключаемся, появляется другая проблема.

event 301:

Пользователь «mycompanyuser» на клиентском компьютере «8.8.8.8» не соответствует требованиям политики авторизации ресурсов и не авторизован для подключения к ресурсу «remote.mycompany.ru». Произошла следующая ошибка: «23002».

Дело в том что по умолчанию создаются политики удаленного доступа для штатной ситуации. А мы уже подправили скриптом, реестром, имя сервера к которому ведется подключение. И в политиках ничего не написано про remote.mycompany.ru. Открываем диспетчер шлюза удаленных рабочих столов и правим политику — добавляем туда наш адрес remote.mycompany.ru.

  • Remove From My Forums
  • Общие обсуждения

  • Перестали работать удаленные рабочие места. Следующая ошибка:

    103    Критическое    Microsoft-Windows-TerminalServices-Gateway    Microsoft-Windows-TerminalServices-Gateway/Operational    15.03.2014 20:54:34
    Службе шлюза удаленных рабочих столов не предоставлены разрешения, необходимые для доступа к SSL-сертификату, который требуется для приема подключений. Чтобы устранить эту проблему, свяжите (сопоставьте) действительный SSL-сертификат при помощи
    диспетчера шлюза удаленных рабочих столов. Дополнительные сведения см. в разделе справки диспетчера «Получение сертификата для сервера шлюза удаленных рабочих столов». Произошла следующая ошибка: «2148073494».

Hi,

In all probability the digital ID has expired. There is an expiration date listed in the Security Settings dialog, what does it say? If the digital ID has indeed expired, and you would like to remove it from the Windows Certificate Store you need to do it through a Windows interface, not through Acrobat. Like many things, there are more then one way to go about this, but the simplest is to start Internet Explorer. From Internet Explorer select the Tools menu or button, and then Internet Options from the drop-down menu. Next, select the Contents tab on the Internet Option dialog and then click the Certificates button.

Here is where you’ll see the digital IDs loaded into the Windows Certificate Store. You can highlight the expired ID that you would like to delete and click the Remove button, BUT FIRST, I strongly suggest that you Export the ID to a file in case you ever need to get back to it for some reason. Think of this as escrowing or archiving the digital ID just in case. Once you’ve saved the digital ID to a file, then you can remove it knowing that you could resurrect it at some time in the future.

Of course, if it has expired you will need to procure a fresh digital ID if you want to continue to digitally sign PDF files, but that’s a separate discussion.

Steve

Понравилась статья? Поделить с друзьями:
  • Пройти заново путь ошибок что сотворил
  • Произошла сетевая ошибка kate mobile
  • Произошла следующая ошибка 129
  • Пройдя через дверь просьба придержать ее ошибка
  • Произошла сетевая ошибка 1107 sony