Подтвердить что ты не робот

Не удалось отправить сертификат после обновления до последнего Windows-телефона 8.1

У меня есть приложение для Windows Phone, построенное для 8.1, и одной из задач был сценарий сертификата клиент-сервер. Мое приложение отлично работало, я мог отправить сертификат клиента и войти на сервер. Однако после обновления до Windows 8.10.14xxxx это было невозможно. Я взял проводы на проводах, и кажется, что сертификат никогда не отправляется. Длина содержимого сообщения равна 0.

Я использую HttpClient.SendAsync (ждут) и HttpBaseProtocolFilter для ввода сертификата. Он работал отлично до обновления.

Любая идея? Что-то сломалось?

Сначала я устанавливаю pfx

async private void btnInstall_Click(object sender, RoutedEventArgs e)
{
    //Install the self signed client cert to the user certificate store

    string CACertificate = null;
    try
    {
        Uri uri = new Uri("ms-appx:///certificates/test.pfx");
        var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri);
        IBuffer buffer = await FileIO.ReadBufferAsync(file);
        using (DataReader dataReader = DataReader.FromBuffer(buffer))
        {
            byte[] bytes = new byte[buffer.Length];
            dataReader.ReadBytes(bytes);
            // convert to Base64 for using with ImportPfx
            CACertificate = System.Convert.ToBase64String(bytes);
        }
        await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync(
            CACertificate,
            "xxxxx",
            ExportOption.Exportable,
            KeyProtectionLevel.NoConsent,
            InstallOptions.None,
            "ClientCert1");


    }
    catch (Exception ex)
    {
        //;
    }
}

Затем я вызываю службу

string serviceURL = "https://my.web.services";
Certificate cert = null;

CertificateQuery query = new CertificateQuery();
query.FriendlyName = "ClientCert1";
IReadOnlyCollection<Certificate> certs = await CertificateStores.FindAllAsync(query);

HttpBaseProtocolFilter bpf = new HttpBaseProtocolFilter();
//if you install the CA you don't need to ignore the ServerCertificate Errors
//bpf.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted);

if (certs.Count > 0)
{
    cert = certs.ElementAt(0);
    bpf.ClientCertificate = cert;
}

HttpClient httpClient = new HttpClient(bpf);
try
{

    var response = await httpClient.GetInputStreamAsync(new Uri(serviceURL));
    //take data
}
catch (Exception ex)
{              
    //0x80072F0D 
}

Я всегда беру исключение (0x80072F0D) при работе в телефоне 8.10.14xxxx windows. Мой код работал до обновления, теперь я всегда беру этот код возврата. Сертификат загружается в httpClient. Когда я останавливаю приложение с помощью отладчика, кажется, что там есть сертификат, однако 0x800072F0D, вероятно, означает, что сертификат не отправлен???

В сценарии имеется промежуточный центр сертификации. Этот сертификат включен в pfx. Нужно ли это как-то установить?

4b9b3361

Ответ 1

Я предполагаю, что вы уже положили сертификат клиента в хранилище сертификатов приложений. Если нет, выполните следующие действия:
1) Загрузите файл PFX.
2) Установите сертификат в хранилище сертификатов приложений, следуя

await CertificateEnrollmentManager.ImportPfxDataAsync(certString, "Your_PFX_Password", ExportOption.Exportable, KeyProtectionLevel.NoConsent, InstallOptions.None, friendlyName);

3) Проверьте сертификат в хранилище сертификатов.

CertificateQuery certQuery = new CertificateQuery();
certQuery.FriendlyName = friendlyName;
IReadOnlyList<Certificate> certs = await CertificateStores.FindAllAsync(certQuery);

certs[0] должен иметь сертификат, который вам нужен.

4) Теперь, чтобы прикрепить сертификат к HTTP-запросу

HttpBaseProtocolFilter protolFilter = new HttpBaseProtocolFilter();
protolFilter.ClientCertificate = certs[0] //from previous step
HttpClient client = new HttpClient(protolFilter)

PS: Вы не должны использовать System.Net.htpp.HttpClient. Вместо этого вы должны использовать Windows.Web.Http.HttpClient.