当前位置: 首页 > 知识库问答 >
问题:

Javax。新ssl。SSLHandShakeException解决方案

晏望
2023-03-14

我收到了非常流行的“SSLHandShakeException”。

我正在使用IntelliJ运行一个java客户端,该客户端旨在处理Web服务请求/响应。我们通过一组凭据和url连接到服务器并传入请求文件。

我所做的一切

>

  • 已验证正在构造的URL是否在浏览器中工作。

    使用以下说明将证书添加到信任存储区,Keytool说明

    已验证truststore使用的JRE是否正确。

    我正在使用httpClient对象。我将对象实例化如下,

    private void initConnection()
    {
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(new AuthScope(this.target.getHostName(), this.target.getPort()), new UsernamePasswordCredentials(this.userid, this.password));
    
        this.httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
    
        // Be able to deal with basic auth. Generate BASIC scheme object and
        // add it to the local auth cache
    
        BasicScheme basicScheme = new BasicScheme(); // we throw an error here
        this.authCache.put(this.target, basicScheme);
        localContext = HttpClientContext.create();
        localContext.setAuthCache(this.authCache);
    }
    

    此对象的执行如下,这也是抛出错误的代码,

    responseNode = this.httpClient.execute(getTarget(), httpRequest, responseHandler);
    

    我已尝试在过程中强制使用信任存储,如下所示,

    系统setProperty(“javax.net.ssl.trustStore”,“…公共\JRE\lib\security\cacerts”);系统setProperty(“javax.net.ssl.trustStorePassword”,“changeit”);

    当不涉及SSL时,适用于超文本传输协议。

    除此之外,我不是SSL专家。我已经进行了相当多的挖掘,我希望有人有主意。我当然对没有正确安装证书(十几次)持开放态度,或者我可能需要添加更多代码来正确配置我的对象。如果缺少信息,我很乐意提供!

    提前谢谢你。

  • 共有2个答案

    昝涛
    2023-03-14

    通过使用自定义HttpClient,默认情况下它不会查看HttpClientBuilder文档中的系统信任存储:

    当未显式设置特定组件时,此类将使用其默认实现。在调用build()之前调用useSystemProperties()方法时,配置默认实现时将考虑系统属性。

    尝试使用

    HttpClients.custom().setDefaultCredentialsProvider(credsProvider).useSystemProperties().build();
    
    鄢选
    2023-03-14

    我自己也不得不处理Java客户机中的许多SSL问题,因此我理解您所遇到的错误消息中缺乏有用的细节所带来的沮丧。以下是一些您可以尝试和验证的内容。

    1. 服务器和客户端可以就SSL版本达成一致

    与许多协议一样,SSL/TLS协议也有几个版本。TLS实现实际上总是向后兼容的,但由于协议的早期版本被认为不安全,许多服务器和客户端将不接受早期版本。

    TLS协议规定,即使服务器的证书可能受信任,证书本身的通用名称也必须与服务器的主机名匹配。例如,如果服务器位于www.microsoft。com提供了www.google。com证书客户端将不接受连接。当人们连接到内部服务器时,这个问题往往是一个大问题,但当连接到公共服务器时,问题就不那么严重了。有一种非常简单的方法可以使用自定义SSL工厂禁用主机名验证。

     类似资料:
    • 我得到一个"异常在线程"主"javax.net.ssl.SSLHandshake异常:收到致命警报:handshake_failure"下面的代码。有人知道如何修复它吗?

    • 我正在尝试打开一个htttps网站。网址是前。https://x.xx.xx.xx/.我已经写了打击代码。 字符串url=”https://x.xx.xx.xx/"; URL obj=新URL(URL); HttpURLConnection con=(HttpURLConnection)obj。openConnection(); //可选的默认值是GETcon.setRequest estmeth

    • 我正在编写一个JMeter测试计划,以连接到SSL端口(Tomcat Connector)。在JDK8(1.8.0_51)上使用三个JMeter SSL客户端实现(HttpClient4、HttpClient3.1、Java)中的任何一个连接到SSL端口时,我会收到一个SSLHandshakeExc0019(handshake_failure)。如果我使用JDK7(1.7。0_75)-一切都像预期

    • 我正在尝试使用Spring RestTemplate调用POST Rest调用: 这个https://server.com有证书:webapi。tartu-x86。p12我将证书导入C:\Java_8\jre\lib\security\cacerts usinf keytool 运行代码后,我出现以下错误: 我使用的是Java1.8.091 有人能帮忙吗?

    • Java版本1.8.0_121,我看到的解决方案仅适用于Java 9 描述: 我的目标是获取有关项目的信息,比如一个项目的总下载量有一个名为SourceForge Downloads Stats API的API。 所以我创建了一个简单的程序,将结果视为原始文本,我不需要它作为JSON。 例如,我正在获取有关ApacheOpenOffice下载和更多信息- 但是我无法使用获取数据,这是下面错误的原因

    • 我正在尝试获得一个在android上工作的相互认证请求。我正在测试我自己的服务器,所以我有一个自签名的CA和客户端证书。 因此,我将不得不考虑不受信任的服务器证书。 以下是我正在做的: 然后使用AsyncWork来执行请求: 我已经在浏览器和iOS客户端上测试了这个请求,但我无法在Android上运行它。 我认为这是允许不受信任的服务器证书的正确方法: 不知道为什么我得到: javax.net.s