java - Java 6 支持 TLS1.2
问题描述
我们有一个在嵌入式平台上运行的遗留应用程序,我们使用 Java 6 作为 JVM。我们有来自需要 TLS1.2 支持的应用程序的 https 访问权限。我们使用的 JVM 不提供此功能。如何实现对应用程序的 TLS1.2 支持?
解决方案
我们可以通过使用Bouncy Castle库来实现 TLS1.2 支持。
这是详细的解决方案
- 将适当的 BC 库添加到您的项目中
Maven 依赖
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.64</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bctls-jdk15to18</artifactId>
<version>1.64</version>
</dependency>
将安全提供程序添加为 BC
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { Security.insertProviderAt(new BouncyCastleProvider(), 1); } // add provider only if it's not in the JVM if (Security.getProvider(BouncyCastleJsseProvider.PROVIDER_NAME) == null) { Security.insertProviderAt(new BouncyCastleJsseProvider(), 2); }
或者,您可以更新 JRE/lib/security/java.security
security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.2=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
security.provider.3=sun.security.provider.Sun
security.provider.4=sun.security.rsa.SunRsaSign
security.provider.5=com.sun.net.ssl.internal.ssl.Provider
security.provider.6=com.sun.crypto.provider.SunJCE
security.provider.7=sun.security.jgss.SunProvider
security.provider.8=com.sun.security.sasl.Provider
BC 库需要位于顶部 (1&2)
使用 TLS1.2 初始化 SSL 上下文
SSLContext tls = SSLContext.getInstance("TLSv1.2"); tls.init(null, null, null); SSLContext.setDefault(tls);
测试
HttpsURLConnection urlConnection = null;
try {
URL url = new URL("https://www.nist.gov/");
urlConnection = (HttpsURLConnection) url.openConnection();
String data = IOUtils.toString(urlConnection.getInputStream(), "UTF-8");
System.out.println(data);
} catch (IOException ex) {
ex.printStackTrace();
try {
if (urlConnection != null) {
code = ((HttpURLConnection) urlConnection).getResponseCode();
message = ((HttpURLConnection) urlConnection).getResponseMessage();
} else {
message = ex.toString();
}
} catch (IOException ex2) {
message = ex2.toString();
}
System.out.println("Response : " + message);
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
推荐阅读
- javascript - 检查字符串是否为日期
- python - 如何在 Python 中通过 DataFrame 加速嵌套循环?
- docker - Kubernetes 集群上的 Apache pulsar(本地环境)
- javascript - MongoDB & 无法根据变量名称设置值
- python - 如何在 Python 中应用拉普拉斯滤波器
- php - 我们如何将结果数据从 CodeIgniter 控制器传递到 AngularJS 控制器?
- android - 如果在另一台机器上生成 apk,推送通知不起作用
- angular - Angular 8:上传文件之前出现文件验证错误消息
- javascript - Parsley.js 验证僧伽罗泰米尔语(非英文字符)以及英文字母
- ios - Swift:如何从 json 响应 iOS 创建动态布局