如何解决Java 1.7.0_67 api 连接
我使用的是 Java 版本 1.7.0_67 并希望与使用 TLS_v1.2 协议和密码套件的外部 API https://www.ngdc.noaa.gov/ 通信:
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1)
- TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048)
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1)
- TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (dh 2048)
我通过更新 https://www.oracle.com/java/technologies/javase-jce-all-downloads.html
在 Java 中启用了更强大的算法版本当直接使用 Intellij Idea(运行程序,调试程序)时,我得到代码 200 的响应,但是当构建 jar 并使用相同的 java 运行时,我得到“handshake_failure (40)”。 这是来自 console output
的快照此外,我使用 BouncyCastleJsseProvider 作为 Java 的安全提供程序。否则,即使通过 Intellij 运行/调试也无法正常工作。
我的代码
public class App {
public static void main(String[] args) throws Exception {
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.removeProvider(BouncyCastleJsseProvider.PROVIDER_NAME);
Security.insertProviderAt(new BouncyCastleProvider(),1);
Security.insertProviderAt(new BouncyCastleJsseProvider(),1);
String httpsURL = "https://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination?lat1=41.000485&lon1=-77.938029&resultFormat=json&startYear=2012&startMonth=01&startDay=10&model=IGRF";
URL url = new URL(httpsURL);
SSLContext context = SSLContext.getInstance("TLS","BCJSSE");
context.init(null,null,null);
SSLSocketFactory fact = context.getSocketFactory();
System.out.println(System.getProperty("java.version"));
OkHttpClient client = new OkHttpClient().newBuilder()
.addInterceptor(new SSLHandshakeInterceptor())
.hostnameVerifier(new HostnameVerifier() {
public boolean verify(String ss,SSLSession sslSession) {
return true;
}
})
.build();
Request request = new Request.Builder()
.url(httpsURL)
.build();
Response response = client.newCall(request).execute();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。