Cordova InAppBrowser 访问虚拟智能卡上的证书

Posted

技术标签:

【中文标题】Cordova InAppBrowser 访问虚拟智能卡上的证书【英文标题】:Cordova InAppBrowser accessing certificate on virtual smartcard 【发布时间】:2016-03-07 09:57:43 【问题描述】:

我有一个在 Windows Phone 8.1 上运行的应用程序,它通过 InAppBrowser 插件调用 URL。该 URL 应该要求用户提供存储在手机上的虚拟智能卡上的用户证书。 当我通过 Internet Explorer 调用 URL 时,系统会要求我输入 PIN 码来解锁虚拟智能卡,但在 InAppBrowser 中,这不起作用。没有 PIN 提示,什么都没有。 遍历产生的证书

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

我可以在应用程序运行时看到证书,但 InAppBrowser 似乎没有查询它们。我是否必须将其引用复制到另一个证书存储区,还是 InAppBrowser 无法使用用户证书建立 SSL?

【问题讨论】:

【参考方案1】:

问题在于 webview 组件,更准确地说是x-ms-webview。 InAppBrowser 插件在内部使用这个组件。 找到了提到here 的解决方法,这听起来像是一个安全问题,所以这可能会在未来得到解决,但这里有更多关于上述解决方法的详细信息:

向应该触发虚拟智能卡解锁以访问用户证书的 URL 发出请求,但使用 HttpClient 在本机级别 (C#)

我在我的解决方案中创建了另一个 Windows 运行时组件,它对我稍后要从 InAppBrowser 访问的 url 执行简单的 POST。 在设置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 可以神奇地建立连接。

【讨论】:

以上是关于Cordova InAppBrowser 访问虚拟智能卡上的证书的主要内容,如果未能解决你的问题,请参考以下文章

cordova插件新的窗口实例打开连接: cordova-plugin-inappbrowser

Cordova/PhoneGap 打开下载的文件 (InAppBrowser)

[Cordova inAppBrowser 在App内打开浏览器]

如何在cordova项目中异步打开inappbrowser

Cordova InAppBrowser立即关闭iOS 13

Cordova iOS - inAppBrowser 未按预期工作