【发布时间】:2021-08-10 11:40:51
【问题描述】:
我的 Android 应用程序用于客户的内部网络,部分配置涉及他们输入 Web 服务的 URL。
Android 从一开始就似乎无法看到内部网络中的主机名,所以直到现在我一直建议人们使用他们服务器的 IP 地址。最近出现的一个问题是客户已将 SSL 应用到他们的服务器,这意味着 URL 只能通过 https 访问,并且自签名证书当然匹配主机名而不是 IP 地址。通过 IP 地址对 URL 的请求不再有效,无论您指定 http 还是 https。
谷歌搜索了几天,建议要么根设备并修改主机文件,要么提供内部 DNS-over-TLS 服务器,但我无法使用这两个选项。
解析内部主机名肯定不会这么难吗?
我不完全确定这是一个代码问题,因为该问题在 Chrome 中可以重现,但这是我的代码:
protected JSONObject doInBackground(String... params) {
try {
URL url = new URL("http://officeserver/PTSWeb/PTSCommsServer.asmx");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
HttpURLConnection.setFollowRedirects(false);
huc.setConnectTimeout(5 * 1000);
huc.setRequestMethod("GET");
huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)");
huc.connect(); //FAILS HERE WITH UNABLE TO RESOLVE HOST
BufferedReader in = new BufferedReader(new InputStreamReader(huc.getInputStream()));
String result = "";
StringBuilder total = new StringBuilder();
for (String line; (line = in.readLine()) != null; ) {
total.append(line).append('\n');
}
in.close();
result = total.toString();
return new JSONObject(result);
} catch (Exception e) {
try {
JSONObject MyErrorJSON = new JSONObject();
MyErrorJSON.accumulate("WasError", "True");
MyErrorJSON.accumulate("ResponseText", e.toString());
return MyErrorJSON;
} catch (Exception x) {
return null;
}
}
}
【问题讨论】:
-
您应该能够使用客户网络上的 DNS 服务的详细信息配置 Android 设备;例如androidpolice.com/2020/03/26/make-android-use-dns-server-choice
-
不幸的是,他们没有与 DNS-over-TLS 兼容的服务器。或者他们告诉我
-
这里有一些其他选择:android.stackexchange.com/questions/78320。 1) 编辑
/etc/hosts文件。 2)在设备本身上安装本地DNS服务器... -
在设备上安装证书怎么样?
-
“Android 从一开始就似乎无法看到内部网络中的主机名”——这个主机名是在哪里定义的?这是真实 DNS 服务器上的真实 DNS 条目,还是某些特定于 Windows 的东西? “客户已将 SSL 应用到他们的服务器,这意味着 URL 只能通过 https 访问,并且自签名证书当然与主机名匹配,而不是 IP 地址”——然后您将遇到其他问题,因为 Android 将拒绝该证书, 如果它是自签名的。
标签: java android httpurlconnection hostname