2016-08-24 11 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