0

У меня есть приложение, работающее под Windows Phone 8.1, которое вызывает URL-адрес через плагин InAppBrowser. Этот URL должен запросить сертификат пользователя, хранящийся на виртуальной смарт-карте по телефону. Когда я вызываю URL-адрес через Internet Explorer, меня просят мой PIN-код, чтобы разблокировать виртуальную смарт-карту, но в InAppBrowser это не работает. Нет PIN-кода, ничего. Перебор Сертификаты получены отКордова InAppBrowser доступ к сертификату на виртуальной смарт-карте

IReadOnlyList<Certificate> certStores = await CertificateStores.FindAllAsync(); 

я могу увидеть сертификат на приложения выполнения, но InAppBrowser, кажется, не запрашивать для них. Нужно ли копировать ссылку на другое хранилище сертификатов, или InAppBrowser не способен устанавливать SSL с сертификатами пользователя?

ответ

0

Вопрос с компонентом webview, x-ms-webview, точнее. Плагин InAppBrowser использует этот компонент внутри. нашел обходной путь упомянутого here, это своего рода звучит как вопрос безопасности ТОГО так что это может получить зафиксированной в будущем, но здесь более подробно об указанном обходном:

сделать запрос к URL, который предполагается запустить виртуальную смарт-карту разблокировать получить доступ к сертификату пользователя, но с HttpClient на родной уровне (C#)

Я создал другую среду выполнения Windows компоненты в моем решении, которое делает простой POST к URL Я хочу получить доступ из InAppBrowser позже. При настройке Windows.Web.Http.HttpClient я извлекаю сертификат пользователя из смарт-карты и устанавливаю его как HttpBaseProtocolFilter.ClientCertificate.

public sealed class SSLHelper 
{ 

    private static String errorMessage = ""; 
    private static String statusMessage = ""; 

    public static IAsyncOperation<Boolean> establishSSLConnection(String url) 
    { 
     return connect(url).AsAsyncOperation<Boolean>(); 
    } 

    public static String getErrorMessage() 
    { 
     return SSLHelper.errorMessage; 
    } 

    public static String getStatusMessage() 
    { 
     return SSLHelper.statusMessage; 
    } 

    private static async Task<Boolean> connect(String urlString) 
    { 

     Certificate clientCert = await getCertificateAsync(); 

     HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter(); 
     filter.ClientCertificate = clientCert; 
     HttpClient client = new HttpClient(filter); 

     try 
     { 
      System.Uri url = new System.Uri(urlString); 
      HttpResponseMessage response = await client.PostAsync(url, new HttpStringContent("")); 
      response.EnsureSuccessStatusCode(); 
      SSLHelper.statusMessage = response.StatusCode.ToString(); 
      return true; 
     } 
     catch (Exception e) 
     { 
      SSLHelper.errorMessage = e.ToString(); 
      return false; 
     } 
    } 


    private static async Task<Certificate> getCertificateAsync() 
    { 

     CertificateQuery query = new CertificateQuery(); 
     query.IssuerName = "Sample Issuer"; 

     IReadOnlyList<Certificate> certStores = await CertificateStores.FindAllAsync(query); 

     return certStores.FirstOrDefault<Certificate>(); 
    } 

} 

сделать что код возврата, как обещание на уровне Javascript и как только он решает, запустить код, который использует InAppBrowser для доступа к защищенному URL снова. Собственный запрос вызывает запрос PIN-кода для доступа к виртуальной смарт-карте, как только вы ввели правильный PIN-код, InAppBrowser/WebView может магически установить соединение.