Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用https(SSL的自签名证书)连接到VPS上的解析服务器_Java_Android_Parse Platform_Https_Self Signed - Fatal编程技术网

Java 使用https(SSL的自签名证书)连接到VPS上的解析服务器

Java 使用https(SSL的自签名证书)连接到VPS上的解析服务器,java,android,parse-platform,https,self-signed,Java,Android,Parse Platform,Https,Self Signed,出于某些原因,Parse用户必须将其解析环境迁移到VPS(我的问题就是这样)或Heroku、AWS(不需要这些平台)等。Android有一个新的Parse SDK(1.13.0),它允许使用新的解析接口初始化连接,如下所示: Parse.initialize(new Parse.Configuration.Builder(this) .applicationId("myAppId") .clientKey(null)

出于某些原因,Parse用户必须将其解析环境迁移到VPS(我的问题就是这样)或Heroku、AWS(不需要这些平台)等。Android有一个新的Parse SDK(1.13.0),它允许使用新的解析接口初始化连接,如下所示:

Parse.initialize(new Parse.Configuration.Builder(this)
                .applicationId("myAppId")
                .clientKey(null) 
                .addNetworkInterceptor(new ParseLogInterceptor())
                .server("https://VPS_STATIC_IP_ADDRESS/parse/").build());
此类请求使用端口443完成。适当的
.js
(nodejs)连接器文件已经编辑好,因此端口443在本地连接到端口1337(端口侦听器),当在浏览器中访问解析服务器时(当然是从外部VPS远程访问),可以应用自签名证书并进一步访问。但当Android应用程序(启动器)尝试连接它时,由于自签名证书,它无法连接。在Parse SDK中是否有可能应用自签名证书

另外,关于这个问题是否真的有一个bug,这就是为什么发布1.13.1解析版本的原因?如果是,在哪里可以获得这个版本的jar库

谢谢大家!

我刚刚解决了这个问题- android的Parse SDK在自签名证书中没有现成的支持。 您需要自己修改代码

第一步-相关代码段位于ParseHttpClient中

  public static ParseHttpClient createClient(int socketOperationTimeout,
      SSLSessionCache sslSessionCache) {
    String httpClientLibraryName;
    ParseHttpClient httpClient;
    if (hasOkHttpOnClasspath()) {
      httpClientLibraryName = OKHTTP_NAME;
      httpClient =  new ParseOkHttpClient(socketOperationTimeout, sslSessionCache);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      httpClientLibraryName = URLCONNECTION_NAME;
      httpClient =  new ParseURLConnectionHttpClient(socketOperationTimeout, sslSessionCache);
    } else {
      httpClientLibraryName = APACHE_HTTPCLIENT_NAME;
      httpClient =  new ParseApacheHttpClient(socketOperationTimeout, sslSessionCache);
    }
    PLog.i(TAG, "Using " + httpClientLibraryName + " library for networking communication.");
    return httpClient;   }
如果您的目标支持是更高级的版本,那么KITKAT- 然后需要添加ParseURLConnectionHttpClient构造函数:

    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){

            public boolean verify(String hostname, SSLSession session) {
                if(hostname.equals("YOUR TARGET SERVER")) {
                    return true;
                }
                return false;
            }});
在其他情况下(旧版本),代码将落在Apache上,我无法使用它-因此我做了以下工作:我将okhttp库添加到我的应用程序中(以版本2.4为例-与构建中解析指示的相同,最新版本具有不同的包名)然后代码将进入第一个条件,因为它将在路径上找到okhttp。 您可能应该替换if条件顺序,这样它将只在少于KITKAT的版本上发生

在ParseOkHttpClient中,添加以下自签名证书代码:

   public void initCert() {
    try {
        Log.i("PARSE","initCert");

        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        String yairCert = "-----BEGIN CERTIFICATE-----\n" +
                YOUR CERTIFICATE HERE
                "-----END CERTIFICATE-----\n";
        InputStream caInput = new ByteArrayInputStream(yairCert.getBytes());
        Certificate ca = null;
        try {
            ca = cf.generateCertificate(caInput);
            System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
        } catch (CertificateException e) {
            e.printStackTrace();
        } finally {
            try {
                caInput.close();
            } catch (IOException e) {
                Log.e("PARSE_BUG","Failure on Cert installing",e);
                e.printStackTrace();
            }
        }

        // Create a KeyStore containing our trusted CAs
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        // Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        // Create an SSLContext that uses our TrustManager
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);
        Log.i("PARSE","Initiating Self Signed cert");
        okHttpClient.setSslSocketFactory(context.getSocketFactory());
        try {
            cf = CertificateFactory.getInstance("X.509");
        } catch (CertificateException e) {
            Log.e("PARSE_BUG","Failure on Cert installing",e);
            e.printStackTrace();
        }
    } catch (IOException e) {
        Log.e("PARSE_BUG","Failure on Cert installing",e);
        e.printStackTrace();
    } catch (CertificateException e) {
        Log.e("PARSE_BUG","Failure on Cert installing",e);
        e.printStackTrace();

    } catch (NoSuchAlgorithmException e) {
        Log.e("PARSE_BUG","Failure on Cert installing",e);
        e.printStackTrace();
    } catch (KeyStoreException e) {
        Log.e("PARSE_BUG","Failure on Cert installing",e);
        e.printStackTrace();
    } catch (KeyManagementException e) {
        Log.e("PARSE_BUG","Failure on Cert installing",e);
        e.printStackTrace();
    }
最后一部分是调用此方法+验证主机名,它也应该发生在构造函数中。 initCert(); okHttpClient.setHostnameVerifier(新的HostnameVerifier(){ @凌驾 公共布尔验证(字符串s,SSLSession SSLSession){ 如果(s.equals(“您的目标服务器”)){ 返回true; } 返回false; } });

就这样。本地构建解析并部署到你的应用程序中,它将像一个魔咒一样工作


享受

你可能应该修正标题中的拼写错误。。。