Java 在Android中使用RestTemplate使用https REST Web服务

Java 在Android中使用RestTemplate使用https REST Web服务,java,android,rest,ssl,resttemplate,Java,Android,Rest,Ssl,Resttemplate,在我的服务器中,我实现了一个自签名证书,并公开了一些使用REST端点的方法。我的客户端是一个android设备,我希望使用SpringRESTTemplate从中使用端点。问题是我使用的是https和自签名证书。我正在遵循,以便我的应用程序能够成功连接到我的服务器的根目录,但当我点击端点登录时,出现了异常 我的应用程序代码: 试试看{ RestTemplate RestTemplate=新RestTemplate(); restemplate.getMessageConverters().add

在我的服务器中,我实现了一个自签名证书,并公开了一些使用REST端点的方法。我的客户端是一个android设备,我希望使用SpringRESTTemplate从中使用端点。问题是我使用的是https和自签名证书。我正在遵循,以便我的应用程序能够成功连接到我的服务器的根目录,但当我点击端点登录时,出现了异常

我的应用程序代码:
试试看{
RestTemplate RestTemplate=新RestTemplate();
restemplate.getMessageConverters().add(新映射Jackson2HttpMessageConverter());
VoterReply VoterReply=restemplate.getForObject(RESTURL+LOGIN+“?username=“+username+”&password=“+password,VoterReply.class);
返回voterReply;
}
捕获(例外e){
Log.e(“NFCLOGIN”,e.getMessage(),e);
}
例外情况:
E/NFCLOGIN:I/O错误:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚点。;嵌套异常为javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidator异常:找不到证书路径的信任锚点。
org.springframework.web.client.ResourceAccessException:I/O错误:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚点。;嵌套异常为javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidator异常:找不到证书路径的信任锚点。
位于org.springframework.web.client.restemplate.doExecute(restemplate.java:491)
位于org.springframework.web.client.restemplate.execute(restemplate.java:439)
位于org.springframework.web.client.restemplate.getForObject(restemplate.java:237)
在evoting.marios.com.evoting.NfcLogin$HttpRequestTask.doInBackground(NfcLogin.java:372)
在evoting.marios.com.evoting.NfcLogin$HttpRequestTask.doInBackground(NfcLogin.java:364)
在android.os.AsyncTask$2.call(AsyncTask.java:295)
位于java.util.concurrent.FutureTask.run(FutureTask.java:237)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
运行(Thread.java:818)
原因:javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidator异常:找不到证书路径的信任锚。
在com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:328)
位于com.android.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.java:103)
位于com.android.okhttp.Connection.connect(Connection.java:143)
在com.android.okhttp.Connection.connectAndSetOwner(Connection.java:185)上
位于com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
位于com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:342)
位于com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:331)
位于com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:249)
位于com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437)
位于com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
位于com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89)
位于com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:25)
位于org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:72)
位于org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:46)
位于org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:63)
位于org.springframework.web.client.restemplate.doExecute(restemplate.java:476)
位于org.springframework.web.client.restemplate.execute(restemplate.java:439)
位于org.springframework.web.client.restemplate.getForObject(restemplate.java:237)
在evoting.marios.com.evoting.NfcLogin$HttpRequestTask.doInBackground(NfcLogin.java:372)
在evoting.marios.com.evoting.NfcLogin$HttpRequestTask.doInBackground(NfcLogin.java:364)
在android.os.AsyncTask$2.call(AsyncTask.java:295)
位于java.util.concurrent.FutureTask.run(FutureTask.java:237)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
运行(Thread.java:818)
原因:java.security.cert.CertificateException:java.security.cert.CertPathValidator异常:找不到证书路径的信任锚。
位于com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:324)
位于com.android.org.conscrypt.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:225)
位于com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:115)
访问com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateCain(OpenSSLSocketImpl.java:556)
在com.android.org.conscrypt.NativeCrypto.SSL_do_握手(本机方法)
访问com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:324)
位于com.android.okhttp.internal.http.SocketConnecto
compile 'com.squareup.okhttp:okhttp:2.5.0'
public static OkHttpClient createClient(Context context) {

    OkHttpClient client = null;

    CertificateFactory cf = null;
    InputStream cert = null;
    Certificate ca = null;
    SSLContext sslContext = null;
    try {
        cf = CertificateFactory.getInstance("X.509");
        cert = context.getResources().openRawResource(R.raw.your_cert); // Place your 'your_cert.crt' file in `res/raw`

        ca = cf.generateCertificate(cert);
        cert.close();

        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, tmf.getTrustManagers(), null);

        OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
        clientBuilder.connectTimeout(10, TimeUnit.SECONDS);
        clientBuilder.writeTimeout(10, TimeUnit.SECONDS);
        clientBuilder.readTimeout(30, TimeUnit.SECONDS);

        client = clientBuilder.sslSocketFactory(sslContext.getSocketFactory()).build();



    } catch (KeyStoreException | CertificateException | NoSuchAlgorithmException | IOException | KeyManagementException e) {
        e.printStackTrace();
    }

    return client;
}
OkHttpClient client = createClient(context);
ClientHttpRequestFactory requestFactory = new OkHttpClientHttpRequestFactory(client);
RestTemplate restTemplate = new RestTemplate(requestFactory);