认证android retrofit,Android Retrofit和OkHttpClient错误在后端SSL握手让我们加密认证

我真的不知道如何解决这个问题,这个项目它是一个Android和iOs应用程序与Docker容器服务器上的RoR后端API ...Android Retrofit和OkHttpClient错误在后端SSL握手让我们加密认证

在Android应用程序中,我使用了Retrofit Library来实现api客户端实现,并且一切工作都很完美......直到SSL证书在服务器上实现为止。我的合作伙伴使用Let’s Encrypt对于这一点,我可以要求成功地与卷曲的API,邮递员......但我的Android应用总说:

D/Error: SSL handshake aborted: ssl=0xXXXXXXXX: I/O error during system call, Connection reset by peer

或有时:

D/Error: SSL handshake timeout

的ApiClient来源:

public class ApiClient {

public static final String DOMAIN = "qwerty.xyz"; //not the real url obviously

public static final String BASE_URL = "https://api." + DOMAIN;

private static Retrofit retrofit = null;

private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

private static Gson gson = new GsonBuilder()

.create();

private static Retrofit.Builder builder =

new Retrofit.Builder()

.baseUrl(BASE_URL)

.addConverterFactory(GsonConverterFactory.create(gson));

public static S createService(Class serviceClass) {

return createService(serviceClass, null, null);

}

public static S createService(Class serviceClass, String username, String password) {

Retrofit retrofit = builder.client(getUnsafeOkHttpClient())

.build();

return retrofit.create(serviceClass);

}

public static OkHttpClient getUnsafeOkHttpClient() {

try {

// Create a trust manager that does not validate certificate chains

final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {

@Override

public void checkClientTrusted(

java.security.cert.X509Certificate[] chain,

String authType) throws CertificateException {

}

@Override

public void checkServerTrusted(

java.security.cert.X509Certificate[] chain,

String authType) throws CertificateException {

}

@Override

public java.security.cert.X509Certificate[] getAcceptedIssuers() {

return new java.security.cert.X509Certificate[0];

}

} };

// Install the all-trusting trust manager

final SSLContext sslContext = SSLContext.getInstance("SSL");

sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

// Create an ssl socket factory with our all-trusting manager

final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

OkHttpClient okHttpClient = httpClient.sslSocketFactory(sslSocketFactory).hostnameVerifier(new HostnameVerifier() {

@Override

public boolean verify(String hostname, SSLSession session) {

return true;

}

})

.build();

return okHttpClient;

} catch (Exception e) {

throw new RuntimeException(e);

}

}

的观察,SSLSocketFactory的方法已不...但我不知道怎么是新的方式来做到这一点...

我使用'com.squareup.retrofit2:翻新:2.2.0'...

我真的很感激任何帮助找到解决方案。

UPDATE & SOLUTION

让我们使用加密协议TLSv1.2工作,而不是自签名的,我们需要排除年长的版本TSL的。

我创建一个自定义的SSLSocketFactory做到这一点:

public class TLSSocketFactory extends SSLSocketFactory {

private SSLSocketFactory internalSSLSocketFactory;

public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {

SSLContext context = SSLContext.getInstance("TLS");

context.init(null, null, null);

internalSSLSocketFactory = context.getSocketFactory();

}

@Override

public String[] getDefaultCipherSuites() {

return internalSSLSocketFactory.getDefaultCipherSuites();

}

@Override

public String[] getSupportedCipherSuites() {

return internalSSLSocketFactory.getSupportedCipherSuites();

}

@Override

public Socket createSocket() throws IOException {

return enableTLSOnSocket(internalSSLSocketFactory.createSocket());

}

@Override

public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {

return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));

}

@Override

public Socket createSocket(String host, int port) throws IOException, UnknownHostException {

return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));

}

@Override

public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {

return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));

}

@Override

public Socket createSocket(InetAddress host, int port) throws IOException {

return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));

}

@Override

public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {

return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));

}

private Socket enableTLSOnSocket(Socket socket) {

if(socket != null && (socket instanceof SSLSocket)) {

((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.2"});

}

return socket;

}

}

,然后我们和这与信任管理器HttpClient的:

final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {

@Override

public void checkClientTrusted(

java.security.cert.X509Certificate[] chain,

String authType) throws CertificateException {

}

@Override

public void checkServerTrusted(

java.security.cert.X509Certificate[] chain,

String authType) throws CertificateException {

}

@Override

public java.security.cert.X509Certificate[] getAcceptedIssuers() {

return new java.security.cert.X509Certificate[0];

}

} };

client = httpClient.sslSocketFactory(new TLSSocketFactory(), (X509TrustManager)trustAllCerts[0])

.build();

Retrofit retrofit = builder.client(client)

.build();

,瞧!

2017-05-13

lromano

+0

您是否拥有SSL的.crt文件?您也可以在本地包含.crt文件并将其添加到您的OkHttp客户端中。 –

+0

它不是静态的,它总是更新的证书 –

+0

您应该检查服务器上启用的密码。另外,是否有任何理由试图绕过证书验证? –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Retrofit是一个用于在Android应用中进行网络请求的库。它通过简化网络请求的过程,提供了一种方便的方式来与后台服务器进行通信。 在Retrofit中,首先需要创建一个RetrofitService类。这个类负责配置Retrofit的基础URL和创建Retrofit实例。可以通过调用RetrofitService的create方法来创建具体的服务接口实例。这个服务接口定义了与后台服务器进行通信的方法。 在使用Retrofit,可以通过Converter来将服务器返回的数据转换成Java对象。Retrofit支持多种转换器,可以根据数据的格式选择合适的转换器。 通过调用Retrofit的execute方法或enqueue方法可以发送网络请求。execute方法将请求发送到后台并即返回结果,而enqueue方法将请求放入请求队列中,并在请求完成后通过Callback回调返回结果。 综上所述,Android中使用Retrofit进行网络请求的步骤包括:配置Retrofit的基础URL、创建服务接口实例、定义请求方法、选择合适的转换器、发送网络请求并处理响应。 引用: : 这段代码展示了如何在Android中使用Retrofit进行网络请求。 : 这段代码展示了创建Retrofit实例和服务接口实例的方式。 : 这段代码展示了最初使用Retrofit的方式,其中包括设置基础URL和创建Retrofit实例的步骤。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [android retrofit 从无知到入门](https://blog.csdn.net/shop_and_sleep/article/details/123526236)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值