Android 使用自签名证书连接到服务器

2024-01-11

编辑:“下面的代码工作正常,没有错误,没有异常”

我知道关于这个主题的大量问题,以及谷歌想到的许多博客。我已通读它们并设法想出我将要解释的内容。我的疑问在于“我的方法正确吗?它有副作用吗?”以及在我解释我的方法时最好提出的另一个问题。

我基于此方法遵循此Android.开发者教程 http://developer.android.com/training/articles/security-ssl.html#UnknownCa.

 System.setProperty("jsse.enableSNIExtension", "false");  
 //Java 7 introduced SNI (enabled by default). The server I use is
 // misconfigured I suppose and
 // it sends an "Unrecognized Name" warning in the SSL handshake
 // which breaks my web service.

// Load CA from an InputStream (CA would be saved in Raw file,
// and loaded as a raw resource)
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    InputStream caInput = new BufferedInputStream(new FileInputStream("PATH_TO_CERT.crt"));

    Certificate ca;
    try {
        ca = cf.generateCertificate(caInput);
    } finally {
        caInput.close();
    }

    // Create a KeyStore containing our trusted CAs
    String keyStoreType = KeyStore.getDefaultType();
    KeyStore keyStore = KeyStore.getInstance(keyStoreType);
    keyStore.load(null, null);
    keyStore.setCertificateEntry("ca", ca); 

    // Create a TrustManager that trusts the CAs in our KeyStore
    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
    tmf.init(keyStore);

    // Create an SSLContext that uses our TrustManager
    SSLContext context = SSLContext.getInstance("TLS");
    context.init(null, tmf.getTrustManagers(), null);

 // Create all-trusting host name verifier 
    //  to avoid the following :
    //   java.security.cert.CertificateException: No name matching
    // This is because Java by default verifies that the certificate CN (Common Name) is
   // the same as host name in the URL. If they are not, the web service client fails.

     HostnameVerifier allHostsValid = new HostnameVerifier() {
        @Override
        public boolean verify(String arg0, SSLSession arg1) {
            return true;
        }
    };

    //Install it
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);


    // Tell the URLConnection to use a SocketFactory from our SSLContext
    URL url = new URL("https....");
            urlConnection.setSSLSocketFactory(context.getSocketFactory());

    try {

        HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");

        urlConnection.connect();

        switch(urlConnection.getResponseCode()){
        case 401:


            BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getErrorStream()));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line+"\n");
            }
            br.close();

            System.out.println( sb.toString());

        }



    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }



}

这是我的另一个问题,如下所示:

InputStream caInput = new BufferedInputStream(new FileInputStream("PATH_TO_CERT.crt"));

您会看到该方法强制我将certificate.crt 预加载到res 文件夹内的原始文件中。有没有办法(我已经看过,但找到了 0 个答案)连接到服务器并下载所述certificate.crt并将其保存在用户无法访问的私人文件夹中?


None

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

Android 使用自签名证书连接到服务器 的相关文章

