因为我被指示在我自己的问题中提出这个问题,所以我在这里这样做 要查看我第一次提出问题的Original Topic(现在已删除)。
我遇到了同样的问题,不幸的是,作者的答案没有帮助。
为了更详细地介绍我的问题,我使用Java 8(v8.0.25-JDK)在我的Tomcat 8(v8.0.15)服务器上使用自签名证书。我在那里托管我的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
(如上所述here,“ - export”和“-import”参数来自之前的 发布但仍然可用。所以你也可以知道这个命令 参数为“-exportcert”和“-importcert”)
完成这些步骤后,我尝试连接,一切都很顺利。但只有在我停用/离开WLAN连接之前。然后它不再起作用并带来“javax.net.ssl.SSLPeerUnverifiedException:No peer certificate”。我真的不明白这种行为。
更多地照亮android方面:
我以完全相同的方式使用this tutorial中的类/库。
如果缺少某些内容,只需发表评论,我就会带上这些信息。
提前多多感谢!
答案 0 :(得分:1)
在针对类似问题对服务器故障进行研究的同时,我得到了一个暗示:
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:)
答案 1 :(得分:0)
我认为这只是一个服务器配置问题。我不确定Tomcat是如何工作的,但它可能类似于Apache,其中您声明一个虚拟主机用于“正常”请求(即非https)和一个虚拟主机用于HTTPS(包括SSL证书)。通常,每个虚拟主机绑定到一个IP。很可能当您通过WIFI访问服务器时,您会获得一些“内部”IP,如192.168。*,并且您可能已将虚拟主机配置为绑定到该IP。
当您通过3G访问时,您将通过“公共”网络,然后服务器的IP不同,因此虚拟主机不匹配,例如,未使用SSL证书,您将获得“无对等证书”。
我建议你必须检查服务器配置和日志,看看如何通过任何一种方法访问服务器。