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内打开浏览器]