Hoo*_*oli 13 java apache-mina sshd java-security
我正在尝试验证客户端从其私钥生成的签名并发送到服务器.
我能在图书馆找到唯一合适的认证者就是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;
}
}
});
Run Code Online (Sandbox Code Playgroud)
有谁知道mina是否支持签名验证,如果支持,如何实施?
我的理解是,我首先必须将用户公钥分配/添加到服务器.如果客户端提供了id_rsa.pub文件,我该如何将此文件作为公钥添加到服务器?
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"));
Run Code Online (Sandbox Code Playgroud)
您可以编写自己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;
}
}
Run Code Online (Sandbox Code Playgroud)
您需要编写一些代码来使用您的密钥数据填充地图.
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1156 次 |
| 最近记录: |