带硬件令牌密钥的 SSLSocket

SSLSocket with hardware token key

我有兴趣使用客户端令牌为 SSL/TLS 执行客户端证书身份验证,但客户端私钥驻留在(非 PKCS11 可访问的)硬件令牌上。本来想更换key manager,但是无法return从token中取出私钥,所以考虑修改底层的SSLSocket和相关的类来实现我的目的。

其中 Java 类 是用于建立 TLS 会话的私钥,以便我可以覆盖该功能?还有其他建议吗?

我最终通过创建一个新的提供者来做到这一点。我的提供商注册了以下内容:

  • 实现PrivateKey的硬件设备抽象;我叫它 "Token".
  • 扩展 KeyStoreSpi 的自定义密钥库。密钥库知道如何从令牌中枚举证书和别名。
  • 知道如何使用令牌执行签名操作的自定义签名对象。我只需要为我的 class.
  • 实现 RSA/SHA 签名算法的一个子集
  • 扩展 SSLSocketFactory 的自定义套接字工厂。我这样做是为了设置首选密码套件。

提供商将我的令牌注册为 PKCS11 设备,以避免在客户端身份验证期间出现默认密码提示(我对令牌 PIN 使用自定义密码提示)。我将我的供应商放在供应商列表的顶部,创建了一个新的 SSLContext 并设置了 SSLSocketFactory,最终建立了连接。

-Djavax.net.debug=true 在客户端和服务器上一直是我的朋友。