忽略 DefaultHttpClient 中的 ssl 错误

2023-12-12

我正在寻找忽略默认 httpclient 中所有 ssl 错误(例如不可信)的可能性。我在这里看到了很多解决方案,但我总是必须导入特定的证书并将其添加到信任管理器中,或者用于 HttpsUrlConnection 而不是 DefaultHttpClient。 我使用的网络请求是:

    public static String makeGETRequest(String s,String encoding)
{
    DefaultHttpClient http = new DefaultHttpClient();
    final String username = "USERNAME";
    final String password = "PASSWORD";
    UsernamePasswordCredentials c = new UsernamePasswordCredentials(username,password);
    BasicCredentialsProvider cP = new BasicCredentialsProvider(); 
    cP.setCredentials(AuthScope.ANY, c); 
    http.setCredentialsProvider(cP);
    HttpResponse res;
    try {

        res = http.execute(new HttpGet(s));
        InputStream is = res.getEntity().getContent();
        BufferedInputStream bis = new BufferedInputStream(is);
        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        int current = 0;
        while((current = bis.read()) != -1){
              baf.append((byte)current);
         }

        return  new String(baf.toByteArray(),encoding);
       } 
    catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        return "error: " + e.getMessage();
    } 
    catch (IOException e) {
        // TODO Auto-generated catch block
        return "error: " + e.getMessage();
    } 

}

And:

public static String makePOSTRequest(String s, List <NameValuePair> nvps,String encoding)
{
    DefaultHttpClient http = new DefaultHttpClient();
    final String username = "USERNAME";
    final String password = "PASSWORD";
    UsernamePasswordCredentials c = new UsernamePasswordCredentials(username,password);
    BasicCredentialsProvider cP = new BasicCredentialsProvider(); 
    cP.setCredentials(AuthScope.ANY, c); 
    http.setCredentialsProvider(cP);
    HttpResponse res;
    try {
        HttpPost httpost = new HttpPost(s);
        httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.DEFAULT_CONTENT_CHARSET));
        res = http.execute(httpost);
        InputStream is = res.getEntity().getContent();
        BufferedInputStream bis = new BufferedInputStream(is);
        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        int current = 0;
        while((current = bis.read()) != -1){
              baf.append((byte)current);
         }
        res = null;
        httpost = null;
        String ret = new String(baf.toByteArray(),encoding);
        return  ret;
       } 
    catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        return e.getMessage();
    } 
    catch (IOException e) {
        // TODO Auto-generated catch block
        return e.getMessage();
    } 

}

有谁知道如何忽略此代码中的 ssl 错误?

编辑: 因为我只能信任一个特定的(过期的)证书,所以我尝试通过以下方式覆盖 DefaultHttpClient:

public class MyHttpClient extends DefaultHttpClient {
final Context context;

  public MyHttpClient(Context context) {
    this.context = context;
  }

  @Override protected ClientConnectionManager createClientConnectionManager() {
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(
        new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", newSslSocketFactory(), 443));
    return new SingleClientConnManager(getParams(), registry);
  }

  private SSLSocketFactory newSslSocketFactory() {
    try {
      KeyStore trusted = KeyStore.getInstance("BKS");
      InputStream in = context.getResources().openRawResource(R.raw.mykeystore);
      try {
        trusted.load(in, "mypassword".toCharArray());
      } finally {
        in.close();
      }
      return new SSLSocketFactory(trusted);
    } catch (Exception e) {
      throw new AssertionError(e);
    }
  }

}

R.raw.mykeystore 中的文件是一个 .bks 文件,我用它创建的Portecle,我创建一个新的 bks 并导入过期证书的存储 pem,它似乎可以工作并且密钥存储加载没有错误,但是如果我执行请求,我会收到 IO 异常,并显示消息“无对等证书”,什么可能是问题所在?


我解决了这个问题。如果您使用上述请求,但使用您自己的版本而不是 DefaultHttpClient,则它可以工作:

public class MyHttpClient extends DefaultHttpClient {
final Context context;
TrustManager easyTrustManager = new X509TrustManager() {
    @Override
    public void checkClientTrusted(
            X509Certificate[] chain,
            String authType) throws CertificateException {
    }

    @Override
    public void checkServerTrusted(
            X509Certificate[] chain,
            String authType) throws CertificateException {
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }    
};
  public MyHttpClient(Context context) {
    this.context = context;
  }

