Articles of https

forOverrideUrlLoading在WebView for Android中未运行

-Edit:find解决方案 – 在经过一番繁重的搜索后想出来 – 一个人(我的意思是一个人)说他们改为使用onPageLoad(); 这完全符合我的目的。 区别在于onPageLoad()的运行时间晚于shouldOverrideUrlLoading,但它对我的代码没有影响。 我正在尝试使用OAuth为Android应用程序设置Twitter授权,到目前为止我可以成功将用户发送到授权URL,但是,我现在要做的是拦截重定向到回调(这只是导致404错误,我们的回调URL不会在我们的服务器上有关联的页面)。 我试图做的是检查URL是否是我们的回调,然后从URL中提取OAuth Verifier。 我使用以下代码设置我的WebView: view = (WebView)findViewById(R.id.twitterWbVw); view.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView wView, String url) { String urlHolder; String[] verifExtrctr; urlHolder = url.substring(0, url.indexOf(‘?’)); System.out.println(“url”); if(urlHolder.equalsIgnoreCase(CALLBACK_URL)) { verifExtrctr = urlHolder.split(“?”); verifExtrctr = verifExtrctr[2].split(“=”); if(verifExtrctr[0].equalsIgnoreCase(“oauth_verifier”)) { params[5] = verifExtrctr[1]; return true; } else { System.out.println(“Inocorrect callback URL format.”); […]

使用Android WebViewClient启用特定的SSL协议

我的应用程序使用WebViewClient与服务器建立SSL连接。 服务器配置为仅接受TLSv1.1及以上协议。 1)如何检查哪些SSL协议是a)支持和b)在设备上使用Android WebViewClient时默认启用。 2)如何为我的应用程序中使用的Android WebViewClient实例启用特定的SSL协议。 在其中一个运行Android 4.3的测试设备上,WebViewClient抛出onReceivedError回调,其描述为“无法执行SSL握手” Chrome日志如下: 01-29 15:58:00.073 5486 5525 W chromium_net:external / chromium / net / http / http_stream_factory_impl_job.cc:865:[0129/155800:警告:http_stream_factory_impl_job.cc(865)]回到SSLv3,因为主机是TLS不容忍的:10.209.126.125:443 01-29 15:58:00.083 5486 5525 E chromium_net:external / chromium / net / socket / ssl_client_socket_openssl.cc:792:[0129/155800:ERROR:ssl_client_socket_openssl.cc(792)]握手失败; 返回0,SSL错误代码5,net_error -107 我的应用程序还使用HttpClient和HttpsUrlConnection类来设置SSL连接。 在使用这些类时,我能够使用SSLSocket API来启用特定协议。 http://developer.android.com/reference/javax/net/ssl/SSLSocket.html#setEnabledProtocols(java.lang.String中[]) 我需要对WebViewClient做同样的事情。

Android ssl:javax.net.ssl.SSLPeerUnverifiedException:没有对等证书(再次)

我有一个网站,我正在为一个RESTful服务启用ssl。 我们已在RapidSSL注册,安装了证书,并通过了RapidSSL检查程序 。 我可以使用各种浏览器访问该网站,包括Android浏览器(内置,Firefox和Opera)没有问题,没有警告。 但是,当我尝试使用我的Android应用程序访问它时,我得到以下exception: 08-11 20:04:05.586 363 381 E HttpProvider: Error executing request: No peer certificate 08-11 20:04:05.586 363 381 E HttpProvider: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate 08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:259) 08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93) 08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381) 08-11 20:04:05.586 363 381 […]

使用客户端证书和Android的HttpsURLConnection通过SSL上传文件

