是否有用于禁用证书验证的 java 设置? [复制]
Posted
技术标签:
【中文标题】是否有用于禁用证书验证的 java 设置? [复制]【英文标题】:Is there a java setting for disabling certificate validation? [duplicate] 【发布时间】:2011-06-07 11:34:18 【问题描述】:我在尝试启动应用程序时收到此错误:
Sun.security.validator.ValidatorException: PKIX path validation failed:
java.security.cert.CertPathValidatorException: java.net.UnknownHostException:oscp.thawte.com
应用程序位于封闭网络后面,永远无法访问 oscp.thawte.com。是否有可以禁用此功能的 java 设置?
【问题讨论】:
【参考方案1】:-Dcom.sun.net.ssl.checkRevocation=false
【讨论】:
我应该在哪里执行这个? 它是JVM的命令行参数。也可以通过编程方式设置***.com/questions/5189914/setting-system-property 使用 OpenJDK 6 这对我不起作用。 (可能是特定于太阳的) 在 OpenJDK 代码中引用了 hg.openjdk.java.net/jdk7/jdk7/jdk/file/37a05a11f281/src/share/… 尝试检查您使用的是哪个 TrustManager。 不适用于我的 Java 8。我在代码中使用了 System.setProperty("com.sun.net.ssl.checkRevocation", "false")。该属性确实已设置,但没有任何效果。【参考方案2】:不完全是一个设置,但您可以覆盖默认的 TrustManager 和 HostnameVerifier 以接受任何内容。这不是一种安全的方法,但在您的情况下,这是可以接受的。
完整示例:Fix certificate problem in HTTPS
【讨论】:
这应该是公认的答案。接受的答案中提到的属性在许多 JVM 上都不起作用。【参考方案3】:在 Axis 网络服务中,如果您必须禁用证书检查,请使用以下代码:
AxisProperties.setProperty("axis.socketSecureFactory","org.apache.axis.components.net.SunFakeTrustSocketFactory");
【讨论】:
【参考方案4】:使用 java 软件分发中的 cli 实用程序 keytool 来导入(和信任!)所需的证书
示例:
从 cli 更改 dir 到 jre\bin
检查密钥库(在 jre\bin 目录中找到的文件) keytool -list -keystore ..\lib\security\cacerts 输入密钥库密码:changeit
从所需服务器下载并保存所有证书链。
添加证书(在需要删除文件“..\lib\security\cacerts”上的“只读”属性之前) keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore ..\lib\security\cacerts -file "r:\root.crt"
无意中发现了这么简单的提示。 其他解决方案需要使用 InstallCert.Java 和 JDK
来源:http://www.java-samples.com/showtutorial.php?tutorialid=210
【讨论】:
【参考方案5】:在我的 Mac 上,我确信我不会在特定站点以外的任何地方允许 java,我能够使用 Preferences->Java 来调出 Java 控制面板并关闭检查。如果 DLink 修复了他们的证书,我会重新打开它。
【讨论】:
我该如何打开这个文件?【参考方案6】:除了上面的答案。您可以通过实现 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);
但是这对于生产来说不是一个好的做法。
How to disable SSL certificat validation in Java 上的这个示例包含一个可以复制到项目中的实用程序类。
【讨论】:
第一次尝试就成功了。谢谢!! 你能告诉我你使用的是什么版本的apache客户端吗?这不适用于更高版本,例如版本 4.5.13 你能告诉我你用的是什么版本的java,什么版本的Apache Client。 @AntonCavanaugh 在撰写此答案时,我使用的是 java 8。【参考方案7】:这很简单。在我看来这是对每个人来说最好的方法
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();
【讨论】:
您确定这会有所帮助吗?我不确定发帖人是不是想给自己打个ws。以上是关于是否有用于禁用证书验证的 java 设置? [复制]的主要内容,如果未能解决你的问题,请参考以下文章