【问题标题】:Okhttp javax.net.ssl.sslexception: connection closed by peerOkhttp javax.net.ssl.sslexception:连接被对等方关闭
【发布时间】:2017-04-25 11:10:40
【问题描述】:

我调用api支付密码:https://test-api.pin.net.au/1/cards/

我试了一下邮递员,效果很好。

当我使用 okhttp 2.7.5 申请代码 android 时

我的代码:

OkHttpClient httpClient = new OkHttpClient();

    RequestBody requestBody = new FormEncodingBuilder()
            .add("publishable_api_key", BuildConfig.PIN_PAYMENT_PUBLISHABLE_KEY)
            .add("number", scanResult.cardNumber)
            .add("expiry_month", scanResult.expiryMonth+"")
            .add("expiry_year", scanResult.expiryYear+"")
            .add("cvc", scanResult.cvv)
            .add("address_postcode", scanResult.postalCode)
            .add("name", name).build();


    Request request = new Request.Builder()
            .url(BuildConfig.BASE_URL_PIN_PAYMENT + Constants.API_CARD_PIN_PAYMENT)
            .post(requestBody)
            .build();

    httpClient.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Request request, IOException e) {
            view.hideLoading();
            view.showError(e.getMessage());
        }

        @Override
        public void onResponse(Response response) throws IOException {
            view.hideLoading();
            if (!response.isSuccessful()){
                String body = "Something went wrong.Please try again later.";
                try {
                    JSONObject object = new JSONObject(response.body().string());
                    body = object.getString("error_description");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                view.showError(body);
            }else {
                view.hideLoading();
                Gson gson = new Gson();
                CardPinPaymentResponse paymentResponse = gson.fromJson(response.body().string() , CardPinPaymentResponse.class);
                view.getTokenCardSuccess(paymentResponse);
            }
        }

    });

但它不起作用并发出:javax.net.ssl.SSLException: Connection closed by peer

【问题讨论】:

    标签: java android okhttp


    【解决方案1】:

    当您连接到 https 服务器时,OKhttp 需要知道要提供哪些 TLS 版本和密码套件。这是连接https的示例代码

        ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)  
        .tlsVersions(TlsVersion.TLS_1_2)
        .cipherSuites(
              CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
              CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
              CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
        .build();
    
    OkHttpClient client = new OkHttpClient.Builder() 
        .connectionSpecs(Collections.singletonList(spec))
        .build();
    

    祝你好运!!!

    【讨论】:

    • 谢谢,但它不起作用,现在发出:无法找到可接受的协议。 isFallback=false, 模式=[ConnectionSpec(cipherSuites=[TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256], tlsVersions=[TLS_1_1], 支持TlsExtensions=true)]]vspan>支持的协议=[
    • 这只是示例代码。您需要知道服务器上使用的 TLS 版本,然后在客户端代码中设置
    • 我有同样的问题,我也尝试了我的服务器的 TLS 版本,但没有找到 kitkat 的任何解决方案,它在所有大于 kitkat 的版本上都可以正常工作,如果你找到任何解决方案,请告诉我也知道
    • @shoaib 对我来说它不适用于 android 8.0 本身。你能帮我解决这个问题吗? stackoverflow.com/questions/49946350/…
    • 你能看看这个,如果它解决了你的问题 - stackoverflow.com/a/45853669/3448003
    猜你喜欢
    • 2018-07-31
    • 2016-08-21
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2016-08-21
    • 2017-12-03
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多