2012-02-09 60 views
3

我想调用一个web服务托管在本地网络上使用https安全连接,首先它给了例外HostNameUnresolved,所以我用ip地址而不是名称,现在我收到以下错误:Android模拟器没有连接到本地托管的webservice使用https

Error in geting tags.=javax.net.ssl.SSLException: hostname in certificate didn't match: <10.100.248.99> !=

我已经添加了中级和根证书到Android信任列表。

任何人都可以给我一个解决方案来访问使用主机名称非IP地址的本地网络上安全托管的Web服务?

+1

检查此... http://stackoverflow.com/questions/7256955/java-sslexception-hostname-in-certificate-didnt-match。 – 2012-02-09 14:26:42

+0

@Dark Rider我正在尝试调用本地网络托管的web服务,而不是我的系统。我也无法从仿真器浏览器中查看它。 – Vikram 2012-02-21 11:15:29

+0

看看这个链接,看看为什么DNS查找失败:http://stackoverflow.com/questions/3184463/host-is-unresolved-in-lan – 2012-03-16 15:56:46

回答

1

正如其他人所说,你需要一对夫妇的事情,能够连接您的网络服务:
- 模拟器知道什么是你需要连接到
服务器的IP地址 - 服务器您通过HTTPS连接名称URL必须解决的SSL证书

要做到这一点的领域,你需要:

  • 安装你的模拟器分区writeable

从你的桌面外壳(例如用于Linux,但会在Windows类似,并承担了Android SDK龙头安装在/android-sdk):

cd /android-sdk/tools/ 
./emulator -avd NexusS -partition-size 128 

其中NexusS是你的设备的AVD名称。您MUST从命令行启动模拟器,否则您将在后面的步骤中出现错误。

现在打开另一个shell终端,让你的仿真器/系统/ etc/hosts文件:

cd /android-sdk/platform-tools 
./adb remount 
./adb pull /system/etc/hosts /tmp/ 

remount是设置分区写入。上面的命令pull将主机文件复制到桌面的/tmp/hosts
从桌面编辑在/ tmp/hosts文件,以配合您的需要,也就是说,如果Web服务是https://www.example.com/foo和IP为192.168.1.10:

127.0.0.1  locahost 
192.168.1.10 www.example.com 

然后将其推回模拟器:

cd /android-sdk/platform-tools 
./adb push /tmp/hosts /system/etc/ 

您应该能够立即连接到网络服务。

请注意,如果是自签名证书,您仍可能有错误。

下面的图片是编辑hosts文件之前:
IP doesn't match the certificate

编辑完成后:
Server name match

1

我曾经看到一个类似的错误在我的同事正在做的一个项目,我们发现了原因是,如果你试图让从主UI网络调用线程Android系统阻止它虽然这个功能被引入之后的API就像以前一样工作得很好。这样做是为了减少主UI线程上的压力,所以我们创建了一个单独的服务,然后在其中提供了一个asynctask来进行网络调用。我不记得引入它的确切的API级别,但您可以随时通过护目镜检查它,​​并根据您使用的API级别进行检查。

+0

即时通讯使用8,android 2.2 – Vikram 2012-03-22 12:14:05

+0

@Vikram好的..我的朋友在我们收到这个问题时使用了API级别2.3。我不确定它包含在哪个API级别,所以您可以试试看看它是否适用于您这样..让我知道它是否解决了你的问题... – Nav 2012-03-22 12:18:22

1

您应该使用的HostnameVerifier与给定主机信任机器人。

HttpParams params = new BasicHttpParams(); 
HttpConnectionParams.setConnectionTimeout(params, 5000); 
HttpConnectionParams.setSoTimeout(params, 30000); 
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; 

DefaultHttpClient httpClient = new DefaultHttpClient(); 

SchemeRegistry registry = new SchemeRegistry(); 
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); 
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); 
registry.register(new Scheme("https", socketFactory, 443)); 
SingleClientConnManager mgr = new SingleClientConnManager(httpClient.getParams(), registry); 
DefaultHttpClient client = new DefaultHttpClient(mgr, httpClient.getParams()); 

// Set verifier  
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); 

现在执行你想客户对象的请求。

相关问题