SSL 之 http只用crt格式证书完成SSL单向认证通信

SSL 之 http只用crt格式证书完成SSL单向认证通信背景 远程调用第三方服务时,之前都是双向认证,服务器提供jks格式的keystore证书,客户端配置好即可。 今天遇到个奇葩需求&#xff

背景

以前远程调用第三方服务时,采用的是双向认证,服务器提供jks格式的keystore证书,客户端可以配置。

今天,服务器仅提供根公钥证书(root.crt)。这是第三方合法证书,在SSL 期间验证服务器发送的证书时需要单向身份验证。握手时只给出crt公钥。我真的同意。我别无选择,只能自己上网摸索。下面是适合我的情况的代码练习。测试没有什么问题。供你参考。

代码

//该类实现证书验证

导入javax.net.ssl.X509TrustManager。

导入java.security.*。

导入java.security.cert.CertificateException。

导入java.security.cert.X509Certificate。

公共类CustomTrustManager 实现X509TrustManager {

私有静态最终记录器日志=LoggerFactory.getLogger(CustomTrustManager.class);

私有最终X509 证书rootCert;

公共CustomTrustManager(X509Certificate rootCert) {

this.rootCert=根证书;

}

@覆盖

公共无效checkClientTrusted(X509Certificate []链,字符串authType)抛出CertificateException {

//根据你的要求实现检查逻辑

}

@覆盖

公共无效checkServerTrusted(X509Certificate []链,字符串authType)抛出CertificateException {

布尔值找到=false;

最终公钥publicKey=rootCert.getPublicKey();

for (X509Certificate cert : 链) {

尝试{

证书.验证(公钥);

发现=真;

休息;

catch (NoSuchAlgorithmException | SignatureException | InvalidKeyException | }

NoSuchProviderException e) {

log.error(\’客户端证书验证失败\’, e);

}

}

如果(!找到){

throw new CertificateException(\’在服务器的证书链中找不到受信任的证书。\’);

}

}

@覆盖

公共X509Certificate[] getAcceptedIssuers() {

返回新的X509Certificate[]{}。

}

}

测试代码

@测试

void testCerts() 抛出NoSuchAlgorithmException、KeyManagementException、IOException {

//Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

X509证书;

//加载根证书

尝试(InputStream inputStream=new FileInputStream(\’D:\\\\certs\\\\root-new.crt\’)){

CertificateFactory 证书工厂=CertificateFactory.getInstance(\’X.509\’);

证书=(X509Certificate)certificatefactory.generateCertificate(inputStream);

catch (IOException | java.security.cert.CertificateException e) {

抛出一个新的RuntimeException(e)。

}

X509证书rootCert=证书;

//创建SSL 上下文并将所有证书设置为信任。

SSLContext sslContext=SSLContext.getInstance(\’TLS\’);

sslContext.init(null, new TrustManager[]{new CustomTrustManager(rootCert)}, null);

//获取HttpsURLConnection 实例

HttpsURLConnection 连接=(HttpsURLConnection) new URL(\’https://URI\’).openConnection();

连接.setSSLSocketFactory(sslContext.getSocketFactory());

连接.connect();

System.out.println(\’2222222222\’);

断开();

System.out.println(\’11111111111\’);

}

就这样!

以上关于#SSL http的信息仅使用crt格式的证书来完成SSL单向认证通信。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92266.html

(0)
CSDN's avatarCSDN
上一篇 2024年6月26日 下午11:38
下一篇 2024年6月26日 下午11:38

相关推荐

  • 新手数据库入门指南

    此文是《10周入门数据分析》系列的第5篇。想了解学习路线,可以先行阅读“10周计划”公中号上已更新到第11篇,详情可见文末。上周更新了两篇Excel学习,有读者

    2024年9月1日
    0
  • 网站规划的步骤,网站规划与建设的规则有哪些

    网站建设项目:如何选择与规划 1. 随着互联网的普及,越来越多的企业开始进入网络市场,网站建设项目已经成为企业进入网络世界的重要手段。那么应该如何选择网站建设项目呢?本文从多方面阐…

    2024年4月25日
    0
  • 运维安全风险

    由于运维人员的水平参差不齐,还有就是是人就有犯错的时候,所以经常会出现不必要的失误导致的安全隐患,所以这里就未大家盘点一下经常出现的由于运维人员是失误造成的安全

    2024年9月23日
    0
  • IP SSL证书快速申请教程

    在互联网安全领域中,SSL证书是比较普遍的传输数据加密方式之一。SSL证书通过建立加密通道,确保客户端与服务器之间传输的数据不被第三方窃取或篡改。而大多数SSL

    2024年9月1日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注