带有基本身份验证的 SSL 证书问题

2024-02-29

我正在尝试在 web 视图中加载具有基本身份验证的 SSL 页面,但即使我在 onReceivedSslError 中运行proceed() 并且 usr/pwd 是正确的,我也无法通过 onReceivedHttpAuthRequest。如果我删除下面代码中的 hasAuthenticated 检查,它只会无限循环地处理身份验证请求,就像凭据错误一样。尝试进行身份验证时似乎不会接受证书。

添加基本​​身份验证标头并没有改变任何内容,还有其他方法可以解决这个问题吗?

package com.my.package;

import java.util.HashMap;
import java.util.Map;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.HttpAuthHandler;
import android.webkit.SslErrorHandler;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class WebViewActivity extends Activity {
    public final static String USERNAME = "com.my.package.USERNAME";

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Activity thisActivity = this;
        final MainActivity mainActivity = new MainActivity();

        // Get usr + pwd
        Intent intent = getIntent();
        final String username = intent.getStringExtra(MainActivity.USERNAME);
        final String password = intent.getStringExtra(MainActivity.PASSWORD);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // Webview
        setContentView(R.layout.activity_webview);
        WebView webview = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = webview.getSettings();
        webSettings.setJavaScriptEnabled(true);

        // SSL and authentication
        webview.setWebViewClient(new WebViewClient() {
            Boolean haveAuthenticated = false;

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Log.d(thisActivity.getLocalClassName(), "Error " + description);
            }

            @Override
            public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
                Log.d(thisActivity.getLocalClassName(), "Auth " + handler.obtainMessage());
                if (!haveAuthenticated) {
                    Log.d(thisActivity.getLocalClassName(), "!haveAuthenticated/" + handler.obtainMessage());
                    haveAuthenticated = true;
                    handler.proceed(username, password);
                } else {
                    Log.d(thisActivity.getLocalClassName(), "haveAuthenticated/" + handler.obtainMessage());
                    haveAuthenticated = false;
                    setResult(401, mainActivity.getIntent());
                    thisActivity.finish();
                }
            }

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                Log.d(thisActivity.getLocalClassName(), "SSL Error " + error.toString());
                handler.proceed();
            }

            // Trying basic auth headers
        String up = username + ":" +password;
        String authEncoded = Base64.encodeToString(up.getBytes(), 0);
        String authHeader = "Basic " + authEncoded;
        Map<String, String> headers = new HashMap<String, String>();
        headers.put("Authorization", authHeader);

        webview.loadUrl(getString(R.string.webview_url), headers);
    }
}

奇怪的是它适用于某些设备,但不是所有设备,例如不适用于具有以下日志的 Asus Padfone 2。

03-25 08:42:52.363: D/WebViewActivity(30030): SSL primary error: 3 certificate: Issued to: CN=*.company.com,OU=IT,O=COMPANY ASA,L=Here,ST=Norway,C=NO,2.5.4.5=#1320476557596744525532556f634c42487675656f484b2f654a794a554954676356;
03-25 08:42:52.363: D/WebViewActivity(30030): Issued by: CN=GeoTrust SSL CA,O=GeoTrust\, Inc.,C=US;
03-25 08:42:52.363: D/WebViewActivity(30030):  on URL: https://test.company.com/some/page.aspx
03-25 08:42:52.733: D/WebViewActivity(30030): Auth { what=0 when=-1d1h30m25s561ms }
03-25 08:42:52.733: D/WebViewActivity(30030): !haveAuthenticated/{ what=0 when=-1d1h30m25s562ms }
03-25 08:42:52.823: D/WebViewActivity(30030): Auth { what=0 when=-1d1h30m25s655ms }
03-25 08:42:52.823: D/WebViewActivity(30030): haveAuthenticated/{ what=0 when=-1d1h30m25s656ms }

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有基本身份验证的 SSL 证书问题 的相关文章

