gpt4 book ai didi

java - apache mina sshd 验证客户端签名

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:46 26 4
gpt4 key购买 nike

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

我能在库中找到的唯一听起来合适的身份 validator 是 PublickeyAuthenticator。如果这是错误的类(class),请纠正我。

我目前有:

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 文件,我该如何将此文件作为公钥添加到服务器?

最佳答案

Mina SSH 有一些 PublickeyAuthenticator 的实现。
看着org.apache.sshd.server.config.keys.AuthorizedKeysAuthenticatororg.apache.sshd.server.auth.pubkey.KeySetPublickeyAuthenticator.
PublickeyAuthenticator 的实现仅检查给定的公钥是否与用户关联。
签名的实际验证在身份验证后在内部处理到 MINA SSH。
AuthorizedKeysAuthenticator 仅支持一个用户(它不检查用户名),但是您可以将它指向您的 id_rsa.pub 文件,它应该可以工作。

this.sshServer.setPublickeyAuthenticator(
new AuthorizedKeysAuthenticator(new File("id_rsa.pub"));

您可以编写自己的 PublicKeyAuthenticator 来根据用户 map 检查 key ,如下所示:

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 。AuthorizedKeyEntry 具有从文件、输入流或字符串执行此操作的实用方法。
从用户命名的授权 key 文件中读取的示例:

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

关于java - apache mina sshd 验证客户端签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39122927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com