WebService系列之Axis Https(SSL)證書校驗錯誤處理方法
WebService系列之Axis Https(SSL)證照校驗錯誤處理方法
最近在用Axis呼叫https的介面,丟擲異常:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
異常原因是ssl證照校驗失敗,因為自己網站是http的,對方公司是https的介面,所以證照校驗失敗,處理方法是在網上找的一個不錯的方法,思路是重寫一個不驗證證照的SocketFactory,Axis預設SocketFactory,會對server端的證照進行驗證,導致驗證異常
package com.common.utils.web;
import org.apache.axis.components.net.BooleanHolder;
import org.apache.axis.components.net.JSSESocketFactory;
import org.apache.axis.components.net.SecureSocketFactory;
import javax.net.ssl.*;
import java.io.IOException;
import java.net.Socket;
import java.security.KeyStore;
import java.util.Hashtable;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* <pre>
* Axis自定義JSSESocketFactory
* </pre>
*
* <pre>
* @author mazq
* 修改記錄
* 修改後版本: 修改人: 修改日期: 2020/12/12 14:44 修改內容:
* </pre>
*/
public class WSTLSSocketSecureFactory extends JSSESocketFactory implements SecureSocketFactory {
public WSTLSSocketSecureFactory(Hashtable attributes) {
super(attributes);
}
@Override
public Socket create(String host, int port, StringBuffer otherHeaders, BooleanHolder useFullURL)
throws Exception{
Socket s = super.create(host, port, otherHeaders, useFullURL);
((SSLSocket)s).setEnabledProtocols(new String[] {"SSLv2Hello", "SSLv3", "TLSv1"});
return s;
}
@Override
protected void initFactory() throws IOException {
SSLContext context = null;
try {
context = getContext();
} catch (Exception e) {
e.printStackTrace();
}
this.sslFactory = context.getSocketFactory();
}
protected SSLContext getContext() throws Exception {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
// Trust always
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
// Trust always
}
}
};
// Install the all-trusting trust manager
SSLContext sslContext = SSLContext.getInstance("SSL");
// Create empty HostnameVerifier
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
};
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
return sslContext;
}
}
客戶端呼叫時設定setProperty:
// 支援Https Webservice介面呼叫
AxisProperties.setProperty("axis.socketSecureFactory", WSTLSSocketSecureFactory.class.getName());
注意點,不同版本jdk對TLS驗證是有差別的:oracle官網部落格Diagnosing TLS, SSL, and HTTPS列出了差別
補充知識點:
- SSL:SSL 是“Secure Sockets Layer”的縮寫,是在上世紀90年代中期,由網景公司設計的
- TLS:IETF 就在那年把 SSL 標準化。標準化之後的名稱改為 TLS(是“Transport Layer Security”的縮寫),中文叫做“傳輸層安全協議”
相關文章
- SSL證書生成,完成HTTPS驗證HTTP
- SSL證書7大常見錯誤及解決方法!
- Java呼叫使用SSL/HTTPS協議來傳輸的axis webservice服務JavaHTTP協議Web
- 使用Moya庫,進行https證書校驗HTTP
- Jmeter進行HTTPS介面壓測及SSL證書驗證JMeterHTTP
- HTTPS的SSL證書配置HTTP
- SSL證書七大常見錯誤及解決方法
- SSL證書格式轉換 – HTTPS SSL 教程HTTP
- SSL證書轉PEM格式 – HTTPS SSL 教程HTTP
- javax.net.ssl.SSLEXception錯誤處理JavaException
- 伺服器配置ssl證書支援蘋果ATS方法 – HTTPS SSL 教程伺服器蘋果HTTP
- 本地簽發ssl證書(https)HTTP
- 高防上傳HTTPS證書出現“引數格式錯誤”報錯的解決辦法 – HTTPS SSL 教程HTTP
- SSL證書安裝指引教程 – HTTPS SSL 教程HTTP
- SSL證書申請問題 – HTTPS SSL 教程HTTP
- Tomcat 安裝SSL證書 – HTTPS SSL 教程TomcatHTTP
- SSL證書校驗失敗的可能原因是什麼?
- 關於SSL證書之證書鏈
- SSL證書稽核失敗的常見原因及處理方法(綜合篇)
- SSL證書報錯型別及解決方法型別
- javascript之處理Ajax錯誤JavaScript
- SSL證書是如何驗證的?驗證方式推薦
- [系列] Gin框架 - 自定義錯誤處理框架
- namespace mismatch require錯誤處理方法namespaceUI
- nginx配置SSL證書實現https服務NginxHTTP
- 怎麼給網站配置SSL證書(https)網站HTTP
- 在IIS下部署SSL證書實現HTTPSHTTP
- 詳解SSL證書系列(8)瞭解HTTPS及和HTTP的區別HTTP
- 安裝SSL證書的好處
- Golang通脈之錯誤處理Golang
- iOS 對 HTTPS 證書鏈的驗證iOSHTTP
- curl 設定https 不驗證證書HTTP
- 大多數 SSL 證書籤發錯誤的主要原因是軟體錯誤
- Axis2呼叫WebServiceWeb
- OV SSL證書有哪些功能?網站安裝OV SSL證書的好處網站
- PHP系列(七)PHP錯誤異常處理PHP
- 錯誤處理
- SSL證書常見的錯誤和解決辦法是什麼?