我正在尝试将文件上传到受SSL保护的Web服务,并且需要客户端证书(由内部CA签名)。 与上传文件相比 ,与Web服务的通信运行良好(下载文件,查询,运行命令和执行各种POST工作正常)。 上传文件时,我得到一个SSLException(javax.net.ssl.SSLException),上面写着“写入错误:ssl = 0x5fe209c0:系统调用期间的I / O错误,同步连接重置”。 我创建了一个重复的服务器并删除了SSL和客户端证书要求,并尝试通过’vanilla’HTTP上传,并且它运行良好。 我尝试过使用setFixedLengthStreamingMode(int)和setChunkedStreamingMode(int)但没有成功。 使用它们时,会从write方法抛出exception,并且当不使用它们中的任何一个时,从getResponseCode()的调用中抛出相同的exception。 我在服务器的EventVwr找不到任何关于错误的EventVwr 。 我们的其他客户端(iOS客户端)能够在那里上传文件,所以它必须是我做的 – 但我无法弄清楚是什么。 我不确定如何进一步调试此问题。 请帮忙。 编辑1 我们做了很多调试工作,发现: 小文件按预期上传(44kb是成功上传的最大文件的大小,并在~1200ms上传)。 46kb文件无法上传。 失败大约需要2分钟(134120ms)。 编辑2 在你的评论中读到之后,现在我让Fiddler玩得很好(感谢这个问题 )。 Fiddler得到了这个文件,但没有成功发送它。 请求(原始)看起来像: POST https://192.168.2.2/rest/transfer/strong/Upload/Full?Path=%5C20140807_113255_20.jpg&Root=2 HTTP/1.1 SessionToken: 1234 // We use this for session management FileMetadata: {“FileSize”:”1315496″,”FileName”:”GrumpyCat.jpg”} Connection: Keep-Alive User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.1.1; GT-N7100 Build/JRO03C) Host: 192.168.2.2 Accept-Encoding: […]

OKHttp中的参数在多部分窗体调用中的正确位置是什么?

我试图复制一个JPGfile upload使用OKHttp PHP服务器上的多部分forms。 我相信,我在错误的地方得到了一些参数,我不熟悉http中的多部分forms和命名。 这是我想要完成的 发布参数(名称值对):myuser,token,types为https://www.somesite.com/jpgphotoupload.php 然后,我使用POST方法创build一个多部分表单请求,使用以下命令:path: https : //www.somesite.com/jpgphotoupload.php 文件数据:大小为480 x 640的JPEG压缩图像数据(我知道) mimeType:image / jpeg (这个我明白) 不知道以下名称值对应作为多部分表单请求的一部分放在哪里,尝试了addFormDataPart 参数:再次参数表上面,(myuser,token,types) 名称:imagefile 文件名:myname.jpg 另外,这里还有什么可能是相关的 "Connection" , "Keep-Alive" "ENCTYPE", "multipart/form-data" "Content-Type", "multipart/form-data" 这是我目前的代码。 MediaType MEDIA_TYPE_JPG = MediaType.parse("image/jpg"); OkHttpClient client = new OkHttpClient(); RequestBody requestBody = new MultipartBuilder() .type(MultipartBuilder.FORM) .addPart( Headers.of("Content-Disposition", "form-data; name=\"imagefile\""), RequestBody.create(MEDIA_TYPE_JPG, new File("/storage/emulated/0/download/camerapic.jpg"))) .addFormDataPart("myuser", getprefmyuser(getBaseContext())) .addFormDataPart("token", […]

javax.net.ssl.SSLHandshakeException:当SSLv2和SSlv3禁用(仅限TLS)(和更高版本)时,Android 5.0.0握手失败

这是我的第一篇文章,我将尽我所能,尽可能清楚(对不起我的英文)。 这是我的麻烦,我正在使用改造:1.9.0和okhttp:2.7.5来执行API调用。 一切都很好,直到我的服务器提供商禁用SLLv2和SSLv3导致的安全问题(在3月份发现溺水失败)。 现在我检查有关我的提供商的信息,他只允许从https://www.ssllabs.com/与密码(TLS 1.0 TLS_RSA_WITH_3DES_EDE_CBC_SHA无FS)的TLSv1。 好吧,这是我所做的所有testing和结果: [更新问题已解决] find一种方法来解决这个问题,在我的第二个答案。 更新似乎问题来自谷歌API版本。 当我testingAPI 18时,一切正常。 当它在Android上,或者等于5.0.0时,就会失败。 首先testing CONF。 回顾一下: compileSdkVersion 23 buildToolsVersion '23 .0.2' minSdkVersion 18 targetSdkVersion 21 改造:1.9.0 okhttp:2.7.5 Android版本> 5.0.0(但在每个设备上都是一样的) Rest Client(LoginRestClient): public class LoginRestClient { private static final String BASE_URL = ""; private LoginApiService apiService; public LoginRestClient() { Gson gson = new GsonBuilder() .setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'") .create(); […]

