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

使用Java-SSLHandShakeException使用REST API

田志
2023-03-14

我试图使用Java使用REST API。但是,当我运行代码时,它向我显示了这个异常。我不明白这是什么意思,我试图寻找解决方案,但我没有得到它:(

这是连接代码:

import javax.ws.rs.core.MediaType;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;

public class connectToAPI {
         public static void main(String[] args) {

try{
URL url = new URL("https://ip:port/rest/path");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
String userpassword = "user:pass";
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization","Basic "+
              userpassword);
conn.setRequestProperty("Content-Type","application/json");
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.flush();
int status = 0;
if( null != conn ){
status = conn.getResponseCode();
}

if( status != 0){
       System.out.println("status!=0");
if( status == 200 ){

       System.out.println("status==200");
//SUCCESS message
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));



}else if(status == 401){

       System.out.println("status==401");



}else if(status == 501){

       System.out.println("status==501");



}else if( status == 503){

       System.out.println("status==503");



}





}



} catch (Exception e) {

e.printStackTrace();

}

}
              }

当我运行代码时,它会向我显示以下异常:

Exception:java.security.cert.CertificateException:没有找到与IP地址匹配的主题替代名称

   at sun.security.ssl.Alerts.getSSLException(Unknown Source)

   at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)

   at sun.security.ssl.Handshaker.fatalSE(Unknown Source)

   at sun.security.ssl.Handshaker.fatalSE(Unknown Source)

   at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)

   at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)

   at sun.security.ssl.Handshaker.processLoop(Unknown Source)

   at sun.security.ssl.Handshaker.process_record(Unknown Source)

   at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)

   at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)

   at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)

   at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)

   at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)

   at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)

   at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(Unknown Source)

   at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)

   at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)

   at alert.connectToBAM.main(connectToBAM.java:77)

原因:java.security.cert.CertificateException:没有找到与IP地址匹配的主题替代名称

   at sun.security.util.HostnameChecker.matchIP(Unknown Source)

   at sun.security.util.HostnameChecker.match(Unknown Source)

   at sun.security.ssl.X509TrustManagerImpl.checkIdentity(Unknown Source)

   at sun.security.ssl.X509TrustManagerImpl.checkIdentity(Unknown Source)

   at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)

   at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)

   ... 14 more

我也试过新泽西Clinet:

javax.ws.rs.client.Client client = ClientBuilder.newClient();

                           WebTarget target = client.target("https://ip:port/rest/path");

                           System.out.println(

                                         target.request(MediaType.APPLICATION_JSON).get(String.class));

它显示了这个错误:

   at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:284)

   at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:278)

   at org.glassfish.jersey.client.JerseyInvocation.lambda$invoke$1(JerseyInvocation.java:767)

   at org.glassfish.jersey.internal.Errors.process(Errors.java:316)

   at org.glassfish.jersey.internal.Errors.process(Errors.java:298)

   at org.glassfish.jersey.internal.Errors.process(Errors.java:229)

   at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:414)

   at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:765)

   at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:428)

   at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:324)

   at alert.connectToBAM.main(connectToBAM.java:47)

你知道吗?好吧,这是我的毕业设计:(

共有1个答案

史绍晖
2023-03-14
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException

通常这些类型的异常是由于证书验证证书的颁发而发生的,遵循以下步骤:1。从浏览器下载证书并将其添加到jre文件夹2中的cacerts文件中。我们需要添加一些java代码来使用TrustManager验证证书。代码如下:

public static void trustManager()
{
    try 
    {

        TrustManager[] trustAllCerts = new TrustManager[]
                {
                        new X509TrustManager()
                        {
                            @Override
                            public void checkClientTrusted(X509Certificate[] chain, String authType)
                                    throws CertificateException {
                                // TODO Auto-generated method stub
                            }
                            @Override
                            public void checkServerTrusted(X509Certificate[] chain, String authType)
                                    throws CertificateException {
                                // TODO Auto-generated method stub
                            }
                            @Override
                            public X509Certificate[] getAcceptedIssuers() {
                                // TODO Auto-generated method stub
                                return null;
                            }

                        }
                };

        //Create an Instance for SSLContext class
        SSLContext sc = SSLContext.getInstance("SSL");

        //overload init method 
        sc.init(null, trustAllCerts, new java.security.SecureRandom());

        //Use static method setDefaultSSLSocketFactory
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        //Create Instance for Hostname verifier and override verify() method
        HostnameVerifier allHostsValid = new HostnameVerifier() {

            @Override
            public boolean verify(String arg0, SSLSession arg1) 
            {
                return true;
            }

        };

        //Verify hostname using static method setDefaultHostnameVerifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

每当您试图执行时,只需首先在main方法中调用此方法即可。希望这对你有帮助:)

 类似资料:
  • 我已经做了t3s的设置,并进行了配置。现在,当我试图拨打一个低于异常的电话时。请帮帮伙计们。

  • 我的web应用程序和web服务运行在同一个tomcat容器中。如果我不使用HTTPS,则一切正常。 当我在HTTPS上运行web应用程序和web服务时,当web应用程序试图调用WebServices时,我将获得SSLHandshakeException。 我已经使用以下命令创建了本地自签名证书文件 已在文件夹中创建了名为的证书文件。 现在,我想用下面的命令在Java密钥库中导入这个证书 当我在To

  • 我有一个Java服务器应用程序(加载了自己的服务器证书)试图安全地连接到另一台服务器(Microsoft有自己的服务器证书)。 它们都加载了可信的ROOT-CA证书,我可以在两台服务器上清楚地看到。在Java端,我在JRE lib/security ca信任库以及应用程序的信任库中加载了根ca证书。在Microsoft服务器上,它使用MMC工具加载根ca。 在SSL握手过程中,我不断遇到以下错误:

  • 问题内容: 我正在尝试通过Java SSLSockets将安全性应用于简单的聊天应用程序。 我创建了一个自签名的CA,并用它签署了两个证书(全部使用了RSA密钥),一个证书用于服务器,一个证书用于客户端。之后,我将证书导入服务器的密钥库和客户端的密钥库。 我想使用特定的密码,但显然所有受支持的密码均无效。 我为客户提供的代码: 对于服务器: 对不起,如果我的英语有点生锈。 我的操作系统是OS X

  • 问题内容: 我在远程服务器上有一个管理Web应用程序。该应用程序是使用MEAN堆栈编写的,我列出了连接到Web应用程序所需的所有RESTful路由。 我正在编写一个Java客户端应用程序,该应用程序需要从该管理应用程序发送和接收数据。如果我具有服务器的IP地址和REST路由,如何将客户端连接到Web应用程序? 我想我需要提供到服务器和REST API文件的URL连接,然后仅调用诸如和的路由功能。