1. 程式人生 > >HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”異常

HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”異常

在開發https應用時,你的測試伺服器常常沒有一個(有效的)SSL證書。在你的客戶端連線測試伺服器時,如下的異常會被丟擲:”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”。

1. 程式碼片段

通常,你會像下面那樣來建立HttpClient:

下面我們需要找到一個將TrustManager設定到我們的HttpClient的方法。TrustManager只是被SSL的Socket所使用。Socket通過SocketFactory建立。對於SSL Socket,有一個SSLSocketFactory(

http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/javax/net/ssl/SSLSocketFactory.html)。當建立新的SSLSocketFactory時,你需要傳入SSLContext到它的構造方法中。在SSLContext中,我們將包含我們新建立的TrustManager。

首先我們需要得到一個SSLContext:

TLS是SSL的繼承者,但是它們使用相同的SSLContext。

然後我們需要使用我們上面新建立的TrustManager來初始化該上下文:

最後我們建立SSLSocketFactory:

現在我們仍然需要將SSLSocketFactory註冊到我們的HttpClient上。這是在SchemeRegistry中完成的:

我們註冊了一個新的Scheme,使用協議https,我們新建立的SSLSocketFactory包含了我們的TrustManager,然後我們告訴HttpClienthttps的預設埠是443.

2. 完整示例程式碼

下面的類接收HttpClient作為引數,然後返回一個新的接受任意SSL證書的HttpClient:

package com.vixuan.vplex;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;