Android WebView阻止从httpsredirect到http

我有一个解决scheme,我的Android WebView需要首先打开一个https url,然后它将被redirect到一个http url(它可能是从https站点尝试一个http POST)。 这不工作,我的Androiddebugging日志说: 02-20 11:04:45.079 8538-8538 /? E / WebViewCallback:被阻止的URL:[blocked]通过HTTPS加载“ https:// xxx / ”的页面,但是将数据提交到“ http:// yyy ”的不安全位置:该内容也应该被提交HTTPS。 WebView中是否存在允许这种行为的configuration选项? 更多信息:这似乎是Android SDK中的行为改变。 一个很久以前编写的客户没有任何抱怨。

如果没有以前的互联网连接,则无法validationAndroid自签名证书

使用SSL基础架构: 我们有一个工作的客户端/服务器设置,Android版本4.2和4.4的手机充当客户端,必须通过自签名的SSL证书validation服务器。 问题: 只要设备在尝试连接之前至less有一次互联网访问,服务器证书validation就会起作用。 但是,如果执行出厂重置,并且设备直接连接到专用networking而没有互联网连接,则证书validation将失败。 重现行为: 出厂重置手机 重新启动,而不select连接到WiFi与互联网接入 尝试validation自签名的SSL证书 – > FAILS 使用互联网连接WiFi 重新连接到原来的专用networking 尝试validation自签名SSL证书 – > WORKS 从技术上讲,设备不需要互联网访问来validation自签名证书。 在进行任何SSL服务器validation之前,是否会有某种黑名单需要加载? 我能阻止这种行为吗? 创buildSSL上下文: //Using a client certificate String password = "clientpass"; KeyStore keyStore = KeyStore.getInstance("PKCS12"); InputStream is = context.getResources().openRawResource(R.raw.client); keyStore.load(is, password.toCharArray()); is.close(); KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509"); kmf.init(keyStore, password.toCharArray()); KeyManager[] keyManagers = kmf.getKeyManagers(); // Using self signed […]

Bouncy Castle Keystore(BKS):java.io.IOException:密钥库的版本错误

