Java apache mina sshd验证客户端签名

Java apache mina sshd验证客户端签名,java,sshd,java-security,apache-mina,Java,Sshd,Java Security,Apache Mina,我正在尝试验证客户端从其私钥生成并发送到服务器的签名 我能在库中找到的唯一听起来合适的验证器是PublickeyAuthenticator。请纠正我,如果这是错误的类做这件事 我目前有: this.sshServer.setPublickeyAuthenticator(new PublickeyAuthenticator() { @Override public boolean authenticate(String usernam

我正在尝试验证客户端从其私钥生成并发送到服务器的签名

我能在库中找到的唯一听起来合适的验证器是
PublickeyAuthenticator
。请纠正我,如果这是错误的类做这件事

我目前有:

this.sshServer.setPublickeyAuthenticator(new PublickeyAuthenticator() {
                @Override
                public boolean authenticate(String username, PublicKey key, ServerSession session) {
                    if (username.equals("client")) {
                         //if signature == valid??
                         return true;
                    }
                }
            });
有人知道mina是否支持签名验证吗?如果支持,如何实现


我的理解是,我首先必须向服务器分配/添加用户公钥。如果客户端提供了一个
id\u rsa.pub
文件,如何将该文件作为公钥添加到服务器?

Mina SSH提供了一些
PublickeyAuthenticator
的实现
看看
org.apache.sshd.server.config.keys.AuthorizedKeysAuthenticator
org.apache.sshd.server.auth.pubkey.KeySetPublickeyAuthenticator

PublickeyAuthenticator
的实现仅检查给定公钥是否与用户关联。
签名的实际验证在身份验证后由MINA SSH内部处理。
AuthorizedKeysAuthenticator
只支持一个用户(它不检查用户名),但是您可以将它指向您的
id\u rsa.pub
文件,它应该可以工作

this.sshServer.setPublickeyAuthenticator(
    new AuthorizedKeysAuthenticator(new File("id_rsa.pub"));
您可以编写自己的
PublicKeyAuthenticator
,根据用户地图检查密钥,如下所示:

public class UserKeySetPublickeyAuthenticator implements PublickeyAuthenticator {
    private final Map<String, Collection<? extends PublicKey>> userToKeySet;

    public UserKeySetPublickeyAuthenticator(Map<String, Collection<? extends PublicKey>> userToKeySet) {
        this.userToKeySet = userToKeySet;
    }

    @Override
    public boolean authenticate(String username, PublicKey key, ServerSession session) {
        return KeyUtils.findMatchingKey(key, userToKeySet.getOrDefault(username, Collections.emptyList())) != null;
    }

}

有没有办法注册多个公钥并对每个用户进行验证?我已经用一个示例更新了答案,说明了如何为多个用户实现它。
Map<String, List<PublicKey>> userKeysMap = new HashMap<>();
List<String> users = Arrays.asList("Jim", "Sally", "Bob");
for(String user : users){
    List<PublicKey> usersKeys = new ArrayList<>();
    for(AuthorizedKeyEntry ake : AuthorizedKeyEntry.readAuthorizedKeys(new File(user + "_authorized_keys"))){
        PublicKey publicKey = ake.resolvePublicKey(PublicKeyEntryResolver.IGNORING);
        if(publicKey != null){
            usersKeys.add(publicKey);
        }
    }
    userKeysMap.put(user, usersKeys);
}