Ошибка 36870: Код ошибки, возвращенный модулем шифрования 0x8009030D
Добрый день! Уважаемые читатели и гости IT портала Pyatilistnik. В прошлый раз мы с вами устраняли ошибку подключения "Код ошибки 0x907. Расширенный код ошибки 0x0". В сегодняшней статье мы рассмотрим еще одну ошибку RDP, которая не дает людям любые подключения "Произошла неустранимая ошибка при обращении к закрытому ключу учетных данных TLS server. Код ошибки, возвращенный модулем шифрования: ошибка 0x8009030D. Внутреннее состояние ошибки". Данную проблему я стал получать массово в декабре 2022. Давайте покажу куда нужно смотреть.
Описание ошибки 0x8009030D
У меня есть RDS ферма состоящая из 50 RDSH хостов, в какой-то момент люди начали массово на двух хостах получать ошибку "An internal error has occurred". Я долго искал проблему, и таки отыскал ее.
Ей оказалась ошибка появляющаяся каждый раз при попытке подключения ID Schannel 36870:
Вот так это массово выглядит.
В 99% случаев у вас просто не хватает прав на доступ к нужному SSL сертификату, который используется при RDP сессии.
Устранение ошибки ID 36870
Как я и писал ранее, чтобы убрать ошибку 0x907, я на всех участниках RDS ферму, установил нормальный Wildcard сертификат. Все стало нормально. Но, то что теперь я стал получать ошибку с кодом 0x8009030D, стало означать, с проблемой прав доступа к файлу. То есть у учетной записи NETWORK SERVICE отсутствуют разрешения на файл в C:\ProgramData\Microsoft\Crypto\RSA\MachineKey.
Каталог MachineKeys хранит пары ключей сертификатов для пользователей и компьютеров. Эта папка используется службами сертификации и Internet Explorer, другими браузерами. В этой директории и в ее поддиректориях размещаются файлы, связанные с сертификатами и ключами контейнерами.
Для того чтобы понять, что происходит я вам советую скачать утилиту из пакета Sysinernals под названием Process Monitor.
- ✅Далее делаем себе фильтр по событию 36870, чтобы мониторить его появление
- ✅И запускаем Procmon.exe или Procmon64.exe, чтобы спарсить текущие события. Как только событие появилось, вам нужно остановить захват (CTRL+E) и сохранить этот лог в CSV файл.
Далее вам нужно поискать события подобные этому:
Как видно, учетная запись NETWORK SERVICE не смогла прочитать ключ eed523a12125737e6733ccef353672ce_02129252-b210-4f5d-a8a1-2febf0b00564.
Как предоставить права на сертификат
- ✅Нажмите сочетание клавиш Win+R и вызовите оснастку mmc.
Далее Вам нужно нажать CTR:+M. Найдите оснастку "Сертификаты" и переместите ее вправо. Там выберите пункт "Учетной записи компьютера".
Кажем, что это будет локальный компьютер, но можно сделать и удаленного, если нет доступа по RDP.
Найдите в личном контейнере компьютера, нужный сертификат, который используется при подключении. В контекстном меню выберите пункт "Управление закрытыми ключами".
Далее в открывшемся ACL вам нужно дать права чтения для NETWORK SERVICE.
- ✅Второй метод, это использовать утилиту командной строки:
Примечание: вам может потребоваться стать владельцем файла, если вы не можете изменить его разрешения.
На этом у меня все. Ошибку я устранил, уровень защищенности сохранил. С вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org.
Сброс разрешения для папки MachineKeys
Для сброса разрешений на данную папку, выполните в консоли в режиме администратора.
Md C:\temp
icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c > c:\temp\BeforeScript_permissions.txt
takeown /f "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" /a /r
icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "NT AUTHORITY\System:(F)"
icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "NT AUTHORITY\NETWORK SERVICE:(R)"
icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "BUILTIN\Administrators:(F)"
icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c > c:\temp\AfterScript_permissions.txt
Где хранится самоподписный сертификат в реестре
Это больше для себя, где лежит отпечаток сертификата:
Дополнительные ссылки
- https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers/8259#8259
- https://learn.microsoft.com/en-US/troubleshoot/windows-server/remote/custom-server-authentication-certificate-for-tls
- https://serverfault.com/questions/541364/how-to-fix-rdp-on-windows-server-2012
- https://learn.microsoft.com/ru-ru/troubleshoot/azure/virtual-machines/troubleshoot-rdp-internal-error