Приложение Магазина Windows-C# - Аутентификация Клиента Https


Я пытаюсь реализовать аутентификацию клиента Https в своем приложении, но мне трудно найти какую-либо документацию о том, как это сделать.

Просматривая документы MSDN, я пришел к этому

// Certificate file in DER format (.cer or .p7b)   
string CountriesFile = @"Assetshttps-client.keystore.cer";
StorageFolder InstallationFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
StorageFile file = await InstallationFolder.GetFileAsync(CountriesFile);

// Read the file into a buffer
IBuffer buffer = await Windows.Storage.FileIO.ReadBufferAsync(file);

// Create the Certificate object
Certificate ClientCert = new Certificate(buffer);
HttpBaseProtocolFilter aHBPF = new HttpBaseProtocolFilter();
aHBPF.ClientCertificate = ClientCert;

// Create our http client and send the request.
HttpClient httpClient = new HttpClient(aHBPF);
HttpResponseMessage response = await httpClient.SendRequestAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead).AsTask(cts.Token);

Я собрал этот код вместе, глядя на документы для HttpClient, HttpBaseProtocolFilter исертификат . Делая предположение, что я должен иметь сертификат в требуемом формате и читать файл в Certificate класс.

Приведенный выше код не работает и выдает эту ошибку

An exception of type 'System.ArgumentException' occurred in MyLib.DLL but was not handled in user code
WinRT information: The certificate specified is missing the required private key information.

Я протестировал свою серверную настройку, и она работает с аутентификацией клиента через браузер, что приводит меня к двум возможным выводам.

  1. файл сертификата находится в неправильном формате (хотя я надеялся, что исключение будет выброшено при создании класса Certificate).
  2. это не предполагаемый способ сделать это!

Кто-нибудь знает, как это должно быть сделано?

1 2

1 ответ:

Похоже, что вам придется установить сертификат на уровне пользователя, прежде чем вы сможете эффективно использовать его для аутентификации клиента в приложении магазина Windows

// Needs to be a PKCS12 (p12/pfx) file
string certPath = @"Assets\https-client.keystore.p12";
StorageFile file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(certPath);
IBuffer buffer = await FileIO.ReadBufferAsync(file);
string certData = CryptographicBuffer.EncodeToBase64String(buffer);

// Will ask the user if they want this app to install the certificate if its not already installed.
await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync(
     certData,
     "PASSWORD",
     ExportOption.NotExportable,
     KeyProtectionLevel.NoConsent,
     InstallOptions.None,
     "MyFriendlyName"); 

Теперь сертификат установлен, он будет доступен нам в хранилище сертификатов.

var certificate = await CertificateStores.FindAllAsync(new CertificateQuery() { FriendlyName = "MyFriendlyName" });
ClientCert = certificate.Single();

HttpBaseProtocolFilter aHBPF = new HttpBaseProtocolFilter();
aHBPF.ClientCertificate = ClientCert;

// Create our http client and send the request.
HttpClient httpClient = new HttpClient(aHBPF);
HttpResponseMessage response = await httpClient.SendRequestAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead).AsTask(cts.Token);

Я предпочел бы иметь возможность сделать сертификат доступным только для приложения и обновлю этот ответ, если найду способ сделать это.