  @Override protected ClientConnectionManager createClientConnectionManager() {
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(
        new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", newSslSocketFactory(), 443));
    return new SingleClientConnManager(getParams(), registry);
  }


  private MySSLSocketFactory newSslSocketFactory() {
    try {
      KeyStore trusted = KeyStore.getInstance("BKS");      
      try {
         trusted.load(null, null);

      } finally {
      }

      MySSLSocketFactory sslfactory =  new MySSLSocketFactory(trusted);
        sslfactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        return sslfactory;
    } catch (Exception e) {
      throw new AssertionError(e);
    }

  }
  public class MySSLSocketFactory extends SSLSocketFactory {
        SSLContext sslContext = SSLContext.getInstance("TLS");

        public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
            super(truststore);

            TrustManager tm = new X509TrustManager() {
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }

                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }

                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };

            sslContext.init(null, new TrustManager[] { tm }, null);
        }

        @Override
        public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
            return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
        }

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

忽略 DefaultHttpClient 中的 ssl 错误 的相关文章

  • Realm 中的更新语句

    I have VisitingCardPOJO表格 我想更新单个条目说在哪里no 3 VisitingCardPOJO java public class VisitingCardPOJO extends RealmObject Prima
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • 如何使 FirebaseAuth.AuthStateListener 在 Kotlin 中工作?

    class LoginActivity AppCompatActivity private val firebaseAuth FirebaseAuth getInstance private val firebaseAuthListener
  • android ndk 多点触控?

    我正在编写一个仅使用本机代码的应用程序 那么ndk中是否可以获取多点触控事件呢 我感觉我已经搜索了整个网络 但什么也没找到 有谁知道如何做到这一点 是的 您可以检查名为native activity查看如何获取输入事件 寻找engine h
  • 多种语言的多种字体

    我最近在开发应用程序时遇到了一种情况 我必须在文本视图中显示不同的语言 目前我正在展示一些使用字体 字体像这样 Typeface tf Typeface createFromAsset this getAssets DroidHindi t
  • 如何实现 ALTER TABLE 的示例[重复]

    这个问题在这里已经有答案了 我已经多次问过这个问题 但尚未得到完整的答案 如何实现 ALTER TABLE 语句以向数据库添加列 有人可以给我举个例子吗 请阅读SQLite ALTER TABLE 参考 http sqlite org la
  • 如何使用 runOnUiThread 而不出现“无法对非静态方法进行静态引用”编译器错误

    我有一个主课 ClientPlayer extends Activity 和一项服务 LotteryServer extends Service implements Runnable 当尝试在此服务的 run 方法中使用 RunOnUiT
  • 带有图层列表的自定义背景以显示对角线?

    我只想创建一个自定义背景 但我不知道如何使用 xml 而不是图像来做到这一点 这是 XML
  • 在 apache 上托管多个 SSL 证书

    我希望有人能帮我解决这个问题 我有 2 个 IP 可用于执行此操作 并且需要在同一台 Apache 服务器上托管 2 个不同的安全 SSL 域 我已经读到 从 Apache 2 2 开始 可以使用某种插件来使用单个 IP 但我希望保持尽可能
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • Cordova + android:无法从应用程序打开拨号盘或邮件意图

    我有一个奇怪的问题 我无法从应用程序中打开带有预定义号码或邮件意图的拨号盘 我正在使用 netbeans 8 0 1 创建 cordova 应用程序 我的 Cordova 版本是 4 0 0 我按照步骤创建了一个应用程序 并选择了 Hell
  • 如何将设备屏幕位置转换为发送事件位置?

    我知道关于input tap x yshell 命令 但是 我想了解如何 使用执行单击sendevent命令 我能够通过以下命令实现它 sendevent dev input event5 3 53 X sendevent dev inpu
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • 如何使用 Retrofit 解析嵌套 json....?

    我不知道该怎么办使用 Retrofit 解析 json 熟悉使用 Retrofit 解析简单的 json 但不熟悉解析嵌套Json using Retrofit 这是我的 Json 数据 current observation image
  • PhoneGap 1.4 封装 Sencha Touch 2.X - 性能怎么样?

    我正在构建一个多平台平板电脑应用程序 仅使用其 Webview 使用 Phonegap 1 4 对其进行包装 然后使用 Sencha Touch 2 框架发挥我的魔力 我所说的多平台是指 iOS 5 X 和 Android 3 0 目前 到
  • 以编程方式向 LinearLayout 添加边框

    我该如何添加以编程方式LinearLayout 的边框 假设我们创建了这个布局 LinearLayout TitleLayout new LinearLayout getApplicationContext TitleLayout setO
  • 找不到数据库路径是不可能的

    我对 android 开发很陌生 现在我正在尝试通过扩展 SQLiteOpenHelper 的类创建数据库 我确信数据存储在我的 Nexus 7 我用来测试应用程序的设备 上的某个位置 但是我找不到数据库的路径 我四处寻找其他类似的问题 所
  • 在android中从SD卡上传图像到facebook

    我无法从 SD 卡上传 Facebook 上的图像 我使用了下面的代码 但它没有给我错误 但同时它没有上传图像 byte data null try FileInputStream fis new FileInputStream filep
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v

