如何从代理后面的 Android 应用程序通过 HTTPS 访问服务?
How to access services over HTTPS from Android app behind proxy?
我的 Android 应用程序通过 HTTPS 进行一些网络服务调用。因此,代理背后的用户(主要在公司网络中)无法使用该应用程序。所以我添加了一个自定义的 HostnameVerifier :
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
这解决了问题,但也向 MITM 攻击者发送了公开邀请。我应该向 HostnameVerifier 添加什么样的检查?我还遇到了使用自定义 TrustManagers 并在那里添加我的证书的建议 - 但没有人谈论如果我更新我的服务器证书会发生什么 - 除非我使用新的 SSL 证书推送应用程序更新,否则用户将无法使用该应用程序(他们下载了该应用程序)。
简而言之,我的问题是如何使应用程序可以在代理后面访问,但又不易受到 MITM 的影响。还是不可能?如果不可能,如果使用代理,我们在访问银行网站时 "leak" 我们的密码吗?
一个简单的 http 代理不会对 https 通信进行任何更改,因此只要按照应有的方式使用代理,即配置为浏览器代理和不用作像 https://proxy.example.com/tunnel?site=https://site.example.org
.
这样的特殊 URL
还有代理和防火墙进行 SSL 拦截以扫描加密连接以查找恶意软件等。在这些情况下,证书的主机名通常匹配,但颁发者不同并且不受 OS 信任。在这种情况下,必须将此颁发者 CA 证书作为受信任导入 OS。对于 Android,这是一个中央设置,不依赖于应用程序。
永远不要简单地禁用部分证书验证以使用户更容易,因为随后您打开应用程序以防止中间人攻击。如果按预期方式使用代理,并且用户明确信任公司 SSL 拦截,那么您就不安全了,如果您在代码中添加了一些特殊例外,那么您就不安全了。
我的 Android 应用程序通过 HTTPS 进行一些网络服务调用。因此,代理背后的用户(主要在公司网络中)无法使用该应用程序。所以我添加了一个自定义的 HostnameVerifier :
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
这解决了问题,但也向 MITM 攻击者发送了公开邀请。我应该向 HostnameVerifier 添加什么样的检查?我还遇到了使用自定义 TrustManagers 并在那里添加我的证书的建议 - 但没有人谈论如果我更新我的服务器证书会发生什么 - 除非我使用新的 SSL 证书推送应用程序更新,否则用户将无法使用该应用程序(他们下载了该应用程序)。
简而言之,我的问题是如何使应用程序可以在代理后面访问,但又不易受到 MITM 的影响。还是不可能?如果不可能,如果使用代理,我们在访问银行网站时 "leak" 我们的密码吗?
一个简单的 http 代理不会对 https 通信进行任何更改,因此只要按照应有的方式使用代理,即配置为浏览器代理和不用作像 https://proxy.example.com/tunnel?site=https://site.example.org
.
还有代理和防火墙进行 SSL 拦截以扫描加密连接以查找恶意软件等。在这些情况下,证书的主机名通常匹配,但颁发者不同并且不受 OS 信任。在这种情况下,必须将此颁发者 CA 证书作为受信任导入 OS。对于 Android,这是一个中央设置,不依赖于应用程序。
永远不要简单地禁用部分证书验证以使用户更容易,因为随后您打开应用程序以防止中间人攻击。如果按预期方式使用代理,并且用户明确信任公司 SSL 拦截,那么您就不安全了,如果您在代码中添加了一些特殊例外,那么您就不安全了。