为什么android会得到错误的ssl证书?(两个域,一个服务器)

hug*_*hes 17 ssl android nginx androidhttpclient

我有两个域:foo.netbar.com.它们都具有SSL证书,并且在所有桌面和移动浏览器中都能很好地运行.它们托管在使用nginx配置的同一台服务器上.

但是,当我从本机Android应用程序中向域发出请求时,它会以某种方式从错误的域获取证书!这会导致IO异常:

request = new HttpPost("https://foo.net/api/v1/baz");
request.setHeader("Authorization", "user:pass");
response = httpClient.execute(request);
Run Code Online (Sandbox Code Playgroud)

...

javax.net.ssl.SSLException: hostname in certificate didn't match: <foo.net> != <bar.com> OR <bar.com> OR <www.bar.com>

什么会导致android/java尝试使用证书bar.com时,其他每个措施似乎表明服务器配置正确?nginx访问或错误日志中没有任何内容.bar.com在我的android项目中没有提到任何地方.

编辑:我不知道为什么,但似乎服务器正在使用证书为bar.com服务器IPhttps://198.245.xx.xxx

Bru*_*uno 29

导致此问题的最可能原因是服务器使用服务器名称指示来选择要发送的证书.如果客户端不支持SNI,则服务器无法选择在SSL/TLS握手期间(在发送任何HTTP流量之前)要发送的证书.如果要在同一IP地址和端口上使用多个证书,则需要SNI,但并非所有客户端都支持它(众所周知,任何版本的Windows XP上的IE以及许多移动浏览器).

你也明显地使用了Apache HTTP Client库(不是HttpsURLConnection,对于某些Android版本可以支持SNI.在Apache HTTP Client库中支持SNI 是最新的,当然还没有进入Android堆栈.

您可能会发现本文中描述的解决方法很有用(尽管它似乎只适用于Android 4.2+).

另外两个选择是:

  • 如果您控制服务器,则为每个主机使用不同的IP地址(以便不需要SNI)
  • 使用另一个HTTP客户端库(例如HttpsURLConnection).