首页 > 解决方案 > 使用 PKCS#11 令牌从 Java 程序内部连接到 sshd 服务器

问题描述

主要问题:

当服务器强制执行公钥身份验证机制并且密钥对应存储在 PKCS#11 令牌中时,是否有任何方法可以从 Java 程序内部连接到 sshd 服务器?

解释:

我可以使用以下命令从控制台连接到服务器:

ssh -I myPkcs11TokenLib.so myUserName@myHostName

所以,似乎一切都在 sshd 上正确配置。

jsch当服务器配置为使用基于密码的身份验证时,我还能够在 Java 程序中建立连接。示例代码:

JSch jsch = new JSch();
Session sshSession = jsch.getSession("myUserName", "myHostName", 22);
sshSession.setPassword("myPass");
sshSession.setConfig("StrictHostKeyChecking", "no");
sshSession.connect(5000);

此外,我知道jschpublic void addIdentity(String name, byte[] prvkey, byte[] pubkey, byte[] passphrase)公钥认证的方法。

但是,我不知道如何从我的 PKCS#11 令牌中读取密钥对并将其转换为上述方法可接受的适当格式。

即使我从令牌中检索私钥并将其适当地传递给addIdentity方法,这也不完全是基于令牌的身份验证中的意图。据我所知,ssh -I命令不会从令牌中提取私钥。相反,它将公共加密功能(例如 RSA 签名)重定向到令牌。相反,addIdentity方法需要普通的私钥。因此,在某些情况下它不够安全。(私钥直接泄漏到 RAM 中!)

简而言之,我想知道是否有一种方法可以在 Java 程序中进行模拟ssh -I以建立与 sshd 服务器的连接?

标签: javasshjschpkcs#11

解决方案


推荐阅读