Как доверять самозаверяющемуся сертификату в приложении для магазина Windows
Я пытаюсь переопределить проверку сертификата в приложении Windows Store, чтобы принять самозаверяющий сертификат для двух внешних служб (используя HttpClient), чтобы позволить приложению Windows 8 принимать сертификаты и устанавливать доверительные отношения для SSL
EDIT:
Я применил описанный здесь подход: Установка сертификатов с помощью appmanifest
и добавили соответствующие файлы .cer в мое приложение и гарантировали, что они являются "Контент" и "Копировать всегда".
Мой пакет package.appxmanifest Extensions выглядит следующим образом:
<Extensions>
<Extension Category="windows.certificates">
<Certificates>
<Certificate StoreName="TrustedPeople" Content="Assets\ReportingServices.cer" />
<Certificate StoreName="TrustedPeople" Content="Assets\Crm.cer" />
<Certificate StoreName="CA" Content="Assets\DigiCertHighAssurance.cer" />
<TrustFlags ExclusiveTrust="true" />
<SelectionCriteria AutoSelect="true" />
</Certificates>
</Extension>
но это все еще не работает.
Я попытался поместить сертификаты приложений в "Root" StoreName, но все равно не добился успеха. У кого-нибудь есть идеи, почему это может не сработать?
Ответы
Ответ 1
Это немного старый, но, видя, что есть немало наблюдателей, я дам свое решение.
// Create the httpClient and send the request
HttpBaseProtocolFilter aHBPF = new HttpBaseProtocolFilter();
// If you want to ignore expired Certs
aHBPF.IgnorableServerCertificateErrors.Add(ChainValidationResult.Expired);
// Untrused because this is a self signed cert that is not installed
aHBPF.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted);
// Host names and certs names may not match
aHBPF.IgnorableServerCertificateErrors.Add(ChainValidationResult.InvalidName);
HttpClient httpClient = new HttpClient(aHBPF);
HttpResponseMessage response = await httpClient.SendRequestAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead).AsTask(cts.Token);
Ответ 2
Просто чтобы сэкономить ваше время. Я должен решить это в течение 2 дней проб и ошибок. Здесь вы можете решить эту проблему.
Добавьте файл .cer в свой проект, сделайте действие сборки как "Контент", скопируйте как новый
затем добавьте это в свой манифест приложения.
<Capabilities>
<Capability Name="sharedUserCertificates" />
<Capability Name="enterpriseAuthentication" />
<Capability Name="privateNetworkClientServer" />
<Capability Name="internetClient" />
</Capabilities>
<Extensions>
<Extension Category="windows.certificates">
<Certificates>
<Certificate StoreName="Root" Content="Certificates\vibeapi.cer" />
<TrustFlags ExclusiveTrust="true" />
<SelectionCriteria AutoSelect="true" />
</Certificates>
</Extension>
</Extensions>
и к вашему коду позади вы можете теперь получить доступ к файлу, используя этот
//Testing https connection
HttpClientHandler msgHandler = new HttpClientHandler();
using (System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient(msgHandler, true))
{
var HTTPSURL = new Uri("https://www.sample.net/");
var response = await httpClient.GetAsync(HTTPSURL);
var responseStr = await response.Content.ReadAsStringAsync();
}
см. ссылку для справки
help
Ответ 3
Он будет работать, если вы поместите файл cer в корневой каталог проекта и измените раздел содержимого в файле манифеста на Content = "file.cer"