随机推荐

  • 如何初始化共享 javascript 模块默认导出

    我想在多个模块之间共享一个 api 实例 并能够使用外部配置对其进行初始化 我的代码使用 Webpack 和 Babel 将这些漂亮的 ES6 模块转换为浏览器可用的东西 我正在努力实现这一目标 api js let api null ex
  • 解码熊猫字符

    下面是我的 DF 示例 ROLE NAME GESELLSCHAFTER DUPONT DUPONT GESCH FTSF HRER DUPONT DUPONT KOMPLEMENT R DUPONT DUPONT GESELLSCHAFT
  • 无法分配对象,因为其复制赋值运算符被隐式删除错误

    在我的小型打砖块克隆游戏中 我试图从向量中删除一些值 该向量包含 Brick 类 它们以网格状模式在屏幕上实例化 当球和砖块发生碰撞时 砖块需要消失 我正在尝试用一小段代码来完成此任务 for int i 0 i lt bricks siz
  • CAReplicatorLayer 背后的魔力是什么?

    我觉得 CAReplicatorLayer 有趣的地方是 它能够非常有效地使用不同的变换多次显示 CALayer 如何 看起来它以某种方式重用了复制层的 后备存储 甚至对其应用了一些色调 如何 我想获得源代码或了解 CAReplicator
  • CMD:将 ECHO 管道传输到 SET/在变量中扩展变量

    x 12 3 返回从 x 变量中第 12 个字符开始的 3 个字符 我一直试图完成的是使用变量而不是12 and 3 比方说y 12 and z 3 那么 你就不能使用 x y z 因为 CMD 会认为 x 是一个变量 你能做的是set v
  • IE8 中 IIS7.5 中的 ASP.NET MVC2 的会话不粘连

    我们有一个 ASP NET MVC2 Web 应用程序 由于超出本问题范围的原因 我们决定在应用程序中使用经典会话状态 其中实现了与会话相关的以下功能 global asax 中的 Session Start 事件处理程序在会话中存储变量
  • Python 获取当前 URL

    我如何使用Python获取当前URL 我需要获取当前的 URL 以便我可以检查它的查询字符串 例如 requested url URL HERE url urlparse requested url if url 4 params dict
  • 项目导入需要 Sbt 0.12.4+

    我目前正在阅读Play for Scala Covers Play 2Peter Hilton 的书 出版商 Manning 并尝试坚持他们在书中概述的版本 播放版本 2 1 1 我下载了新的 IntelliJ IDEA 14 CE 应用程
  • Facebook Android SDK 的密钥哈希无效

    我正在尝试使用 Facebook Android SDK 开发一个带有 Facebook 登录按钮的简单应用程序 但我在密钥哈希方面遇到了麻烦 我创建了调试密钥和发布密钥 调试键 keytool exportcert alias andro
  • 如何在 Firefox 中调试 Service Worker?

    在 FF 中调试 Service Worker 似乎非常痛苦 我知道从主页我可以 进入应用程序面板 点击 关于调试 在新页面中搜索我的员工以及其他 200 名员工 单击开始 然后单击检查 我必须寻找两个控制台而不是一个并通过 两者之间的消息
  • git rebase -i HEAD~7 -- 在编辑器中仅显示“noop”

    我正在尝试将位于 HEAD 的提交压缩为后面的提交 当我跑步时git rebase i HEAD 7 但是 我只看到一个noop在编辑器中 我完全不知道这是如何运作的 我在分行工作 cleanup 我创建的 使用checkout b cle
  • 如何检查 VBScript 的默认主机是 WScript 还是 CScript?

    我想知道特定机器上 VBScript 的默认主机是什么 是否设置为 WScript 还是 CScript 例如 如果我使用cscript h cscript s那么有什么方法可以检查主机 VBScript 是否设置为 cscript 我找到
  • 使用逗号运算符是个好习惯吗?

    我最近 实际上仅在 SO 上 遇到了 C C 逗号运算符的使用 据我所知 它在左侧和右侧运算符之间的线上创建了一个序列点 以便您拥有可预测的 定义的 评估顺序 我对为什么要在语言中提供这一点感到有点困惑 因为它似乎是一个可以应用于本来不应该
  • 如何从 vue 3 中的 slot 获取 ref?

    我需要用名字来聚焦参考test1设置一些放置在组件槽中的值 从外部 有可能以某种方式做到这一点吗 我尝试从 refs 或 slots 获取 但失败了 App vue
  • 实时键盘输入到控制台(在 Windows 中)?

    我有一个双向链接列表类 我想在用户键入字符时将字符添加到列表中 或者每次用户按退格键时删除列表中的最后一个节点 同时在控制台中实时显示结果 我将使用哪些函数来拦截单个键盘输入并将其实时显示到控制台 所以结果如下 用户开始输入 Typ 用户停
  • 将列表 1 中的特定数字与列表 2 中的特定数字交换

    最近在温习一些Prolog 我有点喜欢随机提出问题来尝试解决 然后解决它们 但这是相当困难的 我不是一个会放弃我已经着手解决的问题的人 问题 我想创建一个谓词 它有 2 个预先确定的列表 2 个要交换的数字 然后在交换完成后输出列表 进一步
  • 操作 ggpairs 中的轴标题 (GGally)

    我使用下面的代码来生成以下图表 Setup data airquality Device start png filename example png units cm width 20 height 14 res 300 Define c
  • 从字符串中提取最大的数字序列(正则表达式,或?)

    我有类似于以下内容的字符串 4123499 TESCO45 123 every99999994 54 我想分别提取每个字符串中最大的数字序列 4123499 99999994 我以前尝试过正则表达式 我使用的是VB6 Set rx New
  • 将卡片添加到 ListView

    我正在尝试获取列表Cards https docs flutter io flutter material Card class html 并尝试使用Expanded小部件 但得到了overflow error My code new Ex
  • 带有基本身份验证的 SSL 证书问题

    我正在尝试在 web 视图中加载具有基本身份验证的 SSL 页面 但即使我在 onReceivedSslError 中运行proceed 并且 usr pwd 是正确的 我也无法通过 onReceivedHttpAuthRequest 如果