我必须连接到基于REST的web服务。 ( https://someurl.com/api/lookup/jobfunction/lang/EN ) 在IE或者Chrome浏览器中,当我尝试访问这个URL时,我得到一个我必须信任并接受的证书。然后我必须input用户名和密码,然后得到JSON响应。 同样的事情,我必须做一个android应用程序编程。 试用自定义的EasySSLSocketFactory和EasyX509TrustManager,没有工作。 我得到了以下错误:java.security.cert.CertPathValidatorException:找不到证书path的信任锚点。 使用BKS密钥库,请注意mykeystore.bks是一个空文件,然后执行下面的命令 keytool -importcert -v -trustcacerts -file "test.crt" -alias IntermediateCA -keystore "mykeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk15on-148.jar" -storetype BKS -storepass abcd1234 keytool -list -keystore "mykeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk15on-148.jar" -storetype BKS -storepass abcd1234 MyHTTPClient.java如下所示: public class MyHttpClient extends DefaultHttpClient { final Context context; public MyHttpClient(Context context) { this.context = […]

SSL / TLS协议和密码套件与AndroidHttpClient

编辑:道歉,如果我原来的职位措辞不佳。 这引起了一些混乱,以原文的评论为代表。 所以让我再试一次: 我从一个问题开始。 我想解决Android上的一个问题,但不知道如何。 我花了很多时间在networking上寻找解决scheme,但没有发现任何关于这个问题的讨论。 尽pipe如此,包括StackOverflow线程在内的一些讨论让我看到了一种看起来很有前途的技术。 我解决了这个问题。 但是解决scheme有一点涉及。 所以我决定在这里提出这个问题,思考a)必须有一个更好的解决scheme,希望有人知道并张贴在这里回答; 或者b)也许这是一个很好的解决scheme,因为我没有在networking上的其他任何地方find这个问题的讨论,也许我对这个问题的解决scheme对其他人试图做同样的事情是有用的。 无论哪种方式,结果将是一个新的贡献StackOverflow:一个问题是没有回答其他地方,最终,正确的答案是这样或那样。 实际上,StackOverflow甚至邀请我通过分享我最初发布的知识来回答我自己的问题。 事实上,这是我的一部分动机。 即使这件事情的事实并不是我find的任何地方。 所以: 问:使用AndroidHttpClient通过HTTPS发出REST请求时,如何指定要使用的SSL协议和密码? 这个很重要。 很重要的一点是,在服务器上可以做很多事情,但是有限制。 同一台服务器必须提供浏览器,包括旧的,以及其他客户端。 这意味着服务器必须支持各种协议和密码。 即使在Android中,如果你必须支持很多不同的版本,你将不得不支持一些不同的协议和密码。 更重要的是,默认情况下,在SSL握手期间,OpenSSL尊重客户端的密码首选项, 而不是服务器的首选项。 例如,看到这个post ,说你可以通过设置SSL_OP_CIPHER_SERVER_PREFERENCE覆盖客户端的行为。 这个选项甚至可以在Java中的SSLSocket上设置,这并不完全清楚。 即使可以,您也可以自己设置密码列表,或者告诉客户端遵守服务器列表。 否则,你会得到Android的默认值,无论它运行在哪个版本上(不是你链接的版本)。 如果采取默认设置,客户端通过Jellybean 4.2+客户端发送到服务器的首选项列表可以在这里看到,从第504行开始。默认的协议列表始于620行左右。虽然Jellybean 4.2+支持OpenSSL 1.0.1,特别是TLSv1.1和TLSv1.2,这些协议默认是不启用的。 如果你不做类似我所做的事情,那么尽pipe事实上TLSv1.2的支持是在最新版本的Android上公布的,但你不能利用TLSv1.2的支持。 当你回顾以前的Android版本时,细节差别很大。 至less,您可能希望仔细看看所有受支持版本的默认值,并查看您的客户端实际在做什么。 你可能会感到惊讶。 关于对各种协议和密码的支持还有很多。 问题是,有时可能需要在客户端更改这些设置。 A.使用一个自定义的SSLSocketFactory 这对我来说很好,最后也不是很多代码。 但是由于几个原因,这有点棘手: 有两个不同的SSLSocketFactory类。 客户需要一个org.apache.http.conn.ssl.SSLSocketFactory,但是OpenSSL返回一个javax.net.ssl.SSLSocketFactory。 这绝对是令人困惑的。 我使用了代表团,让他们打电话给对方,没有什么问题。 注意OpenSSLContextImpl和SSLContextImpl之间的区别。 一个只包裹另一个,但它们不能互换。 当我使用SSLContextImpl.engineGetSocketFactory方法时,我忘记了究竟发生了什么,但是却悄然失败了。 确保使用OpenSSLContextImpl来获取套接字工厂,而不是SSLContextImpl。 您可能也可以使用javax.net.ssl.SSLSocketFactory.getDefault(),但我不确定。 您不能轻易子类AndroidHttpClient,因为它的构造函数是私有的。 这是不幸的,因为它提供了一些其他的好东西,比如确保你正确closures而不是泄露资源。 DefaultHttpClient工作得很好。 我从AndroidHttpClient(第105行)借用了newInstance方法。 […]