Mina SSH有几个实现PublickeyAuthenticator
。
看 org.apache.sshd.server.config.keys.AuthorizedKeysAuthenticator
和 org.apache.sshd.server.auth.pubkey.KeySetPublickeyAuthenticator
。
PublickeyAuthenticator
的实现只检查给定的公钥是否与用户关联。
验证后,对签名的实际验证在内部处理为MINA SSH。
AuthorizedKeysAuthenticator
只支持一个用户(它不检查用户名),但你可以例如将它指向你的id_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);
}
是否有注册多个公共密钥和验证他们每个用户的方式? – Hooli
我已经通过一个例子说明了如何为多个用户实现它。 – Magnus