Articles of ssl

OkHttp javax.net.ssl.SSLPeerUnverifiedException:未validation主机名domain.com

我一直在努力让这个工作。 我正在尝试使用自签名证书通过https连接到我的服务器。 我认为现在还没有任何页面或示例。 我做了什么: 按照本教程创建了bks密钥库: http : //blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html 它使用openssl s_client -connect domain.com:443从服务器获取证书。 然后使用充气城堡创建一个bks密钥库。 从原始文件夹中读取创建的密钥库,将其添加到sslfactory,然后再添加到OkHttpClient。 喜欢这个: public ApiService() { mClient = new OkHttpClient(); mClient.setConnectTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS); mClient.setReadTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS); mClient.setCache(getCache()); mClient.setCertificatePinner(getPinnedCerts()); mClient.setSslSocketFactory(getSSL()); } protected SSLSocketFactory getSSL() { try { KeyStore trusted = KeyStore.getInstance(“BKS”); InputStream in = Beadict.getAppContext().getResources().openRawResource(R.raw.mytruststore); trusted.load(in, “pwd”.toCharArray()); SSLContext sslContext = SSLContext.getInstance(“TLS”); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trusted); […]

Android:使用HttpsURLConnection的HTTPS(SSL)连接

我有2个应用程序,一个是Servlet / Tomcat服务器,另一个是Android应用程序。 我想使用HttpURLConnection在两者之间发送和接收XML。 码: private String sendPostRequest(String requeststring) { DataInputStream dis = null; StringBuffer messagebuffer = new StringBuffer(); HttpURLConnection urlConnection = null; try { URL url = new URL(this.getServerURL()); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setDoOutput(true); urlConnection.setRequestMethod(“POST”); OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream()); out.write(requeststring.getBytes()); out.flush(); InputStream in = new BufferedInputStream(urlConnection.getInputStream()); dis = new DataInputStream(in); int ch; long […]

生成和安装SSL证书

当我成功将自定义SSL证书添加到Android 6模拟器(我对system.img文件进行持久更改)时,我觉得我破解了primefaces。 但浏览器无法以任何方式识别它。 我遵循了这个很棒的教程 ,我认为我在散列方面做错了。 以下是我所做的全部步骤,以及到目前为止所做的工作。 我的系统 Windows 10,64 BIT 预建模拟器 名称:Nexus_64 API:23 目标:Android 6(Android API) CPU / ABI x86 / 64 磁盘大小3 GB 高级模拟器设置 RAM:512 MB VM堆:128 MB 内部存储2 GB (从右侧下拉菜单中选择) SD卡:Studio管理的2 GB 系统文件 从教程: 890c6016.0获取证书文件 创建用于将系统文件存储在c:\device_tmp空文件夹 公用事业: 来自/android_sdk/tools/emulator.exe emulator 来自/android_sdk/platform-tools/adb.exe adb 我做了什么 启动模拟器: emulator -avd Nexus_64 -no-snapshot-load 现在它启动,我打开命令行窗口 find外部存储的名称,因为sdcard没有足够的存储空间用于映像文件。 adb shell df 在我的情况下/storage/13E4-1F02/获得2GB空间 […]

在Android 2.3.3上实现TLS 1.2

我一直在尝试在Android上实现TLS 1.2。 我创建了一个SSLSocket但是当我运行s.getSupportedProtocols()时,TLS 1.2不是其中一个选项。 支持TLSv1和SSLv3但不支持TLSv1.2。 关于那个问题,我需要的密码套件也不在那里(TLS_ECDHE_ECDSA_WITH_AES_256 _…) 关于我可以导入或做什么来启用TLSv1.2和android上的密码的任何想法? 有什么我想念的吗? 任何想法都会有所帮助! 谢谢!

在Android 5.0 Lollipop中,HttpClient失败并且Handshake Failed

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(设备和模拟器)上失败,错误连接被对等关闭。 当然这是可以理解的,因为Android 5.0尝试将这个旧服务器与TLSv1.2和现代密码连接起来并且它不支持它们。 好的,使用SSL / TLS协议中的示例代码和带有AndroidHttpClient的密码套件,我们将协议和密码限制为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 […]

HttpsURLConnection:SSL恢复无法正常工作

我正在尝试使用HttpsURLConnection和我自己的信任管理器设置SSL(使用SSL恢复)。 我只能进行ssl握手和连接。 没有SSL恢复 – 以前的会话永远不会被重用! 我搜索了一遍,但没有运气。 所有答案都是指HttpClient(这不是一个选项)。 我的设置如下: 我创建了一个SSL上下文,我将其存储供以后使用。 然后我使用这个SSL上下文创建一个SSL工厂,我也存储它以便与所有连接一起使用。 我开始一切顺利的连接:我收到一个sessionID ,一个完整的握手完成,连接被发送到服务器。 一分钟后,我开始另一个连接。 出于某些奇怪的原因,此连接不会发送我之前的sessionID 。 我打印SSLContext的会话 – 最后一个会话仍在那里并且有效。 由于某种原因,此新连接不使用它,因此会创建另一个会话并将其添加到会话的缓存中。 我在两个不同的设备上尝试了Android版本2.3和4.1。 在许多谷歌搜索结果之后,我甚至试图像一些用户提议的那样添加Keep-Alive,以及导致没有不同结果的其他伏都教。 有没有人碰到这个? 有什么我想念的吗? 什么可能导致我的连接不使用上一个会话? 提前致谢!

证书固定不适用于Android上的OkHttp

在Android应用上使用com.squareup.okhttp:okhttp:2.4.0和com.squareup.retrofit:retrofit:1.9.0 ,尝试通过HTTPS与服务器REST API通信,该API使用自签名证书。 服务器密钥库具有私钥和2个证书,服务器和根证书。 openssl s_client输出 – Certificate chain 0 s:/C=…OU=Dev/CN=example.com i:/C=… My CA/emailAddress=info@example.com 1 s:/C=… My CA/emailAddress=info@example.com i:/C=… My CA/emailAddress=info@example.com 在Android应用程序中,OkHttp使用根证书的SHA1签名进行初始化 – CertificatePinner certificatePinner = new CertificatePinner.Builder() .add(“example.com”, “sha1/5d…3b=”) .build(); OkHttpClient client = new OkHttpClient(); client.setCertificatePinner(certificatePinner); RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(“https://example.com”) .setClient(new OkClient(client)) .build(); 但是当尝试发送请求失败时会出现exception – retrofit.RetrofitError: java.security.cert.CertPathValidatorException: Trust anchor for certification path […]

从Android App与服务器通信时出现各种HTTP错误

更新:2015年1月4日 我还有这些问题。 我们的应用程序的用户增加了,我看到了所有types的网络错误。 每当应用程序出现网络相关错误时,我们的应用程序就会发送电子邮件。 我们的应用程序进行了金融交易 – 因此重新提交并不是真正的幂等 – 因此非常害怕启用HttpClient的重试function。 我们在服务器上做了某种响应缓存来处理用户明确完成的重新提交。 但是,仍然没有解决方案,没有糟糕的用户体验。 原始问题 我有一个Android应用程序,它发布数据作为用户操作的一部分。 数据包括少量图像,我将它们打包为Protobuf消息(实际上是字节数组),并通过HTTPS连接将其发布到服务器。 尽管应用程序在大多数情况下都能正常工作,但我们偶尔会看到连接错误。 由于我们在相对较慢的网络区域(2G连接)中有一些用户,因此问题变得更加明显。 然而,问题不仅限于慢速连接区域,客户使用WiFi和3G连接也会出现问题。 以下是我们在App日志中注意到的一些例外情况 下面的一个发生在5分钟后,因为我已经将Socket超时设置为5分钟。 该应用程序试图在这种情况下发布145kb的数据 堆栈跟踪java.net.SocketTimeoutException:在org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_read(本地方法)中读取超时时间,位于org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl $ SSLInputStream.read( OpenSSLSocketImpl.java:662)org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191) 下面发生了2.5分钟(套接字超时设置为5分钟),客户端发送了144kb的数据 javax.net.ssl.SSLException:写入错误:ssl = 0x5e4f4640:系统调用期间的I / O错误,org.apache中的org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_write(本机方法)中的管道损坏。 peace.xnet.provider.jsse.OpenSSLSocketImpl $ SSLOutputStream.write(OpenSSLSocketImpl.java:704)位于org.apache.http.impl的org.apache.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:109)。 io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:113) 1分钟后发生了一次。 堆栈跟踪javax.net.ssl.SSLException:org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake上org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(本地方法)的对等关闭连接(OpenSSLSocketImpl.java:378)org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl $ SSLInputStream。(OpenSSLSocketImpl.java:634)at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl。 Java的:605) 77秒以后发生了一次 堆栈跟踪javax.net.ssl.SSLException:SSL握手已中止:ssl = 0x5e2baf00:系统调用期间的I / O错误,同步连接由org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(本机方法)重置在org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:378)org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl $ SSLInputStream。(OpenSSLSocketImpl.java:634)at org。 org.apache.http.impl.io.SocketInputBuffer上的apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:605)。(SocketInputBuffer.java:70) 15秒后发生以下一次(连接超时设置为15秒) 拍摄时间:15081堆栈跟踪org.apache.http.conn.ConnectTimeoutException:连接到org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)上的/103.xx.xx.xx:443超时)org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)atg.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)org.apache.http。 impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365) 以下是我用于发布请求的源代码片段 […]

