Есть ли способ решить проблему сброса соединения после использования провайдера bouncycastle - PullRequest
1 голос
/ 05 февраля 2020

Я использую java 1.6.0_111, который не поддерживает tlsv1.2, но мой сервер принимает только tlsv1.2, поэтому я попытался с провайдером bouncycastle, но он не работает, он выдает ошибку сброса соединения. Несмотря на то, что я увеличил время соединения до 30000, он все еще получает ошибку в conn.getoutputstream.

Ниже мой код:

Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.insertProviderAt(new BouncyCastleProvider(), 1);

Security.removeProvider(BouncyCastleJsseProvider.PROVIDER_NAME);
Security.insertProviderAt(new BouncyCastleJsseProvider(), 2);

SSLContext sslContext = SSLContext.getInstance("TLSv1.2", new BouncyCastleJsseProvider());

log("The Supported Protocols are::"+Arrays.asList(protocols));

/*sslContext.init(null, tmf.getTrustManagers(), null);
SSLContext.setDefault(sslContext);;*/
String https_url ="myprodurl";
String json = mattArray.toString().trim();
URL url = new URL(https_url);
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
log("after opening connection");
conn.setConnectTimeout(30000);
log("step1");
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
log("step2");
OutputStream os = conn.getOutputStream();
log("step3");
os.write(json.getBytes("UTF-8"));
log("step4");
os.close();
log("after closing outputstream");
InputStream in = new BufferedInputStream(conn.getInputStream());
String response = IOUtils.toString(in, "UTF-8");
log("Result after Reading JSON Response\n\n");
log(response);

Ошибка, которую я получил:

2020-02-04 21:00:42,386 [system] [DEBUG] test - ERROR2 :java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:168)
    at com.ibm.jsse2.a.a(a.java:148)
    at com.ibm.jsse2.a.a(a.java:96)
    at com.ibm.jsse2.tc.a(tc.java:302)
    at com.ibm.jsse2.tc.g(tc.java:208)
    at com.ibm.jsse2.tc.a(tc.java:482)
    at com.ibm.jsse2.tc.startHandshake(tc.java:597)
    at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:44)
    at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:36)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1014)
    at com.ibm.net.ssl.www2.protocol.https.b.getOutputStream(b.java:66)

1 Ответ

0 голосов
/ 10 февраля 2020

Я не могу протестировать IBM j6, но с Sun / Oracle j6 (6u45, последний бесплатный выпуск), который имеет то же ограничение на TLS1.0, ваш метод настройки списка провайдеров работает для me учитывая, что у меня нет другого кода, изменяющего значения по умолчанию , и так же явно указывается либо значение по умолчанию SSLContext, значение по умолчанию HttpsURLConnection, либо экземпляр подключения, как я уже сказал. Последние три действительно нуждаются в bcprov в списке поставщиков, если сервер хочет использовать E CC, как это делают многие серверы сегодня, потому что у Sun j6 не было поставщика E CC; Я не уверен насчет IBM j6. Для моего тестового сервера я могу использовать хранилище доверенных сертификатов по умолчанию (поскольку я ранее установил хранилище доверенных сертификатов по умолчанию для обработки своих тестовых серверов); это может отличаться для вас. OTOH Я должен использовать явно не случайный источник по умолчанию, или я получаю загадочные ошибки.

Мой тестовый код для этих четырех методов (с возможностью включить bcprov в последние три):

static void SO60068561BouncyTLS (String[] args) throws Exception {
    String url = args[0];
    int n = Integer.parseInt (args[1]);
    Provider p1 = (Provider)Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider").newInstance();
    Provider p2 = (Provider)Class.forName("org.bouncycastle.jsse.provider.BouncyCastleJsseProvider").newInstance();
    SSLContext ctx = null;
    if( n == 1 ){ Security.insertProviderAt(p1, 1); Security.insertProviderAt(p2, 2); }
    else{ ctx = SSLContext.getInstance("TLSv1.2", p2); ctx.init(null, null, new SecureRandom()); }
    if( n < 0 ){ Security.addProvider(p1); n = -n; }

    if( n == 2 ) SSLContext.setDefault (ctx);
    else if( n == 3 ) HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
    HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection();
    if( n == 4 ) conn.setSSLSocketFactory(ctx.getSocketFactory());
    conn.connect();
    System.out.println (conn.getCipherSuite()+" "+conn.getResponseCode());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...