2017-02-14 128 views
3

我運行下面的代碼Java的8,收到致命警報:handshake_failure:javax.net.ssl.SSLHandshakeException

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.nio.charset.Charset; 

import org.apache.commons.codec.binary.Base64; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.StringEntity; 
import org.apache.http.impl.client.HttpClientBuilder; 
import org.json.JSONObject; 

public class HttpPostReq { 
public static void main(String args[]) { 
    String restUrl = "https://connect-testing.urbanairship.com/api/events/"; 
    String username = "sample_connection"; 
    String password = "sample_connection"; 
    JSONObject jsonToSend = new JSONObject(); 
    String jsonData = jsonToSend.toString(); 
    HttpPostReq httpPostReq = new HttpPostReq(); 
    System.out.println(jsonData); 
    HttpPost httpPost = httpPostReq.createConnectivity(restUrl, username, password); 
    System.out.println(httpPost); 
    httpPostReq.executeReq(jsonData, httpPost); 
} 

HttpPost createConnectivity(String restUrl, String username, String password) { 
    HttpPost post = new HttpPost(restUrl); 
    String auth = new StringBuffer(username).append(":").append(password).toString(); 
    byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII"))); 
    String authHeader = "Basic " + new String(encodedAuth); 
    System.out.println(authHeader); 
    post.setHeader("Authorization", authHeader); 
    post.setHeader("Content-Type", "application/x-www-form-urlencoded"); 
    post.setHeader("Accept", "application/vnd.urbanairship+x-ndjson; version=3;"); 
    post.setHeader("X-Stream", "true"); 
    return post; 
} 

void executeReq(String jsonData, HttpPost httpPost) { 
    try { 
     executeHttpRequest(jsonData, httpPost); 
    } catch (UnsupportedEncodingException e) { 
     System.out.println("error while encoding api url : " + e); 
    } catch (IOException e) { 
     System.out.println("ioException occured while sending http request : " + e); 
    } catch (Exception e) { 
     System.out.println("exception occured while sending http request : " + e); 
    } finally { 

    } 
} 

void executeHttpRequest(String jsonData, HttpPost httpPost) throws UnsupportedEncodingException, IOException { 
    HttpResponse response = null; 
    String line = ""; 
    StringBuffer result = new StringBuffer(); 
    httpPost.setEntity(new StringEntity(jsonData)); 
    HttpClient client = HttpClientBuilder.create().build(); 
    response = client.execute(httpPost); 
    System.out.println("Post parameters : " + jsonData); 
    System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
    while ((line = reader.readLine()) != null) { 
     result.append(line); 
    } 
    System.out.println(result.toString()); 
} 
} 

獲取作爲例外,

IOException異常在發送HTTP請求發生: javax.net.ssl.SSLHandshakeException:收到致命警報: handshake_failure。

我能夠通過捲曲連接,

curl -vv https://connect-testing.urbanairship.com/api/events/ \ 
--compressed \ 
-u "sample_connection:sample_connection" \ 
-H "Accept: application/vnd.urbanairship+x-ndjson; version=3;" \ 
-d "{}" 

誰能告訴我什麼是錯我的Java代碼?

依賴性爲如下,

<dependencies> 
    <dependency> 
     <groupId>org.json</groupId> 
     <artifactId>json</artifactId> 
     <version>20090211</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>4.5.2</version> 
    </dependency> 

回答

3

可能是TLS協議版本或由客戶端和服務器使用加密套件之間的兼容性問題。

+0

任何解決方案? – shiv

+0

您可以嘗試通過TLSv1.2強制使用TLSv1或TLSv1.1。找到[本頁](http://www.oracle.com/technetwork/java/javase/documentation/cve-2014-3566-2342133.html),其中建議使用'java.lang.System.setProperty(「https.protocols 「,」TLSv1,TLSv1.1,TLSv1.2「);' – mwstc013

相關問題