Android / Java – 如何创建HTTPS连接?

我这里有代码,允许我连接到https服务器并传输数据。 它工作正常,但我想知道我是否正确地做到这一点,我实际上正在建立一个安全的连接。 请检查我的工作。 谢谢。 public class HTTPSClient extends DefaultHttpClient { public HTTPSClient() { } @Override protected ClientConnectionManager createClientConnectionManager() { SchemeRegistry registry = new SchemeRegistry(); HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER; final SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); //socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); registry.register(new Scheme(“http”, PlainSocketFactory.getSocketFactory(), 80)); registry.register(new Scheme(“https”, socketFactory, 80)); registry.register(new Scheme(“https”, socketFactory, 443)); HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, […]

Android SSL – 无对等证书

每当此代码运行时,我都会收到“No Peer Certificate”错误。 SSL证书有效,从Namecheap(PositiveSSL)购买。 它之前有CA crt,并且在Android浏览器中打开正常。 HTTP服务器:nginx 码: public void postData() { // Add your data List nameValuePairs = new ArrayList(2); nameValuePairs.add(new BasicNameValuePair(“string”, “myfirststring”)); try { HttpPost post = new HttpPost(new URI(“https://example.com/submit”)); post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); KeyStore trusted = KeyStore.getInstance(“BKS”); trusted.load(null, “”.toCharArray()); SSLSocketFactory sslf = new SSLSocketFactory(trusted); sslf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(new Scheme (“https”, sslf, […]