实现Https SSL/TLS身份验证的Java库包


SSLContext Kickstart 是一个库,它提供了一个高级 SSLFactory 类,用于配置 http 客户端或服务器以通过 SSL/TLS 进行通信以进行单向身份验证或双向身份验证。通过最小化外部依赖性,它被设计为尽可能轻量级。核心库仅依赖于 SLF4J 日志记录 API。

一个轻量级高级库,用于配置基于 SSLContext 或其他属性(如 TrustManager、KeyManager 或受信任的证书)的 http 客户端或服务器,以通过 SSL TLS 进行通信,以实现 SSLFactory 提供的单向身份验证或双向身份验证。通过示例支持基于 Java、Scala 和 Kotlin 的客户端。

加入依赖:

<dependency>
    <groupId>io.github.hakky54</groupId>
  <artifactId>sslcontext-kickstart</artifactId>
  <version>8.0.0</version>
</dependency>


使用 apache http 客户端的示例配置:

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;

import nl.altindag.ssl.SSLFactory;

public class App {

    public static void main(String[] args) throws IOException, JSONException {
        SSLFactory sslFactory = SSLFactory.builder()
                .withDefaultTrustMaterial()
                .build();

        HttpClient httpClient = HttpClients.custom()
                .setSSLContext(sslFactory.getSslContext())
                .setSSLHostnameVerifier(sslFactory.getHostnameVerifier())
                .build();

        HttpGet request = new HttpGet("https://api.chucknorris.io/jokes/random");

        HttpResponse response = httpClient.execute(request);
        String chuckNorrisJoke = new JSONObject(EntityUtils.toString(response.getEntity())).getString(
"value");

        System.out.println(String.format(
"Received the following status code: %d", response.getStatusLine().getStatusCode()));
        System.out.println(String.format(
"Received the following joke: %s", chuckNorrisJoke));
    }

}


优点:

  • 不再需要低级 SSLContext 配置
  • 不需要有关 SSLContext、TrustManager、TrustManagerFactory、KeyManager、KeyManagerFactory 以及如何创建它的知识。
  • 以上类都将通过提供身份和信任材料来创建
  • 加载多个身份/trustStores/keyManagers/trustManagers
  • 无需重新启动/重新创建 Http 客户端或服务器即可热重载 ssl 材料

定义
  • 标识材料:KeyStore 或 KeyManager,其中包含密钥对,也称为私钥和公钥
  • 信任材料:包含一个或多个证书(也称为公钥)的 KeyStore 或 TrustManager。此 KeyStore 包含受信任证书的列表
  • 单向身份验证(也称为单向 tls、单向 ssl):客户端验证对方证书的 HTTPS 连接
  • 双向身份验证(也称为双向 tls、双向 ssl、相互身份验证):客户端和对方验证证书的 https 连接,也称为相互身份验证


背景
作为一名 Java 开发人员,我为不同类型的客户工作。大多数时候,应用程序需要调用组织内的其他微服务或其他一些 http 服务器。这些请求需要保护,因此需要将 ssl 材料加载到 http 客户端。每个 http 客户端可能需要不同的输入值来启用 https 请求,因此我不能只是将我之前的配置复制粘贴到新项目中。在我看来,由此产生的配置总是冗长、不可重用、难以测试和维护。

作为开发人员,您还需要知道如何将文件正确加载到应用程序中并将其作为 KeyStore 实例使用。因此,您还需要了解如何为您正确创建 KeyManager 和 TrustManager 等 SSLContext。sslcontext-kickstart 库负责根据提供的参数创建 SSLContext 实例,它将为您提供为 Java、Scala 和 Kotlin 配置40 多种不同的 Http 客户端所需的所有 ssl 材料。我希望该库尽可能易于所有开发人员使用,以便在配置 Http 客户端时为他们提供快速启动。请随时提供反馈或功能请求。