带有硬件令牌密钥的SSLSocket

时间:2015-07-02 16:41:18

标签: java smartcard

我对使用客户端令牌对SSL / TLS执行客户端证书身份验证感兴趣,但客户端私钥驻留在(非PKCS11可访问的)硬件令牌上。我原本想替换密钥管理器,但是我无法从令牌中返回私钥,因此我正在考虑修改底层SSLSocket和相关类来实现我的目标。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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