通过 https 的 Volley Request 仅适用于 Wifi (wlan) 但不适用于 3G/GPRS (umts)

Volley Request over https only works with Wifi (wlan) but not for 3G/GPRS (umts)

因为我被指示在我自己的问题中提出这个问题,所以我在这里这样做。
要查看 Original Topic 我第一次提出问题的地方(现已删除)。

我遇到了同样的问题,不幸的是作者的回答没有帮助。

为了更详细地介绍我的问题,我在互联网上的 Tomcat 8 (v8.0.15) 服务器上使用自签名证书 Java 8 (v8.15)。 0.25 - JDK)。我在那里托管我的 Java EE 应用程序,它是我的 Android 应用程序的后端。 Tomcat 的 SSL 连接器正常工作。当我用 RESTClient 测试后端时,我得到了预期的结果。
我用一个证书创建了密钥库:

keytool -genkey -alias tomcat -keystore tomcat.keystore 
-storepass MYKEYSTOREPASS -keyalg RSA -keysize 2048 -validity 365

然后我提取了证书:

keytool -export -alias tomcat -storepass MYKEYSTOREPASS 
-keystore tomcat.keystore -file tomcat.cer

最后,我为我的 Android 应用程序创建了一个 BKS 格式的新密钥库:

keytool -import -alias tomcat -file tomcat.cer -keypass MYKEYSTOREPASS 
-keystore tomcat.bks -storetype BKS -storepass MYKEYSTOREPASS 
-providerClass org.bouncycastle.jce.provider.BouncyCastleProvider
-providerpath $PATH_TO_BC_LIBRARY/bcprov-jdk16-146.jar

(as mentioned here the "-export" and "-import" parameter are from previous releases but still useable. So you could also know this command parameters as "-exportcert" and "-importcert")

完成这些步骤后,我尝试连接,一切正常。但直到我 deactivated/left 我的 WLAN 连接。然后它不再工作并带来了 "javax.net.ssl.SSLPeerUnverifiedException: No peer certificate"。
我真的不明白这种行为。

要使 android 的一面更亮一点:
我以完全相同的方式使用 this tutorial 中的 classes/library。

如果有什么遗漏,请评论,我会带来信息。

非常感谢!

我认为这只是服务器配置问题。我不确定 Tomcat 是如何工作的,但它可能与 Apache 类似,您在 Apache 中为 "normal" 请求(即非 https)声明一个虚拟主机,为 HTTPS(包括 SSL 证书)声明一个虚拟主机).通常每个虚拟主机都绑定一个IP。当您通过 WIFI 访问您的服务器时,您很可能会获得一些 "internal" IP,例如 192.168.*,并且您可能将虚拟主机配置为绑定到该 IP。

当你通过3G访问时,你通过"public"网络,然后服务器的IP不同,所以虚拟主机不匹配,例如。未使用 SSL 证书,您得到 "No peer certificate".

我建议您必须检查服务器配置和日志,看看服务器是如何通过这两种方法访问的。

在针对类似问题对服务器故障进行研究时,我得到了提示也可能出了什么问题: https://serverfault.com/questions/560733/why-isnt-tomcat-serving-the-correct-ssl-certificate 我用缺少的参数 "keyAlias" 试了一下,它成功了!解决方案最终 - 就像之前预期的 Ogre_BGR - 不是最佳的 tomcat 配置。连接器如下所示:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS"
           keystoreFile="PATH_TO_YOUR_KEYSTORE"
           keystorePass="PASSWORD_FOR_YOUR_KEYSTORE"
           keyAlias="ALIAS_OF_YOUR_CERTIFICATE"
           maxHttpHeaderSize="8192"
           />
当没有配置 keyAlias 时,

Tomcat 仅静默地选择它在密钥库中找到的第一个密钥。在文档中提到 here(在底部)。

我希望有一天有人会高兴地阅读这篇文章,同时遇到同样的问题。

再次感谢@Ogre_BGR :)