首页 文章

使用java消耗REST API - SSLHandshakeException

提问于
浏览
0

我正在尝试使用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();

}

}
              }

当我运行代码时,它向我显示了这个异常:

javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:在sun.security.ssl.Alerts.getSSLException中找不到与IP地址ip匹配的主题备用名称(未知来源)

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

在sun.security.ssl.Handshaker.fatalSE(未知来源)

在sun.security.ssl.Handshaker.fatalSE(未知来源)

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

在sun.security.ssl.ClientHandshaker.processMessage(未知来源)

在sun.security.ssl.Handshaker.processLoop(未知来源)

在sun.security.ssl.Handshaker.process_record(未知来源)

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

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

在sun.security.ssl.SSLSocketImpl.startHandshake(未知来源)

在sun.security.ssl.SSLSocketImpl.startHandshake(未知来源)

在sun.net.www.protocol.https.HttpsClient.afterConnect(未知来源)

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:在sun.security.util.HostnameChecker.matchIP(未知来源)中找不到与IP地址相匹配的主题备用名称

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个

我也试过了球衣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));

它显示了这个错误:

线程“main”中的异常javax.ws.rs.ProcessingException:javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:在org.glassfish.jersey.client.internal中找不到与IP地址ip匹配的主题备用名称.HttpUrlConnector.apply(HttpUrlConnector.java:284)

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

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

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

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

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

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

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

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

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

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

任何的想法? pleaseeee,这是我的毕业设计:(

1 回答

  • 0
    javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException
    

    通常这些类型的异常是由于证书的证书验证问题而发生的,请按照以下步骤操作:1 . 从浏览器下载证书并将其添加到jre文件夹中的 cacerts 文件2.我们需要添加一些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方法中调用此方法 . 希望对你有帮助 :)

相关问题