Android 5.0 Lollipop 中的 DefaultHttpClient 似乎已损坏。它无法设置与以前版本的 Android 成功设置的某些站点的连接。
例如,我尝试连接到 https://uralsg.megafon.ru
//Create httpclient like in https://stackoverflow.com/questions/18523784/ssl-tls-protocols-and-cipher-suites-with-the-androidhttpclient
HttpClient client = new DefaultHttpClient(manager, params);
HttpGet httpGet = new HttpGet("https://uralsg.megafon.ru");
HttpResponse client = httpclient.execute(httpGet);
此代码在 Android 2.3-4.4 中有效,但在 Android 5.0(设备和模拟器)上失败并出现错误 Connection closed by peer。 当然这是可以理解的,因为 Android 5.0 尝试使用 TLSv1.2 和现代密码连接这个旧服务器,但它不支持它们。
好的,使用 SSL/TLS protocols and cipher suites with the AndroidHttpClient 中的示例代码我们将协议(protocol)和密码限制为 TLSv1 和 SSL_RSA_WITH_RC4_128_MD5。现在它因不同的错误而失败:
javax.net.ssl.SSLHandshakeException: Handshake failed
caused by
error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac
(external/openssl/ssl/s3_pkt.c:1286 0x7f74c1ef16e0:0x00000003)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake
当然,这段代码在 Android 2.3-4.4 上运行流畅。
我用 wireshark 检查了流量:
302 4002.147873000 192.168.156.30 83.149.32.13 TLSv1 138 Client Hello
303 4002.185362000 83.149.32.13 192.168.156.30 TLSv1 133 Server Hello
304 4002.186700000 83.149.32.13 192.168.156.30 TLSv1 1244 Certificate
305 4002.186701000 83.149.32.13 192.168.156.30 TLSv1 63 Server Hello Done
307 4002.188117000 192.168.156.30 83.149.32.13 TLSv1 364 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
308 4002.240695000 83.149.32.13 192.168.156.30 TLSv1 61 Alert (Level: Fatal, Description: Bad Record MAC)
您可以看到连接已建立,但服务器发出警报,因为它可能无法解码加密的握手消息。
我没能连接到 https://uralsg.megafon.ru在 Android 5.0 上使用 HttpClient。股票浏览器确实连接了它。 Android 2.3-4.4 以任何方式连接此站点没有任何困难。
有什么方法可以让 HttpClient 连接到这些站点吗?这只是一个例子,我敢肯定还有很多遗留服务器无法通过 Android 5.0 和 HttpClient 连接。
最佳答案
更新:它被证明是后端的一个错误,而不是 android 5,尽管确实有问题的密码。
我遇到了同样的问题。对我来说,结果是密码 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 是从 android 5(更新的)默认密码集中选择的。
一旦我将它从可接受密码的客户端列表中删除,连接就会再次工作。
- AES-GCM (AEAD) cipher suites are now enabled,
我很确定这是罪魁祸首。一旦服务器首选 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,连接就会失败。
请注意,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 有效。
我的猜测是 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 的 Android 实现有问题,或者您正在与之通信的服务器之一。
解决方案:
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(无需重新部署应用)。TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(在 CLIENT_HELLO 期间)。您可以在客户端实现您自己的 SSLSocketFactory 并调用
sslSocket.setEnabledCipherSuites(String[] suites);
关于 SSLSocket 的创建。
编辑: 请注意,这不一定是 android 错误,可能是服务器实现有问题。如果您的问题确实是由密码引起的,请在 android bug tracker 上发表评论]( https://code.google.com/p/android/issues/detail?id=81603 )。谢谢!
关于android - HttpClient 在 Android 5.0 Lollipop 中失败并显示 Handshake Failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27112082/
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
如果我在模型中设置验证消息validates:name,:presence=>{:message=>'Thenamecantbeblank.'}我如何让该消息显示在闪光警报中,这是我迄今为止尝试过的方法defcreate@message=Message.new(params[:message])if@message.valid?ContactMailer.send_mail(@message).deliverredirect_to(root_path,:notice=>"Thanksforyourmessage,Iwillbeintouchsoon")elseflash[:error]
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路