忽略Java ssl连接中的“证书上的名称错误”类型错误
我正在尝试使用https url建立连接,但由于它仍在测试中,url将重定向到测试环境,导致浏览器向用户提示一条消息,大致说明证书是可信的、有效的,但与域名不匹配,以及他们是否要继续。我很难用Java处理这个问题。我找到的所有答案都建议使用这样的信任管理器忽略Java ssl连接中的“证书上的名称错误”类型错误,java,ssl,x509certificate,Java,Ssl,X509certificate,我正在尝试使用https url建立连接,但由于它仍在测试中,url将重定向到测试环境,导致浏览器向用户提示一条消息,大致说明证书是可信的、有效的,但与域名不匹配,以及他们是否要继续。我很难用Java处理这个问题。我找到的所有答案都建议使用这样的信任管理器 TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssu
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
return;
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
return;
}
}};
sslContext.init(kmf.getKeyManagers(), trustAllCerts, new SecureRandom());
但这并没有改变任何事情
身份验证涉及在读取客户端证书的私钥时输入密码,这在浏览器和我的应用程序中都可以相同且正确地工作。在此身份验证之后,浏览器中会弹出提示,或者连接在我的应用程序中返回“bad_certificate”错误。是否有其他方法可以完全忽略域验证或显示相同的提示
为清楚起见,我的应用程序不会导致出现密码提示,因为我在中编程了密码提示,我认为它只是源于windows检测到我的应用程序试图访问证书的私钥,因此我假设第二个提示也会以类似的方式工作,但我还没有找到实现这一点的任何参数 我要警告您,如果您这样做是为了测试代码,那么这不是正确的做法。浏览器通常会忽略错误并提示用户是否愿意继续,尽管存在问题。如果他决定继续,那么他拥有决定权。
在java应用程序中,如果使用JDK提供的默认SSLSocketFactory,则只有在SSL握手成功时,才会建立SSL会话。这是出于安全考虑。如果你需要像浏览器一样的功能;若要在不考虑安全问题的情况下继续,则需要有自己的自定义实现。或者最好不要使用SSL。让我警告您,如果您这样做是为了测试代码,那么这不是正确的做法。浏览器通常会忽略错误并提示用户是否愿意继续,尽管存在问题。如果他决定继续,那么他拥有决定权。 在java应用程序中,如果使用JDK提供的默认SSLSocketFactory,则只有在SSL握手成功时,才会建立SSL会话。这是出于安全考虑。如果你需要像浏览器一样的功能;若要在不考虑安全问题的情况下继续,则需要有自己的自定义实现。或者最好不要使用SSL 是否有其他方法可以忽略域验证 对。请参阅Java的接口: 在握手过程中,如果URL的主机名和服务器的 标识主机名不匹配,验证机制可以调用 返回此接口的实现者,以确定此连接 应该允许 是否有其他方法可以忽略域验证 对。请参阅Java的接口: 在握手过程中,如果URL的主机名和服务器的 标识主机名不匹配,验证机制可以调用 返回此接口的实现者,以确定此连接 应该允许
这是一个有效的警告。然而,我对这一点投了反对票,认为这不是一个答案:在某些情况下,Java代码需要连接到合法的HTTPS URL,Java代码像任何好的浏览器一样告诉用户证书中的名称X与URL中的主机名Y不匹配,用户仍然希望建立连接。这是一个有效的警告。然而,我对这一点投了反对票,认为这不是一个答案:在某些情况下,Java代码需要连接到合法的HTTPS URL,就像任何好的浏览器一样,Java代码告诉用户证书中的名称X与URL中的主机名Y不匹配,并且用户仍然希望建立连接。