随机推荐

  • 类型错误:不可散列的类型

    我正在尝试获取元组列表的列表 类似 1 0 2 0 3 0 1 1 2 1 3 1 我用了这个声明 set a b for a in range 3 for b in range 3 但这给了我一个错误 TypeError unhashab
  • 使用 C#/.Net 时只读如何影响目录?

    我发现我可以写入 例如 将文件复制到 只读目录 也就是说 一个目录 Attributes FileAttributes ReadOnly 我什至可以改变它的名字 我发现唯一不能做的就是删除它 这真的是唯一的事情吗 ReadOnly防止 ED
  • DataGrid 重新定位将新行添加到顶部

    在 DataGridview 中 空白行添加条目很方便 但当列表很大时很快就会丢失 您可以将其默认位置从 DataGrid 视图的底部更改为顶部吗 我很少用过DataGrid并且对其添加行的能力一无所知 但从 WPF MVVM 的角度来看
  • 发现:所需单位:Int - 如何纠正这个问题?

    scala gt class Rectangle Length Int Width Int def getLlength Int println Length def getWidth Int println Width
  • 如何为 ASP.NET MVC 上的 GET 和 POST 操作绑定字典类型参数

    我想定义一个显示标签和复选框列表的视图 用户可以更改复选框 然后发回 我在回传字典时遇到问题 也就是说 post方法的字典参数为null 以下是 GET 和 POST 操作的操作方法 public ActionResult MasterEd
  • MEF WPF - 通过插件取消 Application.Current.Shutdown()

    有什么办法可以取消 Application Current Shutdown 背景 我玩了一下 mef 并将一些插件添加到我的主应用程序中 如果有任何插件调用 Application Current Shutdown 我的主应用程序也关闭了
  • 使用 android TimerTask 和 Timer 防止最终用户操纵计时器

    如何确保一项应在 Android 操作系统上运行 x 时间的任务在该 x 时间段内运行 而无需用户操纵日期和时间 例如 如果我希望这个计时器持续运行 24 小时 然后通知用户 24 小时已经过去 即使手机关闭一小时 用户也会将其重新打开并将
  • MS SQL 时态表更新失败

    我找不到任何东西来解释为什么当调用一个 SP 来根据临时表上是否已存在记录进行插入或更新时 我得到 系统版本表上的数据修改失败 MYDB dbo TemporalExample 因为事务时间早于 受影响记录的周期开始时间 这意味着什么剂量
  • 如何让 Google Apps 脚本服务的剩余每日邮件配额持续工作?

    我做了一个关于谷歌应用程序脚本的项目 用于在发送表单响应后发送自动电子邮件 但是 当我使用以下命令检查剩余电子邮件的每日配额时MailApp getRemainingDailyQuota 方法中 配额响应随每个脚本执行而变化 所以我创建了另
  • 创建通用的 angularjs listController

    Angular ui router 允许我解决可以在控制器中使用的不同注入 我创建了一个简单的通用 ListController 并在 ui router 中注入一个对象 其中包含特定于该特定视图的 CRUD 函数以及模板 举例来说 假设我
  • 更新 Firestore 中数组的映射数据 - Flutter

    我一直在尝试创建一个由 Google 的 Firebase 提供支持的演示 Schedule App 但我在更新特定值时遇到了一些困难具有映射值的数组在 Firestore 的一侧 如下图所示 我们想要实现什么 is onButtonPre
  • 由 Xcode 版本 13 构建的应用程序在 iOS 12 上崩溃

    我的应用程序在 iOS 15 和 14 上运行良好 也许在 13 上也运行良好 但是 当我在使用 iOS 12 的旧设备上运行时 即使在触发 didFinishLaunchingWithOptions 之前 它也会在启动时崩溃 上次我使用
  • 将当前日期时间插入审核表

    我正在实施审核日志来记录brief对数据库更改的描述 我的审核表由自动编号 PK empID 编号 说明 备忘录 和auditDate 日期 时间 组成 我的 empID 和描述已正确插入 不会引发错误 但我的日期 时间未插入 我想这可能不
  • jsTree 在创建节点后获取新节点

    我试图在用户编辑新节点的名称并按 Enter 键后获取新创建节点的文本值 当我这样做时 on create node jstree function e data var id data node id alert id text 我在警报
  • 同时按下鼠标和按键 Java Swing

    使用 Java Swing 我有 20 个JLabels Each JLabel has a MouseListener and a KeyListener 我一直在尝试想出一种方法 没有运气 来知道鼠标已进入 悬停在哪个标签以及何时按下删
  • 使用 tf.set_random_seed 在 Tensorflow 中重现结果

    我正在尝试生成 N 组独立的随机数 我有一个简单的代码 显示了 3 组 10 个随机数的问题 我注意到即使我使用tf set random seed设置种子 不同运行的结果看起来并不相似 非常感谢任何帮助或意见 py3p6 bash 3 2
  • Array.Sort 是如何在 .NET 中实现的?

    我在编程中使用结构 并根据结构中的值对结构进行排序IComparer 微软是如何实施的Array Sort 方法 有这方面的任何文档 参考资料 吗 所有类型都一样吗Sort 在 Visual Basic 中 这是我想要的一个简单的例子 Di
  • 如何使用 Angular 2 在 URl 中使用问号

    我是 Angular 2 的新手 这里显示了将显示我的 url 的路由器代码 路由器代码现在 当我运行该代码时 网址看起来像这样 本地主机 50465 促销 3Fid 3D 51059 在该网址中显示 3F而不是问号 和 3D而不是等于 展
  • 如何向 Android 布局添加滚动功能?

    我的布局代码如下 我无法看到完整内容 也无法滚动 如何滚动显示全部内容
  • 忽略 DefaultHttpClient 中的 ssl 错误

    我正在寻找忽略默认 httpclient 中所有 ssl 错误 例如不可信 的可能性 我在这里看到了很多解决方案 但我总是必须导入特定的证书并将其添加到信任管理器中 或者用于 HttpsUrlConnection 而不是 DefaultHt