【问题标题】:HTTPS GET (SSL) with Android and self-signed server certificate带有 Android 和自签名服务器证书的 HTTPS GET (SSL)
【发布时间】:2010-09-21 15:16:46
【问题描述】:

我查看了有关如何在 Android 上通过 HTTPS 从使用自签名证书的服务器检索某些内容的各种帖子。但是,它们似乎都不起作用-它们都无法删除

javax.net.ssl.SSLException:不受信任的服务器证书消息。

不能将服务器修改为具有可信证书,也不能使服务器证书与服务器的 IP 地址匹配。

请注意,服务器不会有 DNS 名称,它只会有一个 IP 地址。 GET 请求如下所示:

 https://username:password@anyIPAddress/blabla/index.php?param=1&param2=3

我完全清楚这种解决方案容易受到中间人攻击等。

因此,解决方案必须忽略对证书缺乏信任,并忽略主机名不匹配。

有谁知道使用 Java for Android 的代码吗?

stackoverflow.com 上有很多解释这个问题的尝试,还有很多代码 sn-ps,但它们似乎不起作用,而且没有人提供一个代码块来解决这个问题,据我所知看。想知道是否有人真的解决了这个问题,或者 Android 是否只是阻止了不受信任的证书。

【问题讨论】:

标签: java android ssl


【解决方案1】:

正如您正确指出的那样,有两个问题:a)证书不受信任,b)证书上的名称与主机名不匹配。

警告:对于任何其他获得此答案的人来说,这是一个肮脏、可怕的黑客攻击,您不得将它用于任何重要的事情。没有身份验证的 SSL/TLS 比根本没有加密更糟糕 - 读取和修改您的“加密”数据对于攻击者来说微不足道,而您甚至都不知道它正在发生 .

还和我在一起吗?我很害怕……

a) 通过创建一个 TrustManager 接受任何内容的自定义 SSLContext 来解决:

SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, new TrustManager[] {
  new X509TrustManager() {
    public void checkClientTrusted(X509Certificate[] chain, String authType) {}
    public void checkServerTrusted(X509Certificate[] chain, String authType) {}
    public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
  }
}, null);
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());

和 b) 通过创建一个 HostnameVerifier,即使证书与主机名不匹配,也允许连接继续进行:

HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
  public boolean verify(String hostname, SSLSession session) {
    return true;
  }
});

这两者都必须发生在代码的开头,在您开始搞乱 HttpsURLConnections 等等之前。这适用于 Android 和常规 JRE。享受吧。

【讨论】:

  • 问题已经提到了安全问题。但是,当您通过密钥库和对证书进行排序时 - 几个小时后 - 仍然存在问题,因为“GlobalTrust CA, Inc.”与“GlobalTrust CA Inc.”不同。 (没有逗号)您开始考虑数据是否合理 - 我非常感谢代码 sn-p “禁用安全性”。至少对于原型...
【解决方案2】:

我制作了一个使用自签名或信任所有证书的应用。来源是here,免费使用:P

只需使用 HttpManager 并使用 trust all 来创建 SSL 工厂。示例代码找到here

【讨论】:

  • 就像@Lars D 说的那样,SO 上的其他解决方案不起作用,但是这个可以,非常感谢!
  • 我很高兴,我想哭。这段代码是经过大量搜索后第一个有效的解决方案。感谢 x1000 开源您的代码!
  • 似乎无法完成这项工作。我将 HttpManager 中的 SSLSocketFactory 更改为“TrustAllSSLSocketFactory”,但我不断收到“java.security.cert.certpathvalidatorexception:找不到证书路径的信任锚。返回一个无效会话,其中 SSL_NULL_WITH_NULL_NULL 密码套件无效
  • SSLPeerUnverifiedException : 没有对等证书
【解决方案3】:

如果您使用的是 HttpsURLConnection,请尝试在 connect() 之前对其调用 setHostnameVerifier,并传递给它一个 HostnameVerifier,无论其真实性如何,它都会接受。

【讨论】:

  • 它对我有用,但在 Java 中是不可否认的。您确定在对连接进行任何 I/O 之前调用了它吗?
  • 我尝试了许多不同的代码 sn-ps,它们都替换了主机名验证器并执行不同类型的 SSL 证书忽略,但是证书错误消息不断出现,无论我复制哪个代码 sn-p .发布特定的源代码对我来说没有意义,因为我尝试了几种不同的解决方案——我希望看到的是在 Android 上运行的东西。应该有人解决过这个问题,应该可以复制粘贴一些源代码...
  • 如果您尝试在非安卓设备上使用 Java 连接到同一台服务器会发生什么?
  • Yuliy,你的问题只有在我有一段代码失败并且我试图修复那段代码时才有意义。但我尝试了许多不同的代码,来自 stackoverflow.com 和其他地方。其中一些可能在 Android 之外工作,一些可能不是。那对我没有帮助。目标是为 Android 找到一个完整的代码 sn-p,它已知可以工作。
  • Lars,我要求尝试确定它在 android 上的事实是否是红鲱鱼。这就是尝试从桌面 Java 客户端执行 SSL 连接的方式。
【解决方案4】:

【讨论】:

    【解决方案5】:

    如果您有权访问设备,则可以将证书添加到密钥库。 See more informations here.

    另一方面,您可以使用this 方法,但我认为它有点丑。


    资源:

    关于同一主题:

    【讨论】:

    • 你链接的两个源代码sn-ps我已经试过了,但是都报服务器证书不可信,好像根本就不行。
    • 我还尝试了“HTTPS connection android”线程中的一些代码——结果相同。困扰我的是,所有试图提供帮助的人都没有提供一个有效的代码 sn-p,如果我结合他们提供的代码 sn-ps,它就不起作用。
    • 将证书添加到密钥库是一种解决方法,但这是一个乏味的过程,因为它需要客户端知道服务器配置,这是一个不需要的假设。
    • 我认为最好的处理方法是重写自己的SSLSocketFactory,如果您不想使用密钥库。本教程详细解释了如何做到这一点:mobile.synyx.de/2010/06/…
    • 这应该是正常框架中的单行代码,不知道为什么好像没人有代码sn-p可以粘贴进去。
    【解决方案6】:

    如果您问我,请以安全的方式进行。

    找到了一个很好的教程http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/,实现起来真的没那么难。

    Maciek推荐的教程也很好。

    我对其进行了测试,它可以在我的应用中正常运行。

    【讨论】:

      【解决方案7】:

      我 4 个月前制作了一个使用自签名证书的应用程序,我希望它有帮助的代码:https://bitbucket.org/momo0002/tlsdemo.git

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-08
        • 2016-11-08
        • 2016-07-10
        • 2016-07-17
        • 2010-12-11
        • 1970-01-01
        相关资源
        最近更新 更多