Правильный способ импорта сертификата сервера (+ цепочка) в UWP - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь импортировать сертификат сервера, к которому впоследствии подключусь.

  1. Мое первое препятствие - какой правильный способ импортировать сертификат в UWP, [примечание: упаковка .pfx противоречит политике хранилища]
  2. После того, как я импортировал серверCertificate, Как мне импортировать / получить сертификаты корневого CA, который подписал сертификат сервера?

В настоящее время я использую приведенный ниже код, но у меня все еще есть вопросы выше?

    public async Task InsertCert()
    {
        StorageFile pfxfile = await ApplicationData.Current.LocalFolder.GetFileAsync("ms-appx:///myfile.pfx");
        var buffer = await FileIO.ReadBufferAsync(pfxfile);

        string certificateData = CryptographicBuffer.EncodeToBase64String(buffer);

        string password = "";

        await CertificateEnrollmentManager.ImportPfxDataAsync(
                certificateData,
                password,
                ExportOption.NotExportable,
                KeyProtectionLevel.NoConsent,
                InstallOptions.None,
                "Client Certificate");
    }

1 Ответ

0 голосов
/ 23 ноября 2018

Я проверил ваш код, но есть кое-что, чего я не понимаю.

Например, вы использовали этот строчный код, чтобы получить ваш файл .pfx в локальной папке.

StorageFile pfxfile = await ApplicationData.Current.LocalFolder.GetFileAsync ("ms-appx: ///myfile.pfx");

ms-appx:/// - это вашапакет приложений.ApplicationData.Current.LocalFolder - это папка с данными вашего приложения, равная ms-appdata:///local/.Это разные вещи.

В вашем случае, если файл .pfx находится в корневом каталоге локальной папки, вы можете напрямую использовать await ApplicationData.Current.LocalFolder.GetFileAsync("myfile.pfx"), чтобы получить его.

Тогда давайтевернуться к вашему вопросу «импорт / получение сертификатов».Я видел, что вы используете CertificateEnrollmentManager.ImportPfxDataAsync для установки сертификата .pfx в хранилище контейнеров приложений.Это правильно.

После успешной установки сертификата вы можете получить его, позвонив по номеру Windows.Security.Cryptography.Certificates.CertificateStores.FindAllAsync(certQuery).

В соответствии с FriendlyName, указанным вами в методе ImportPfxDataAsync, вы можете создать CertificateQuery как CertificateStores.FindAllAsync параметр метода.

Windows.Security.Cryptography.Certificates.CertificateQuery certQuery = new Windows.Security.Cryptography.Certificates.CertificateQuery();
certQuery.FriendlyName = "Client Certificate";    // This is the friendly name of the certificate that was just installed.
IReadOnlyList<Windows.Security.Cryptography.Certificates.Certificate> certs = await Windows.Security.Cryptography.Certificates.CertificateStores.FindAllAsync(certQuery);
foreach (Certificate cert in certs)
{
    Debug.WriteLine($"FriendlyName: {cert.FriendlyName},Subject: {cert.Subject}, Serial Number: {CryptographicBuffer.EncodeToHexString(CryptographicBuffer.CreateFromByteArray(cert.SerialNumber))}");
}

Как только вы найдете сертификат, вы можете использовать егообщаться с вашим сервером.

Например,

Вы можете использовать класс Windows.Web.Http.HttpClient для программного присоединения установленного сертификата клиента.

Windows.Web.Http.Filters.HttpBaseProtocolFilter filter= new Windows.Web.Http.Filters.HttpBaseProtocolFilter();
filter.ClientCertificate = [your certificate];
Windows.Web.Http.HttpClient Client = new Windows.Web.Http.HttpClient(filter);
await Client.GetAsync(...);
...