Java 四种安全加载 P12 证书的方案
文章目录从文件绝对路径加载【最常用、最稳定】从 resources 目录加载从 byte [] 字节数组加载从 Base64 字符串加载如果文章对您有用请关注点赞加收藏博主会持续更新相关的专栏笔记从文件绝对路径加载【最常用、最稳定】适合服务器上有明确文件路径、或者配置中心指定路径。publicstaticCloseableHttpClientcreateSSLHttpClient(Stringp12Path,Stringp12Password)throwsException{KeyStorekeyStoreKeyStore.getInstance(PKCS12);// 直接从文件系统读取不使用 ClassPathResourcetry(FileInputStreamfisnewFileInputStream(p12Path)){keyStore.load(fis,p12Password.toCharArray());}SSLContextsslContextSSLContextBuilder.create().loadKeyMaterial(keyStore,p12Password.toCharArray()).loadTrustMaterial(null,(chain,authType)-true).build();SSLConnectionSocketFactoryfactorynewSSLConnectionSocketFactory(sslContext);returnHttpClients.custom().setSSLSocketFactory(factory).build();}从 resources 目录加载publicstaticCloseableHttpClientcreateSSLHttpClient(Stringp12Path,Stringp12Password)throwsException{log.info(-- 开始加载证书);// 加载 P12 密钥库KeyStorekeyStoreKeyStore.getInstance(PKCS12);ClassPathResourceresourcenewClassPathResource(p12Path);if(!resource.exists()){thrownewRuntimeException(-- 文件未找到: p12Path);}// 1. 获取证书输入流try(InputStreaminputStreamresource.getInputStream()){// 2. 直接加载不要读取、不要打印、不要关闭keyStore.load(inputStream,p12Password.toCharArray());}// try-with-resources 在这里安全关闭流加载完才关闭// 配置 SSL 上下文SSLContextsslContextSSLContextBuilder.create().loadKeyMaterial(keyStore,p12Password.toCharArray(),(aliases,socket)-aliases.keySet().iterator().next()).loadTrustMaterial(null,(chain,authType)-true)// 信任所有证书更安全.build();SSLConnectionSocketFactorysocketFactorynewSSLConnectionSocketFactory(sslContext,newString[]{TLSv1.2,TLSv1.3},null,SSLConnectionSocketFactory.getDefaultHostnameVerifier());returnHttpClients.custom().setSSLSocketFactory(socketFactory).build();}只 load 一次不打印、不读取、不关闭最安全。从 byte [] 字节数组加载适合证书存在配置中心【Nacos/Apollo】证书是 Base64 字符串想绝对避免流关闭问题// 先把证书转成 byte[]ClassPathResourceresourcenewClassPathResource(p12Path);byte[]certBytesFiles.readAllBytes(Paths.get(resource.getURI()));// 从 byte[] 加载绝对不会流关闭try(ByteArrayInputStreambaisnewByteArrayInputStream(certBytes)){keyStore.load(bais,p12Password.toCharArray());}从 Base64 字符串加载适合证书不能放文件放在配置中心【Nacos/Apollo/YML】// 证书 Base64 字符串StringcertBase64MIIKDjCCAvagAwIBAgIU...;byte[]certBytesBase64.getDecoder().decode(certBase64);try(ByteArrayInputStreambaisnewByteArrayInputStream(certBytes)){keyStore.load(bais,p12Password.toCharArray());}优点没有文件、没有路径、不怕流关闭。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2452783.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!