使用PKCS#11令牌从Java程序内部连接到sshd服务器

使用PKCS#11令牌从Java程序内部连接到sshd服务器,java,ssh,jsch,pkcs#11,Java,Ssh,Jsch,Pkcs#11,主要问题: 当服务器强制执行公钥身份验证机制并且密钥对应存储在PKCS#11令牌中时,有没有办法从Java程序内部连接到sshd服务器 说明: 我可以使用以下命令从控制台连接到服务器: ssh -I myPkcs11TokenLib.so myUserName@myHostName 所以,似乎在sshd上所有配置都是正确的 当服务器配置为使用基于密码的身份验证时,我还能够使用jsch在Java程序内部建立连接。示例代码: JSch jsch = new JSch(); Session sshS

主要问题:

当服务器强制执行公钥身份验证机制并且密钥对应存储在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);
此外,我知道
jsch
具有用于公钥身份验证的方法
public void additionity(字符串名称、字节[]prvkey、字节[]pubkey、字节[]passphrase)

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

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

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