安卓——安卓模拟器中的SSL问题,在手机上运行正常

8
我有一个应用程序,通过https调用web服务。当我在手机上运行apk时,它运行得很好。然而,在模拟器中,所有的SSL POST请求都会失败,并显示以下错误信息:
Read error: ssl=0xb402be00: Failure in SSL library, usually a protocol error error:100c50bf:SSL routines:ssl3_read_bytes:NO_RENEGOTIATION (external/boringssl/src/ssl/s3_pkt.c:852 0xabf7fcd7:0x00000000)
在我们服务器的访问日志中,每当模拟器尝试访问Web服务时,都会报告403(禁止)错误,显然是因为模拟器与我们的服务器之间没有正确握手。apache的错误日志中有一堆这样的行:
[Thu Aug 20 12:21:21 2015] [error] [client xxx.xxx.xxx.xxx] Re-negotiation handshake failed: Not accepted by client!?
Apache实际上添加了“!?”所以看起来像是一个严重的意外错误。
在我的IDE中,我已经选中了“自动接受非信任证书”的选项,但并没有什么作用。
我在网上看到了一些解决Android中各种SSL问题的方法,但它们似乎都是手机本身存在问题,并需要修改代码。由于它在手机上运行良好,因此似乎这是一个Android Studio的问题,我应该能够通过配置设置来纠正这个问题。或者我需要在apache中进行一些操作?
底线是:如何使我的应用程序在Android Studio的模拟器中与SSL webservice通信?
使用Studio 1.3.1,Java 1.7.0_65。
compileSdkVersion 21
buildToolsVersion "22.0.1"
defaultConfig {
    applicationId "com.bla.bla"
    minSdkVersion 14
    targetSdkVersion 19
    multiDexEnabled true
    versionCode 12
    versionName '1.2.0.8'

1
你应该配置模拟器本身,IDE的配置与问题无关。你能访问其他https网站吗?你的模拟器上的日期和时间设置正确吗?你尝试过Genymotion了吗? - Dmide
1
它在Genymotion中根本无法启动,我收到了“失败[INSTALL_FAILED_MISSING_SHARED_LIBRARY]”的错误提示,日期和时间是正确的。我不知道它是否可以访问其他网站,因为它没有任何理由这样做,我不确定如何将其纳入现有代码中。 - chiliNUT
如果您的目标是让它在任何模拟器上运行,而不仅仅是在Google默认的模拟器上,请遵循此线程https://dev59.com/eGIj5IYBdhLWcg3wkl2U并重试。这应该可以解决FAILED_MISSING_SHARED_LIBRARY错误。 - Dmide
@Dmide 我在那个帖子中没有看到任何关于那个错误的参考。而且我也没有使用 Google Play 服务。另外,我想使用内置的模拟器。 - chiliNUT
你能在模拟器中通过浏览器访问该服务吗? - C.d.
显示剩余2条评论
2个回答

2
我认为这是因为模拟器每次运行时都会重置您的CA证书。请查看在Android模拟器中设置持久可信CA这篇文章。请注意,CA证书的位置在Marshmallow中已更改,我会尽快更新一些额外的信息。

1
我在谷歌上几乎找不到关于这个主题的任何信息,我认为这是因为一般的做法是将开发API不放在SSL下,只有生产API才放在SSL下,这样就可以避免这个问题。我在自己的谷歌搜索中找到了那篇文章。虽然我还没有尝试过,但它看起来非常有前途。 - chiliNUT
1
我查看了参考文章。它是在2011年发布的,当时cacert.bk仍位于/system/etc/security中。Marshmallow现在有一个cacert目录代替了它,里面装满了许多具有神秘名称的文件。仍在Google上寻找在Marshmallow及以后版本中设置持久证书的更新方法。 - Les

1

通常情况下,这对于编写未来项目的代码以使其与模拟器更加兼容可能是有用的。但对于这个项目,我没有任何修改现有代码的愿望,只是为了让它在模拟器中运行。 - chiliNUT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接