Articles of ssl

Android操作系统中使用SSLSocket的TLS连接速度较慢

我正在开发一个使用SSLSocket连接到服务器的Android应用程序。 这是我正在使用的代码: // Connect if (socket == null || socket.isClosed() || !socket.isConnected()) { if (socket != null && !socket.isClosed()) socket.close(); Log.i(getClass().toString(), "Connecting…"); if (sslContext == null) { sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new SecureRandom()); } SSLSocketFactory socketFactory = sslContext.getSocketFactory(); socket = (SSLSocket)socketFactory.createSocket(host, port); socket.setSoTimeout(20000); socket.setUseClientMode(true); connected = true; Log.i(getClass().toString(), "Connected."); } // Secure if (connected) […]

在Android设备上生成客户端证书

我想创build一个将使用SSL客户端证书authentication的Android应用程序。 我已经find示例代码,告诉我如何在Android应用程序中使用SSL客户端证书身份validation。 这对我来说很清楚。 我的问题是,我想在设备上生成一个SSL客户端证书。 简单地说,我希望我的程序执行以下操作: 在设备上安装程序时,应在设备上生成客户端证书(首次运行时),并将公钥指纹发送到我的服务器。 (证书必须在首次使用时生成)。 如何从我的应用程序生成客户端证书和Android设备?

从APK中确定签名证书

我已经从Eclipse for Android创build了一个签名的APK。 我想知道哪个RSA证书types在像RSA-1024或RSA 2048那样签名的APK中使用。 我怎么知道从APK文件? 编辑标题从“在Eclipse中签名APK使用哪个RSA证书?如何知道RSA密钥大小(1024/2048)?”

在Android设备上存储新密码后,“stream不代表PKCS12密钥存储”

我写了一个使用KeyStore来validationSSL连接的Android应用程序。 但是,当我用正确的密钥加载p12文件并存储一个新的,下一次我尝试加载它与新的密钥我得到这个exception: java.io.IOException:stream不代表PKCS12密钥库 在com.android.org.bouncycastle.jce.provider.JDKPKCS12KeyStore.engineLoad(JDKPKCS12KeyStore.java:691) 在java.security.KeyStore.load(KeyStore.java:589) 出了什么问题? 非常感谢你!

我有一个keystore文件,如何在Android应用程序中提供keyManagers到sslContext?

更新:至于我原来的问题,事实certificate,调用java.security.KeyStore.getCertificate(别名)确实返回X509Certiciate。 这不是问题。 (拜托我,我是新来的这个证书的东西。) 我设法连接到我的(自签名的)启用了SSL的服务器,只要我不需要validation的客户端。 当我需要clientAuth我的应用产生“例程:SSL3_READ_BYTES:sslv3警报握手失败(外部/ openssl / ssl / s3_pkt.c”… ( 这里也描述)…对于一些治愈是从BKS切换到PKCS12 ,那对我不起作用。 所以现在我试图实现我自己的X509KeyManager (如这里所build议的),把它交给sslContext.init([keyManager], trustManagers, null) 。 如果我理解正确,sslContext会向我的密钥pipe理器询问给定别名的证书链和/或私钥。 (每当询问什么别名时,我都会提供硬编码的)。 但根据X509KeyManager接口,我应该返回X509Certificate 。 如何使用密钥库创build一个?

Android java.security.cert.CertPathValidatorException:找不到证书path的信任锚点

有三个主机,一个Android应用程序进行身份validation和授权。 最终主机是REST API。 这是第一次使用Oauthauthentication和授权过程,没有问题。 但是,如果用户在login后杀死应用程序 ,并访问REST API提供的服务,然后再次打开应用程序,则会出现此问题。 在这个时候authentication和授权过程不会发生,只有REST API。 它导致java.security.cert.CertPathValidatorException 但它在第一次使用(login,然后使用应用程序)期间工作。 有人可以解释这个例外背后的情况,什么是错的应用程序。 根据这个答案,如果authentication例外被忽略, 这是有效的 。 SSLSocketFactory sslSocketFactory = null; try { TrustManagerFactory tmf = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm()); // Initialise the TMF as you normally would, for example: try { tmf.init((KeyStore)null); } catch(KeyStoreException e) { e.printStackTrace(); } TrustManager[] trustManagers = tmf.getTrustManagers(); final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0]; // […]

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(); […]

如果没有以前的互联网连接,则无法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 […]

Android – 本地HTTPS服务器上的videostream:SSL证书被拒绝

我需要通过本地HTTPS服务器(当然要做一些背景DRM)在Android中streamvideo。 然后Android媒体播放器连接到本地服务器,将video内容“stream”到屏幕上。 这一切工作正常与HTTP服务器,但只要我启用SSL,video播放器停止。 如果我使用浏览器从应用程序外部连接到HTTPS服务器,则会收到一条SSL警告,我可以忽略,然后video播放器启动。 有没有办法禁用媒体播放器模块严格的证书处理? 我已经看到了很多关于如何使用我自己的HTTP连接来完成这个任务,但没有关于如何为媒体播放器做到这一点。 谢谢! 更新:谷歌的“内联网证书”或“即时证书”,你会发现一些应该工作。 明天将试用,并在这里发布答案。

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