在运行jvm之后,在运行时加载Java信任库吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在运行jvm之后,在运行时加载Java信任库吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3132字,纯文字阅读大概需要5分钟。
内容图文
![在运行jvm之后,在运行时加载Java信任库吗?](/upload/InfoBanner/zyjiaocheng/669/b2a4a94c73bf4aa58c9cab6dae03e0a0.jpg)
在我的Java应用程序中,我需要将POST请求发送到位于https后面的服务器.在运行Java应用程序的计算机上,在/usr/local/comp.jks中有一个Java信任存储,其中包含我需要与之交互的服务器(已经导入)的证书.
问题是我无法控制将如何运行将运行Java应用程序的JVM-例如通过增加:
-Djavax.net.ssl.trustStore = /usr/local/comp.jks到VM参数.
JVM启动后,是否可以在运行时从我的应用程序在上述路径中将信任库加载到上述路径中,以便我可以对https站点进行身份验证?
我只找到了有关如何在运行时导入证书的指南,但是我无法使用-也是因为我没有/usr/local/comp.jks的密码
下面是我目前的实现(常规):
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.KeyStore
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException
import java.security.cert.X509Certificate
import java.util.Base64;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class HttpsClientImpl extends AbstractHttpClient {
private String username = null;
private String password = null;
public HttpsClientImpl (String username, String password) {
this.username=username;
this.password=password;
}
@Override
public String sendRequest(String request, String method) {
System.setProperty( "javax.net.ssl.trustStore", "/usr/local/comp.jks" );
URL url = new URL(request);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection()
// Set auth
byte[] name = (username + ":" + password).getBytes();
String authStr = Base64.getEncoder().encodeToString(name);
con.setRequestProperty("Authorization", "Basic " + authStr)
con.setRequestMethod(method);
writeResult(con);
return con.getResponseCode();
}
private void writeResult(HttpsURLConnection con) throws IOException {
if(con!=null){
BufferedReader br = null;
if (200 <= con.getResponseCode() && con.getResponseCode() <= 299) {
br = new BufferedReader(new InputStreamReader(con.getInputStream()));
} else {
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
try {
String input;
while ((input = br.readLine()) != null){
System.out.println(input);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
当我运行时,我得到:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
Caused: sun.security.validator.ValidatorException: PKIX path building failed
解决方法:
假设您尚未实例化任何SSL连接,则只需调用
System.setProperty( "javax.net.ssl.trustStore", "/usr/local/comp.jks" );
您可能还需要设置javax.net.ssl.trustStorePassword,也可能需要设置javax.net.ssl.trustStoreType.
如果默认的SSL基础结构已经实例化,则可能必须使用密钥库创建自己的SSLContext和SSLSocketFactory.
内容总结
以上是互联网集市为您收集整理的在运行jvm之后,在运行时加载Java信任库吗?全部内容,希望文章能够帮你解决在运行jvm之后,在运行时加载Java信任库吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。