Articles of https

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方法。 […]

在Android 4 ICS上使用SSL客户端证书的WebView

我在Android上的本地WebView有问题。 我需要使用SSL客户端证书与网站进行身份validation。 Android WebView似乎不支持这一点。 作为解决方法,我使用了WebView的修改版本: https://github.com/yonekawa/webview-with-client-certificate 修改后的WebView通过将正确configuration的SslSocketFactory注入到标准Android WebView中来工作。 这在Android 2.x设备上正常工作。 但是,使用Android 4 ICS,它不再工作。 SslSocketFactory在ICS中仍然存在,但似乎不再使用。 所以我的问题是:有谁成功地在ICS上configurationAndroid WebView,以便它可以与客户端证书一起使用? 或者有其他的select吗? 我已经尝试过了: 将SSL客户端证书导入到Android密钥存储库中,并仅使用WebView而不做任何修改。 这不起作用,客户端证书不会与请求一起发送。 不过,它在本地浏览器中工作。 使用HttpClient自己创buildSSL连接,获取网站的HTML并将其交给WebView。 这基本上工作,但我需要拦截WebView所做的所有请求,并自己处理它们。 但是,WebView不提供POST请求的数据,这使得这种方法对我无法使用。

以编程方式添加证书颁发机构,同时保持Android系统SSL证书

在StackOverflow上有关于这个主题的很多问题,但我似乎没有find与我的问题有关的问题。 我有一个需要与HTTPS服务器进行通信的Android应用程序:有的使用在Android系统密钥库(普通HTTPS网站)中注册的CA进行签名,有的使用我自己拥有的CA进行签名,但不在Android系统密钥存储区(带有例如自动签名的证书)。 我知道如何以编程方式添加我的CA,并强制每个HTTPS连接使用它。 我使用下面的代码: public class SslCertificateAuthority { public static void addCertificateAuthority(InputStream inputStream) { try { // Load CAs from an InputStream // (could be from a resource or ByteArrayInputStream or …) CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream caInput = new BufferedInputStream(inputStream); Certificate ca; try { ca = cf.generateCertificate(caInput); } finally { caInput.close(); } // Create […]

如何HTTPS发布在Android

我已经看了下面的链接,但没有看到具体的东西。 在Android安全的HTTP发布这一个不工作了,我已经testing了,并有其他人的评论说,这是行不通的。 我也检查了这一点: DefaultHttpClient,证书,https和发布问题! 这似乎可以工作,但博客只是让你挂。 更多的一步一步的指示将是有益的。 我设法得到我的证书,我没有能够通过他的第二步。 http://www.makeurownrules.com/secure-rest-web-service-mobile-application-android.html这一个看起来不错,但是我最后一步放松了作者:“回到我们原来的rest客户端代码“。 他也到处都是,我不知道他在用哪个图书馆。 他没有解释他的代码, RestTemplate restTemplate = new RestTemplate(); 这是另一个悬崖峭壁。 因为那个class没有提供。 所以,如果有人能够详细解释如何做HTTPS POST请求,那将是非常棒的。 我确实需要接受自签名证书。

HTTPS安全证书不可信错误在手机上通过openshift服务器

我正在openshift上启动一个应用程序。 我从namecheap购买了comodo positive ssl,然后按照说明在openshift上安装。 它在桌面浏览器上正常工作,但在Android浏览器上出现以下“不可信”错误。 我没有试过IOS。 我上传下列文件openshift: stylistcity_com.crt server.key 其他文件我没有使用包括: server.csr server.pass.key AddTrustExternalCARoot.crt PositiveSSLCA2.crt 任何帮助,将不胜感激。