网站开发进度源码,网页设计与网站开发试卷,番禺做网站哪家专业,石家庄网页设计师培训班最近项目上开发了一个rest api#xff0c;放在了一台linux服务器上#xff0c;并且启用了https连接#xff1b;在另一台服务器上写了一个功能需要去调用linux机器上的api。 项目里面自己封装了一个HttpsClient的类#xff0c;用来发送https请求#xff0c;并且在里面重写了…最近项目上开发了一个rest api放在了一台linux服务器上并且启用了https连接在另一台服务器上写了一个功能需要去调用linux机器上的api。 项目里面自己封装了一个HttpsClient的类用来发送https请求并且在里面重写了TrustManager方法体都为空这样就不会对server的证书以及client的证书进行校验能够顺利的从另一台服务器调用linux上的api。
/*** * A default TrustManager which will trust any certificate.**/
private static class DefaultTrustManager implements X509TrustManager {Overridepublic void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}Overridepublic void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}
}但是上面的这种方法是不安全的对server的证书以没有进行校验就不能确定和自己进行通信的server到底是不是真正的那个我想要通信的server有可能是一个中间的黑客部署的server这样就会导致数据的安全问题。 于是需要在另一台这端对linux server端的证书进行认证确认server是不是真正想要的server。 解决方案: 在linux服务器上使用openssl生成了一个自签名的ssl证书(如何生成ssl证书)用这个证书来启用linux server的https证书并且将这个证书放到另一台的某个目录然后另一台系统上的java代码在发送请求的时候将证书放到keyStore里面这样java就能对这个证书进行认证。 下面是ChatGPT给出的示例代码: 读取指定的每一个路径上的证书放到JKS格式的keyStore里面然后用这个keyStore初始化TrustManager最后用TrustManager创建sslcontext。 private SSLContext getSSLContext(JSONArray certificates, String protocol) throws Exception {SSLContext sc null;if (certificates ! null) {String certFileName null;try {// Create a temp keystore object to be used to make the HTTPS callKeyStore keystore KeyStore.getInstance(JKS);keystore.load(null,null);for (int i0; i certificates.size(); i) {certFileName (String)certificates.get(i);try (BufferedInputStream bis FileFactory.newBufferedInputStream((String)certificates.get(i))) {CertificateFactory cf CertificateFactory.getInstance(X.509);Certificate cert cf.generateCertificate(bis);keystore.setCertificateEntry(cert i, cert);}}TrustManagerFactory tmf TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(keystore);// Create and initialize the SSL context that will be used by the HTTPS connectionsc SSLContext.getInstance(protocol);sc.init(null, tmf.getTrustManagers(), null);} catch(IOException e) {throw e;} catch(CertificateException e) {throw e;} catch(KeyStoreException | NoSuchAlgorithmException | KeyManagementException e) {throw e;}}return sc;}更多关于https的文章请参考我的https专栏:https://blog.csdn.net/u011069294/category_11083017.html?spm1001.2014.3001.5482