Android Paho SSL与服务器发送CA证书,包括Hostname Verification

时间:2015-09-04 15:31:49

标签: android ssl mqtt paho

重复:有一些类似的问题(How Can I Access an SSL Connection Through Android?"Trust anchor for certification path not found" in Android SSL Socket clientTrust anchor for certification path not found using SSL) 对我的问题没有适用的答案。我尝试给出一个特定的上下文(例如paho和特定的测试站点)和问题。

主要问题:我正在使用Android Paho作为客户端,一切都很好。现在我想添加SSL连接。代理是经过认证的实体,并在握手期间发送其CA颁发的证书。 (请注意,我是一名安全新手,我刚刚阅读了一些有关该主题的教程。)

我能找到的大多数Java和Paho示例都涉及到拥有本地证书(自行颁发或知名度较低的CA等),而我需要管理CA颁发的证书。握手期间代理服务器的我的应用程序。

从Android文档(https://developer.android.com/training/articles/security-ssl.html),我们的想法似乎是您必须使用SSLSocketFactory.getDefault(),因为知名CA的根CA认证包含在系统中。所以,简单地说:

MqttConnectOptions options;

// ...

options.setSocketFactory(SSLSocketFactory.getDefault());

但我测试了两者:

  • SSL://iot.eclipse.org:8883
  • SSL://test.mosquitto.org:8883

我总是遇到可怕的javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

上述Android文档和Stack Overflow答案给出的可能原因可能不适用于这些众所周知和使用过的测试站点。我认为这两个站点都有由知名证书颁发机构颁发的更新证书,而且链中没有鲜为人知的CA. (虽然我找不到明确的确认,网上的使用示例似乎暗示了它。)

任何指针?我真的不知道从哪里开始(我认为我遗漏了一些明显没有明确陈述的东西。)

次要问题:此外,Android文档警告SSLSocket未执行任何主机名验证:https://developer.android.com/training/articles/security-ssl.html#WarningsSslSocket

因此它暗示:

SocketFactory sf = SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) sf.createSocket("gmail.com", 443);
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
SSLSession s = socket.getSession();

// Verify that the certicate hostname is for mail.google.com
// This is due to lack of SNI support in the current SSLSocket.
if (!hv.verify("mail.google.com", s)) {
    throw new SSLHandshakeException("Expected mail.google.com, "
                                    "found " + s.getPeerPrincipal());
}

请注意,您需要引用实际套接字以传递给verify()(没有重载替代方案),您不能只配置SSLSocketFactory

Paho似乎没有暴露对它正在使用的套接字的访问权限,而不是设置自定义验证程序。您只能设置SSLSocketFactory

如果我理解正确,似乎有关于它的Paho错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=425195

它实际上是同一个问题吗?

最后,如果是这样,有没有办法解决这个问题,实际上是通过主机名验证使用Android Paho吗?

编辑,部分答案/调查结果:我在这里记录了我的部分临时调查结果。

我对iot.eclipse.org:8883test.mosquitto.org:8883的假设似乎是错误的:我找到了两个提供证书以供客户明确使用的文档(我假设自签名,未指定)。省略这一点的一些例子误导了我。

在自定义TrustManager中加载证书,一切正常。神秘在这一点上解决了。我们自己的CA证书经纪人尚未准备好接受测试。

0 个答案:

没有答案