2016-08-24 22 views
12

İstemcilerin kendi özel anahtarlarından oluşturdukları ve sunucuya gönderdikleri bir imzanın kimliğini doğrulamaya çalışıyorum.apache mina sshd istemci imzalarını doğrular

Uygun bulduğu kitaplıkta bulabildiğim tek doğrulayıcı, PublickeyAuthenticator idi. Bunu yapmak için yanlış sınıfsa lütfen beni düzeltin.

Şu anda var:

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 imza doğrulaması destekler ve eğer öyleyse, nasıl uygulanabilir olmadığını biliyor mu?

Anlayışım, öncelikle kullanıcıya genel anahtarını sunucuya atamam/eklemem gerektiğidir. İstemci bir id_rsa.pub dosyası sağladıysa, bu dosyayı sunucuya ortak anahtar olarak ekleme hakkında nasıl gidebilirim?

cevap

4

Mina SSH, PublickeyAuthenticator'un birkaç uygulaması vardır.
org.apache.sshd.server.config.keys.AuthorizedKeysAuthenticator ve org.apache.sshd.server.auth.pubkey.KeySetPublickeyAuthenticator'a bakın.
PublickeyAuthenticator numaralı uygulamalar yalnızca verilen genel anahtarın kullanıcıyla ilişkili olduğunu kontrol eder.
İmzanın gerçek doğrulaması, kimlik doğrulamasından sonra MINA SSH'ye dahili olarak işlenir.
AuthorizedKeysAuthenticator yalnızca bir kullanıcıyı desteklemektedir (kullanıcı adını kontrol etmemektedir), ancak örneğin id_rsa.pub dosyanızda işaret edebilir ve çalışmalıdır.

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

Öyle gibi kullanıcılar haritasında karşı anahtarlarını denetler kendi PublicKeyAuthenticator yazabiliriz:

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

} 

Sen anahtar verilerle harita doldurmak için bazı kod yazmak gerekir. AuthorizedKeyEntry, bunu dosyalar, girişler veya dizelerden yapmak için yardımcı programlara sahiptir.
kullanıcıdan adlı yetkili anahtar dosyaları okuma örneği:

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

birden genel anahtarları kayıt ve kullanıcı başına onları doğrulamak için bir yolu var mı? – Hooli

+0

Yanıtı, birden fazla kullanıcı için nasıl uygulayabileceğinizle ilgili bir örnekle güncelledim. – Magnus