随机推荐

  • 在 C# XML 文档中,只有摘要标记有效

    我正在尝试为我的 VS 代码作业添加 XML 文档 但当将鼠标悬停在函数 变量上时 仅显示摘要块中的文本 它也发生在普通的 Visual Studio 和多 台计算机上 所以我认为这只是我不明白的事情 但我尝试用谷歌搜索它并没有得到任何结果
  • Go 中的构造函数

    我有一个结构 我希望用一些合理的默认值来初始化它 通常 这里要做的是使用构造函数 但由于 Go 并不是传统意义上的真正的 OOP 因此它们不是真正的对象 并且它没有构造函数 我注意到了 init 方法 但那是在包级别 还有其他类似的东西可以
  • db2 类型 4 驱动程序下载

    我想使用 java 应用程序连接到 Db2 数据库服务器 我使用 type4 驱动程序 您能告诉我下载 DB2 Type4 驱动程序的确切位置吗 提前谢谢 实际上推荐的方法是从您正在使用的 DB2 服务器获取它 因为它保证您获得它们的正确版
  • Reflection with Swift - 获取类的函数名称[重复]

    这个问题在这里已经有答案了 我想知道是否有办法获得一些有用的班级构成信息 例如 我发现能够访问类的所有可用函数非常有用 看来MyrrorType但这不是我要找的 我知道我可以使用获取函数名称 FUNCTION 但这并不正是我所需要的 我需要
  • 警告:POST 内容长度 90612004 字节超出了第 0 行未知中 8388608 字节的限制

    我收到这个错误 警告 POST 内容长度 90612004 字节超出了限制 第 0 行未知中的 8388608 字节 我做了一些搜索并改变了post max size and upload max filesize到 150M 并重置 Wa
  • GWT/Java 中等待多个异步事件完成的干净方法

    在 Java 中等待多个异步回调函数完成然后再继续的最佳方法是什么 具体来说 我将 GWT 与 AsyncCallback 一起使用 但我认为这是一个普遍问题 这就是我现在所拥有的 但肯定有更干净的方法 AjaxLoader loadApi
  • 在 Xcode4 中,新的界面生成器显示“无选择”

    我正在使用 xcode 4 02 进行 iPhone 编程 在新的界面生成器中 当我单击按钮 或任何其他 GUI 元素 并转到 属性检查器 时 它会显示 无选择 有一段时间我以为我可以通过保存 nib 文件来解决问题 但它并不总是有效 我怎
  • 将 javascript 添加到扩展 django 模板以进行 google 分析

    我有一个漂亮的小index html 文件 它是一个扩展模板 它的父文件是一个base html 文件 在我的例子中是base2 html 我试图将谷歌分析代码片段添加到我网站上的某些文件中 事实证明 如果我在扩展模板的标签中添加任何内容
  • Rails - 从我的观点中移出计算?

    目前我正在按照我的观点进行一些计算 这当然是一件坏事 我正在研究可以帮助我重构上述问题的方法 一件事是将计算移至我的控制器 category sum transaction sum amount cents 这可能是更好的解决方案 但你知道
  • 在 Matlab 中制作球的动画

    我有一个包含这两个方程的球 x t v0 cos t 并且 y t h v0 sin t 1 2gt 2 其中 t 0 t Final 是时间变量 h 是高度 v0 是初始速度 是 v0 与水平面形成的角度 g 9 8 m s 2 地板位于
  • 一些Python代码的解释

    这是屏障的基本示例 说明一些线程如何等待进入一个入口屏障和另一个出口屏障 虽然代码很好 但我并没有真正深入了解它是如何工作的 例如 我不明白为什么进入 Barrier 函数的线程在执行 n n 1 后 可以立即使 n n 1 从而影响全局
  • 正则表达式非贪婪(惰性)

    我正在尝试非贪婪地解析 TD 标签 我从这样的事情开始 td stuff td align right More stuff td align left 返回的记录如下 stuff td align right More stuff td
  • 将 À 等特殊字符与常规 A 进行比较

    在某些语言中 有类似的字母 我看到对于表视图部分 本机 iOS 将 在同一部分下A 我想做同样的事情 我通过比较第一个字母来构建我的部分 所以我需要那个 将等于 A 我尝试使用localizedCompare但我仍然不知道这两者是相等的 有
  • 使用 CustomAttributes 与 GetCustomAttributes() 的优点

    今天我注意到我的智能感知中出现了一些新属性System Type我的 NET 4 5 项目的对象 其中有一个叫做CustomAttributes 我对此很感兴趣 因为我之前就明白GetCustomAttributes是最昂贵的反射调用之一
  • C 编程自动八进制解释

    Code 1 int a 0987654321 printf d a Code 2 int a scanf d a printf d a 在这里 如果我们输入 0987654321 那么它会打印相同的内容 但在第一个代码片段中 它会给出一个
  • 基本PHP MySQL数组分组问题

    快速问题 我认为对于像我一样拥有最基本的 PHP MySQL 知识的人来说 这是一个非常简单的解决方案 我有一个存储在数据库中的各个州的城市列表 其中包含城市 州和一些其他变量 现在 它们被提取为按城市名称排序的列表 阿拉斯加安克雷奇 马里
  • DataGridView显示行标题单元格

    我正在尝试显示链接到 DataTable 的简单 DataGridView 并且最终我希望 DataTable 中的第一列成为 DataGridView 的行标题单元格 此时 我将满足于在行标题单元格中包含任何值 我可以显示带有所有行和列以
  • 标识符未定义

    我使用 VS2012 Express 用 C 编写了以下代码 void ac search uint num patterns uint pattern length const char patterns uint num records
  • 卷曲远程图像并调整其大小

    我使用此脚本来下载远程图像并调整其大小 在调整大小部分出现问题 它是什么
  • Android 使用自签名证书连接到服务器

    编辑 下面的代码工作正常 没有错误 没有异常 我知道关于这个主题的大量问题 以及谷歌想到的许多博客 我已通读它们并设法想出我将要解释的内容 我的疑问在于 我的方法正确吗 它有副作用吗 以及在我解释我的方法时最好提出的另一个问题 我基于此方法