0

我有一個在Windows Phone 8.1上運行的應用程序,它通過InAppBrowser插件調用URL。該URL應該要求存儲在電話上的虛擬智能卡上的用戶證書。 當我通過Internet Explorer撥打網址時,系統會要求我輸入PIN碼以解鎖虛擬智能卡,但在InAppBrowser中,這不起作用。沒有PIN提示,什麼都沒有。 迭代通過證書從Cordova InAppBrowser訪問虛擬智能卡上的證書

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

產生,我可以看到在應用程序運行時的證書,但InAppBrowser似乎並沒有查詢他們。我是否必須將其引用複製到另一個證書存儲區,或者InAppBrowser是否無法使用用戶證書建立SSL?

回答

0

問題出在webview組件x-ms-webview上。 InAppBrowser插件在內部使用此組件。 找到了解決方法中提到here,還挺聽起來像一個安全問題TBH所以這有可能會固定在未來,但這裏有上說,解決方法的詳細信息:

請給這應該觸發虛擬智能卡解鎖的URL的請求訪問用戶證書,但與HttpClient的在本地水平(C#)

我在我的解決方案,做一個簡單的POST到我想從InAppBrowser訪問這個URL創建另一個Windows運行時組件。 設置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再次訪問安全網址的代碼。本地請求會導致PIN提示符進入虛擬智能卡訪問,一旦您輸入了正確的PIN碼,InAppBrowser/WebView就可以神奇地建立連接。