Не удалось отправить сертификат после обновления до последнего 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. Нужно ли это как-то установить?
Ответы
Ответ 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
.