是否有用于禁用证书验证的java设置?
我在尝试启动应用程序时收到此错误:是否有用于禁用证书验证的java设置?,java,ssl-certificate,Java,Ssl Certificate,我在尝试启动应用程序时收到此错误: Sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: java.net.UnknownHostException:oscp.thawte.com 该应用程序位于封闭的网络后面,永远无法访问oscp.thawte.com。是否有可以禁用此功能的java设置?-Dcom.sun
Sun.security.validator.ValidatorException: PKIX path validation failed:
java.security.cert.CertPathValidatorException: java.net.UnknownHostException:oscp.thawte.com
该应用程序位于封闭的网络后面,永远无法访问oscp.thawte.com。是否有可以禁用此功能的java设置?-Dcom.sun.net.ssl.checkRevocation=false不完全是一个设置,但您可以覆盖默认的TrustManager和HostnameVerifier以接受任何内容。这不是一种安全的方法,但在您的情况下,它是可以接受的
完整示例:在Axis webservice中,如果必须禁用证书检查,请使用以下代码:
setProperty(“axis.socketSecureFactory”、“org.apache.axis.components.net.SunFakeTrustSocketFactory”) 使用java软件发行版中的cli实用工具keytool导入(和信任!)所需的证书 样本:
keytool-list-keystore..\lib\security\cacerts
输入密钥库密码:changeit
来源:在我的Mac电脑上,我确信除了特定站点之外,我不会在任何地方使用java,我可以使用Preferences->java打开java控制面板并关闭检查。如果DLink修复了他们的证书,我会重新打开它
除了上面的答案。您可以通过实现TrustManager以编程方式执行此操作:
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {}
}
};
SSLContext sc=null;
try {
sc = SSLContext.getInstance("SSL");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
sc.init(null, trustAllCerts, new java.security.SecureRandom());
} catch (KeyManagementException e) {
e.printStackTrace();
}
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// Create all-trusting host name verifier
HostnameVerifier validHosts = new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
};
// All hosts will be valid
HttpsURLConnection.setDefaultHostnameVerifier(validHosts);
然而,这并不是一个好的生产实践
上的这个示例包含一个实用程序类,您可以在项目中复制它。它非常简单。在我看来,这是对每个人来说最好的方法
Unirest.config().verifySsl(false);
HttpResponse<String> response = null;
try {
Gson gson = new Gson();
response = Unirest.post("your_api_url")
.header("Authorization", "Basic " + "authkey")
.header("Content-Type", "application/json")
.body("request_body")
.asString();
System.out.println("------RESPONSE -------"+ gson.toJson(response.getBody()));
} catch (Exception e) {
System.out.println("------RESPONSE ERROR--");
e.printStackTrace();
}
}
Unirest.config().verifySsl(false);
HttpResponse响应=null;
试一试{
Gson Gson=新的Gson();
response=Unirest.post(“您的api url”)
.header(“授权”、“基本”+“授权密钥”)
.header(“内容类型”、“应用程序/json”)
.机构(“请求机构”)
.asString();
System.out.println(“----响应----”+gson.toJson(RESPONSE.getBody());
}捕获(例外e){
System.out.println(“----响应错误--”);
e、 printStackTrace();
}
}
我应该在哪里执行它?它是JVM的命令行参数。您还可以使用OpenJDK 6以编程方式进行设置,这对我不起作用。(可能是特定于Sun的)OpenJDK代码中引用了它,请尝试检查您使用的是哪个TrustManager。对我来说,它不适用于Java 8。我在代码中使用了System.setProperty(“com.sun.net.ssl.checkRevocation”、“false”)。属性没有设置,但没有效果。这应该是可接受的答案。接受答案中提到的属性对许多JVM无效。您确定这会有帮助吗?我不确定海报是否试图自己打ws-call。如何打开此文件?