public class PostDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//請求格式https://mgmt-server-ip/vplex/clusters/cluster-name
		String url="https://172.16.1.5/vplex/clusters/cluster-1";
		
		List<NameValuePair> params=new ArrayList<NameValuePair>();
		params.add(new BasicNameValuePair("Username","Service"));
		params.add(new BasicNameValuePair("Password","
[email protected]
")); params.add(new BasicNameValuePair("args","cluster status")); String result=sendPost(url,params); System.out.println(result); } public static String sendPost(String url,List<NameValuePair> params){ String result=""; HttpClient client1 = new DefaultHttpClient(); HttpClient client =WebClientDevWrapper.wrapClient(client1); HttpPost httppost = new HttpPost(url); try { // Post請求 // 設定引數 httppost.setEntity(new UrlEncodedFormEntity(params,"UTF-8")); // 傳送請求 HttpResponse httpresponse = client.execute(httppost); HttpEntity entity = httpresponse.getEntity(); result = EntityUtils.toString(entity); System.out.println(result); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; } <span style="color:#ff0000;"> public static class WebClientDevWrapper { public static HttpClient wrapClient(HttpClient base) { try { SSLContext ctx = SSLContext.getInstance("TLS"); X509TrustManager tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } }; ctx.init(null, new TrustManager[] { tm }, null); SSLSocketFactory ssf = new SSLSocketFactory(ctx); ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ClientConnectionManager ccm = base.getConnectionManager(); SchemeRegistry sr = ccm.getSchemeRegistry(); //設定要使用的埠,預設是443 sr.register(new Scheme("https", ssf, 443)); return new DefaultHttpClient(ccm, base.getParams()); } catch (Exception ex) { ex.printStackTrace(); return null; } }</span> } }


相關推薦

HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated異常

在開發https應用時,你的測試伺服器常常沒有一個(有效的)SSL證書。在你的客戶端連線測試伺服器時,如下的異常會被丟擲:”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”。 1. 程

避免HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated異常

在開發https應用時,你的測試伺服器常常沒有一個(有效的)SSL證書。在你的客戶端連線測試伺服器時,如下的異常會被丟擲:”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”。 解決方案:修改建

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 問題解決

最近線下除錯銀聯支付時報錯: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SS

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

Hello,小夥伴好久不見!今天在聯調介面時,遇到一個錯誤,糾結了好久才解決.雖然是粗心引起的,但是也大概明白了引起這個錯誤的來龍去脈,現在整理一下,分享給大家,希望大家在遇到這個類似問題了,不會太無助; 前言 我們來看下問題發生的大背景;這次我們聯

xUtils3 Https請求報錯:javax.net.ssl.SSLPeerUnverifiedException: Hostname ***.****.**not verified,跳過證書檢測

使用xUtils3傳送https請求報錯javax.net.ssl.SSLPeerUnverifiedException: Hostname ***.****.**not verified。 我想不驗證證書直接進行訪問(和http一樣了)。 解決過程:    剛開始設定 (

javax.net.ssl.SSLPeerUnverifiedException: No peer certificate【已解決】

新浪微博 Android SDK 分享時出錯,錯誤資訊:javax.net.ssl.SSLPeerUnverifiedException: No peer certificate com.weibo.net.WeiboException: javax.net.ssl.SSLP

Java HttpClient請求 peer not authenticated異常

HttpClient httpClient=new DefaultHttpClient();   httpClient = HttpsClient.getNewHttpsClient(httpClient);//直接呼叫即可 import java.securit

使用httpclient發起https請求時peer not authenticated,handshake_failure

轉載地址:http://www.cnblogs.com/metoy/p/6238061.html 一、前述   使用httpclient發起https請求時,可能會遇到如下異常: javax.net.ssl.SSLPeerUnverifiedException: pee

Cas單點登入配置SSL時遇到的javax.net.ssl.SSLPeerUnverifiedException問題的解決方法

網上有很多資料介紹如何整合CAS單點登入產品。由於整合CAS需要預先在tomcat中配置SSL,而且還要在客戶端匯入證書,但是許多人按照網上介紹的操作操作卻發現以下問題:儘管配置了SSL後可以訪問也能登入但是在位址列輸入自己的Web應用的連線,自動跳到Cas登入頁面,登入成

https請求報錯解決:javax.net.ssl.SSLException: Not trusted ...

通過https協議請求資料報錯了一下錯誤:javax.net.ssl.SSLException: Not trusted server certificate exception.在國外論壇上找了個解決的方案和大家分享。      我們需要自定義一個繼承org.apache.http.conn.ssl.SS

httpclient 出現peer not authenticated 問題解決 https

轉自:http://jingfeng198.blog.163.com/blog/static/46255920129153312606/ 用下面的程式碼就可以搞定。例子程式碼使用httpclient4.1 import java.security.cert.X509Cer

Android studio 報錯 gradel project sync failed Error:Cause: peer not authenticated

authent post -m -h cal all del erro 文件 在網上找了半天,應該是找不到gradel的路徑,試了網上非常多方法。本人解決例如以下: 在android studio中設置gradle。打開File-> settings->Gr

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

span color create utf ray [] ret res 調用方法 使用HttpClient4.3 調用https出現如下錯誤: javax.net.ssl.SSLHandshakeException: sun.security.validator.V

解決 Java 調用 Azure SDK 證書錯誤 javax.net.ssl.SSLHandshakeException

初始 rac lis pos 開發 nor 過程 slc cnn Azure 作為微軟的公有雲平臺,提供了非常豐富的 SDK 和 API 讓開發人員可以非常方便的調用的各項服務,目前除了自家的 .NET、Java、Python、 nodeJS、Ruby,PHP 等語言都提供

https 調用驗證失敗 peer not authenticated

實現 不同 not org 失敗 下載 efault ltr net https 調用驗證失敗 peer not authenticated 報錯日誌: Caused by: javax.net.ssl.SSLPeerUnverifiedException: pe

SoapUI 請求 https 報 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

  在 E:\ProgramFiles\SmartBear\SoapUI-Pro-5.1.2\bin\SoapUI-Pro-5.1.2.vmoptions 中新增一行程式碼,程式碼如下: -Dsoapui.https.protocols=TLSv1.1,TLSv1.2 新增一行程式碼

javax.net.ssl.SSLHandshakeException: Remote host closed connection during han 報錯解決

javax.net.ssl.SSLHandshakeException: Remote host closed connection during han 北京某銀行信用卡網申開發團隊發來協助請求,內容是這樣的: 內網中應用伺服器要實現某一功能,需要從外網銀聯端獲取一段資

javax.net.ssl.SSLException 解決辦法(踩坑)

剛剛安裝了ubuntu18.04 ,執行/gradlew assembleDebug的時候報異常javax.net.ssl.SSLException     在網上找找別人的踩坑指南,找了很久很久,終於在stackoverflow上的一行小字找到了解決方法

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 痛苦解決之旅

  上週另外一專案組的同事找到我說,遇到一個問題很棘手兩天了還沒解決掉,報錯如下: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake at su

解決javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path

參考部落格:https://blog.csdn.net/u014256984/article/details/73330573 1、新建一個空的InstallCert.java 檔案,用notepad++開啟 2、複製下面的程式碼到檔案裡面,儲存 /*  * Copyright