[英]JDK 11. javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
[英]javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated in jdk7 but not in jdk8
HttpClient =new DefaultHttpClient();
HttpPost post = new HttpPost("https://myulr/token");
post.addHeader("Content-Type", "application/x-www-form-urlencoded");
List<BasicNameValuePair> parametersBody = new ArrayList<BasicNameValuePair>();
parametersBody.add(new BasicNameValuePair("client_id","my-client-id"));
parametersBody.add(new BasicNameValuePair("client_secret","my-secret-key"));
parametersBody.add(new BasicNameValuePair("scope","my-scope"));
parametersBody.add(new BasicNameValuePair("grant_type","client_credentials"));
try{
post.setEntity(new UrlEncodedFormEntity(parametersBody));
HttpResponse httpResponse = httpClient.execute(post);
int code = httpResponse.getStatusLine().getStatusCode();
System.out.println("Code::::: "+code);
String result=EntityUtils.toString(httpResponse.getEntity());
System.out.println("Result: "+result);
}catch(Exception e){
e.printStackTrace();
}
這段代碼在JDK8中正確執行,但是如果我嘗試在JDK7中執行它,則會拋出javax.net.ssl.SSLPeerUnverifiedException:對等未驗證異常。 我試圖用谷歌搜索這個問題。 我發現我們可以編寫X509TrustManager和X509HostnameVerifier。 我也嘗試了這些實現,但仍然沒有用。 請建議我如何在JDK7中執行它。 同樣,如果我使用X509TrustManager和X509HostnameVerifier執行代碼,則會收到“ java.net.SocketException:Connection reset”
我剛剛對此進行了研究,並想添加一下-對TLS 1.2的支持首次出現在JDK 7中。出於兼容性的原因,默認情況下在服務器套接字上啟用了TLS,但在客戶端上禁用了該功能。 為了更改它,我編寫了以下代碼,它對我有用:
HttpClient base = new DefaultHttpClient();
SSLContext ctx = SSLContext.getInstance("TLSv1.2");
X509TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
X509HostnameVerifier verifier = new X509HostnameVerifier() {
@Override
public void verify(String string, X509Certificate xc) throws SSLException {
}
@Override
public void verify(String string, String[] strings, String[] strings1) throws SSLException {
}
@Override
public boolean verify(String string, SSLSession ssls) {
return true;
}
@Override
public void verify(String arg0, SSLSocket arg1) throws IOException {
}
};
ctx.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory ssf = new
SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ssf.setHostnameVerifier(verifier);
ClientConnectionManager ccm = base.getConnectionManager();
SchemeRegistry sr = ccm.getSchemeRegistry();
sr.register(new Scheme("https", ssf, 443));
httpClient = new DefaultHttpClient(ccm, base.getParams());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.