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

Cordova InAppBrowser accessing certificate on virtual smartcard

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

产生的证书
IReadOnlyList<Certificate> certStores = await  CertificateStores.FindAllAsync();

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

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

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

我在我的解决方案中创建了另一个 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>();
    }

}

将该代码 return 作为 Javascript 级别的承诺,一旦它解决,再次启动使用 InAppBrowser 访问安全 URL 的代码。本机请求导致虚拟智能卡访问的 PIN 提示,一旦您输入了正确的 PIN,InAppBrowser / WebView 就可以神奇地建立连接。