JavaFX客户端配置SSL对接Spring Boot SSL安全REST API
解决Unirest客户端访问Spring Boot SSL REST API的问题
我太懂你现在的糟心处境了——服务器端SSL配置明明正常跑起来了,结果JavaFX里的Unirest客户端死活连不上,核心原因就是客户端默认不信任自签名(或者不在JVM默认信任库)的服务器证书,下面我给你一步步捋清楚怎么搞定:
第一步:导出服务器的SSL证书
首先得把Spring Boot用的keystore.jks里的证书导出来,让客户端能识别它。打开终端执行这条命令(记得替换成你自己的参数):
keytool -export -alias your-key-alias -file server-cert.cer -keystore path/to/keystore.jks
your-key-alias:生成keystore时设置的别名(没指定的话默认是mykey)path/to/keystore.jks:你的keystore文件路径(比如src/main/resources/keystore.jks)
输入keystore密码后,就能得到server-cert.cer证书文件,把它放到JavaFX项目的resources目录下。
第二步:配置Unirest信任该证书
接下来要让Unirest用自定义的SSL上下文来信任这个证书,推荐用第一种方式(不修改全局JVM设置,只针对Unirest生效):
方式一:自定义SSLContext配置Unirest
直接在代码里加载证书、创建信任库,再绑定到Unirest配置中:
import kong.unirest.Unirest; import javax.net.ssl.*; import java.io.InputStream; import java.security.KeyStore; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; // 先配置Unirest的SSL规则 public void setupUnirestSSL() { try { // 加载客户端资源目录里的服务器证书 InputStream certStream = getClass().getResourceAsStream("/server-cert.cer"); CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); X509Certificate serverCert = (X509Certificate) certFactory.generateCertificate(certStream); // 初始化空信任库,把服务器证书加进去 KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null); // 初始化空库 trustStore.setCertificateEntry("spring-server-cert", serverCert); // 创建信任管理器工厂 TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); // 生成自定义SSL上下文 SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); // 把这个SSL上下文绑定给Unirest Unirest.config().sslContext(sslContext); } catch (Exception e) { e.printStackTrace(); // 这里可以加自己的异常处理逻辑 } } // 发送请求的示例代码 public void sendSecureApiRequest() { // 先执行SSL配置 setupUnirestSSL(); try { HttpResponse<String> response = Unirest.get("https://your-server-domain:8443/api/your-endpoint") .basicAuth("your-username", "your-password") // 配置Basic Auth .asString(); // 处理响应 if (response.isSuccess()) { System.out.println("请求成功:" + response.getBody()); } else { System.out.println("请求失败,状态码:" + response.getStatus()); } } catch (Exception e) { e.printStackTrace(); } }
方式二:导入证书到JVM全局信任库(不推荐)
如果想让整个JVM都信任这个证书,可以用keytool把证书导入到JRE的cacerts信任库:
keytool -import -alias spring-server-cert -file server-cert.cer -keystore $JAVA_HOME/jre/lib/security/cacerts
默认密码是changeit,导入后Unirest不用额外配置,但这种方式适合单机场景,分布式部署的话每台机器都要改,太麻烦。
额外要注意的点
- 确保请求URL用的是
https而非http,端口是Spring Boot配置的SSL端口(默认8443) - 检查Basic Auth的用户名密码是否正确,Unirest的
basicAuth方法会自动生成Authorization头 - 如果服务器要求双向SSL认证(服务器也要验证客户端证书),那还要在SSLContext初始化时添加KeyManager,加载客户端的keystore文件
内容的提问来源于stack exchange,提问作者Mohammed Housseyn Taleb
相关产品推荐
相关产品推荐

