【问题标题】:Fixing javax.net.ssl.SSLPeerUnverifiedException: No peer certificate修复 javax.net.ssl.SSLPeerUnverifiedException:没有对等证书
【发布时间】:2015-05-05 11:35:44
【问题描述】:

我正在开发一个 android 应用程序,该应用程序必须使用自签名证书 (SSL/TLS1.2) 通过 https 与服务器通信。我也在使用 Volley。

我正在关注this 教程。保存 .crt 文件,在原始目录中使用 keytool -importcert -v -trustcacerts -file "cert.crt" -alias IntermediateCA -keystore "key.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-146.jar" -storetype BKS -storepass blabla 创建 key.bks 等等。

当我向服务器发送数据时,Response.ErrorListener() 收到 No peer certificate 错误。

尝试使用 Postman 发送我的 json(当然,必须添加证书) - 工作正常。

在我的安卓设备上手动安装证书 - 工作正常

我怎样才能让它工作?

【问题讨论】:

  • 朵拉,我也面临同样的问题。找到解决方案后请告诉我。
  • @OMG ,我已经发布了答案。

标签: java android https ssl-certificate android-volley


【解决方案1】:

我为这个问题做了很多努力。 我发送到的服务器似乎有一个虚拟主机(托管在 GAE 上)。在 Android 5.0 上此问题已解决,但在 Android 5.0 之后,您必须自己添加 SNI 支持。 这里是对这个问题的解释http://blog.dev001.net/post/67082904181/android-using-sni-and-tlsv1-2-with-apache

因此,为了使我的代码正常工作,我必须从教程中更改 SslSocketFactory 类。它发挥了作用。

import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.GeneralSecurityException;
import java.security.KeyManagementException;

import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;


import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;

import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.params.HttpParams;

import android.annotation.TargetApi;
import android.net.SSLCertificateSocketFactory;
import android.os.Build;


 class SslSocketFactory extends SSLSocketFactory {

     InputStream mkeyStore;
     String mkeyStorePassword;

     public SslSocketFactory(InputStream keyStore, String keyStorePassword) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException{
         super(null);
         mkeyStore=keyStore;
         mkeyStorePassword=keyStorePassword;

     }



      @Override
      public Socket connectSocket(Socket s, String host, int port, InetAddress localAddress, int localPort, HttpParams params) throws IOException {
          return null;
      }

      @Override
      public Socket createSocket() throws IOException {
          return null;
      }

      @Override
      public boolean isSecure(Socket s) throws IllegalArgumentException {
          if (s instanceof SSLSocket) {
              return ((SSLSocket) s).isConnected();
          }
          return false;
      }

      @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
      @Override
      public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
          SSLSocket sslSocket = null;


              if (autoClose) {
                  socket.close();
              }


                 SSLCertificateSocketFactory sslSocketFactory = (SSLCertificateSocketFactory) SSLCertificateSocketFactory.getDefault(0, null);


              try {
                sslSocketFactory.setTrustManagers(new TrustManager[] { new SsX509TrustManager( mkeyStore, mkeyStorePassword) });
            } catch (GeneralSecurityException e1) {

                e1.printStackTrace();
            }



              sslSocket = (SSLSocket) sslSocketFactory.createSocket(InetAddress.getByName(host), port);

              sslSocket.setEnabledProtocols(sslSocket.getSupportedProtocols());

              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {

                  sslSocketFactory.setHostname(sslSocket, host);
              } else {

                  try {
                      java.lang.reflect.Method setHostnameMethod = sslSocket.getClass().getMethod("setHostname", String.class);
                      setHostnameMethod.invoke(sslSocket, host);
                  } catch (Exception e) {

                  }
              }


          return sslSocket;
      }

  }

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2014-11-22
    • 2015-07-25
    • 2012-11-09
    • 1970-01-01
    相关资源
    最近更新 更多