2016-08-24 175 views
12

我试图验证客户端从其私钥生成并发送到服务器的签名。apache mina sshd验证客户端签名

我在图书馆找到的唯一一个认证人听起来合适的是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; 
        } 
       } 
      }); 

有谁知道米娜支持签名验证,如果是这样,怎么能实现?

我的理解是,我首先必须分配/添加用户公钥到服务器。如果客户提供了一个id_rsa.pub文件,那么我怎么能把这个文件作为公钥添加到服务器?

回答

4

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,检查键对地图的用户,就像这样:

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

是否有注册多个公共密钥和验证他们每个用户的方式? – Hooli

+0

我已经通过一个例子说明了如何为多个用户实现它。 – Magnus