apache mina sshd authenticate client signatures

2022-09-04 04:21:56

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

我在图书馆中唯一能找到的听起来合适的身份验证器是 .如果这是错误的课程,请纠正我。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_rsa.pub


答案 1

Mina SSH 有一些 .
查看 和 。
的实现仅检查给定的公钥是否与用户相关联。
身份验证后,签名的实际验证在内部处理到MINA SSH。
唯一支持一个用户(它不检查用户名),但你可以例如将其指向你的文件,它应该工作。PublickeyAuthenticatororg.apache.sshd.server.config.keys.AuthorizedKeysAuthenticatororg.apache.sshd.server.auth.pubkey.KeySetPublickeyAuthenticatorPublickeyAuthenticatorAuthorizedKeysAuthenticatorid_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;
    }

}

您需要编写一些代码来使用关键数据填充映射。 具有用于从文件,输入流或字符串执行此操作的实用程序方法。
读取用户命名的授权密钥文件的示例:AuthorizedKeyEntry

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);
}

答案 2

推荐