ProvisioningDeviceClient Create () завершается ошибкой только в размещенном приложении в Azure - PullRequest
0 голосов
/ 19 марта 2019

Запуск API веб-приложения ASP.NET Core 2.2 в Azure.Запуск кода локально работает.Код не выполняется при размещении в Azure.Пакет Nuget версии 1.2.2 (Microsoft.Azure.Devices.Provisioning.Client).

Я удалил операторы журналирования для удобства чтения:

using (var securityProvider = new SecurityProviderX509Certificate(pfxDeviceContents.certificate, pfxDeviceContents.collection))
                    {
                        using (var transport = new ProvisioningTransportHandlerHttp())
                        {
                            var globalendp = _configuration["ProvisioningEndpoint"];
                            var scope = _configuration["DpsScopeId"];

                            var provClient = ProvisioningDeviceClient.Create(globalendp, scope, securityProvider, transport);
....

Исключение:

Internal.Cryptography.CryptoThrowHelper + WindowsCryptographicException: доступ запрещен в Internal.Cryptography.Pal.StorePal.Add (сертификат ICertificatePal) в System.Security.Cryptography.X509Certificates.X509Satetificate.X509Statetific.Care9.Azure.Devices.Provisioning.Client.CertificateInstaller.EnsureChainIsInstalled (сертификаты X509Certificate2Collection) в Microsoft.Azure.Devices.Provisioning.Client.ProvisioningDeviceClient.Create (String globalDeviceEndpoint, обеспечение безопасности 1010 * провайдера безопасности 101P, провайдера безопасности 100P, провайдера безопасности 100P, провайдера безопасности провайдера 100G* Я дошел до того, что взял тот же сертификат, который не работает в размещенном приложении, и запустил его, используя локальный экземпляр того же приложения.Так что сам сертификат не является проблемой.Есть ли дополнительная информация, которую я могу собрать, чтобы помочь решить эту проблему?Кто-нибудь еще может подтвердить, что использование этого класса в Azure работает?

1 Ответ

1 голос
/ 04 мая 2019

Короче говоря, это не поддерживается. Ответ ниже может сэкономить кому-то время, пытаясь понять, как сделать эту работу

Ответ службы технической поддержки Microsoft следующий:

Симптом

Класс ProvisioningDeviceClient не работает в Azure

Причина

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

https://www.fuget.org/packages/Microsoft.Azure.Devices.Provisioning.Client/1.2.2/lib/netstandard2.0/Microsoft.Azure.Devices.Provisioning.Client.dll/Microsoft.Azure.Devices.Provisioning.Client/CertificateInstaller?code=true#M%3AMicrosoft.Azure.Devices.Provisioning.Client.CertificateInstaller.EnsureChainIsInstalled%28System.Security.Cryptography.X509Certificates.X509Certificate2Collection%29

        _installedCertificates = new HashSet<string>();
        _lock = new object();
        try {
            using (X509Store x509Store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser)) {
                x509Store.Open(OpenFlags.ReadOnly);
                X509Certificate2Enumerator enumerator = x509Store.Certificates.GetEnumerator();
                while (enumerator.MoveNext()) {
                    X509Certificate2 current = enumerator.Current;
                    _installedCertificates.Add(current.Thumbprint);
                }
            }
        } catch (Exception ex) {
            if (Logging.IsEnabled)
                Logging.Error(null, FormattableStringFactory.Create("{0} failed to read store: {1}.", "CertificateInstaller", ex), ".cctor");
        }

https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.storename?view=netframework-4.7.2

CertificateAuthority 3 Хранилище сертификатов X.509 для промежуточных центров сертификации (ЦС).

Песочница обычно предназначена для ограничения доступа к общим компонентам Windows. К сожалению, многие основные компоненты Windows были спроектированы как общие компоненты: реестр, криптография и графические подсистемы, среди прочих.

Пожалуйста, обратитесь к документу ниже, который имеет более подробное объяснение. https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#general-sandbox-restrictions

Разрешение

Другой вариант - использовать контейнеры Windows, но в данный момент это в предварительном просмотре. https://azure.microsoft.com/en-us/blog/announcing-the-public-preview-of-windows-container-support-in-azure-app-service/

AppService не может открыться в Промежуточном хранилище для установки цепочки сертификатов. Единственный способ установить промежуточную цепочку сертификатов - загрузить сертификат, содержащий цепочку. Если в веб-приложении запущена виртуальная машина, у вас есть полный контроль и вы можете делать то, что хотите. Если запустить облачную службу, то можно выполнить задачи запуска. С App Service у вас меньше контроля над дизайном.

https://docs.microsoft.com/en-us/azure/app-service/overview-compare

Вы точно правильно указали код DPS в местном хранилище сертификатов. Как вы упомянули, он был добавлен в DPS SDK, созданный в качестве альтернативного решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...