2016-08-24 24 views
12

Tôi đang cố gắng xác thực chữ ký mà khách hàng tạo ra từ khóa riêng của họ và gửi đến máy chủ.apache mina sshd xác thực chữ ký của khách hàng

Trình xác thực duy nhất tôi có thể tìm thấy trong thư viện có vẻ thích hợp là PublickeyAuthenticator. Xin vui lòng sửa tôi nếu đây là lớp sai để làm điều này.

Tôi hiện có:

this.sshServer.setPublickeyAuthenticator(new PublickeyAuthenticator() { 
       @Override 
       public boolean authenticate(String username, PublicKey key, ServerSession session) { 
        if (username.equals("client")) { 
         //if signature == valid?? 
         return true; 
        } 
       } 
      }); 

Có ai biết nếu mina hỗ trợ xác minh chữ ký và nếu như vậy, làm thế nào nó có thể được thực hiện?

Hiểu biết của tôi là trước tiên tôi phải gán/thêm khóa công khai của người dùng vào máy chủ. Nếu khách hàng đã cung cấp tệp id_rsa.pub, làm cách nào tôi có thể chuyển tệp này vào máy chủ dưới dạng khóa công cộng?

Trả lời

4

Mina SSH có một vài triển khai PublickeyAuthenticator.
Nhìn vào org.apache.sshd.server.config.keys.AuthorizedKeysAuthenticatororg.apache.sshd.server.auth.pubkey.KeySetPublickeyAuthenticator.
Việc triển khai PublickeyAuthenticator chỉ kiểm tra xem khóa công cộng đã cho có được liên kết với người dùng không.
Việc xác minh thực tế chữ ký được xử lý nội bộ vào MINA SSH sau khi xác thực.
AuthorizedKeysAuthenticator chỉ hỗ trợ một người dùng (nó không kiểm tra tên người dùng), nhưng bạn có thể ví dụ chỉ cần trỏ nó vào tệp id_rsa.pub của bạn và nó sẽ hoạt động.

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

Bạn có thể viết riêng bạn PublicKeyAuthenticator để kiểm tra các phím chống lại bản đồ của người sử dụng như sau:

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

} 

Bạn cần phải viết một số mã để cư bản đồ với dữ liệu quan trọng của bạn. AuthorizedKeyEntry có các phương thức tiện ích để thực hiện việc này từ các tệp, luồng đầu vào hoặc chuỗi.
Một ví dụ về đọc từ người dùng có tên ủy quyền tập tin quan trọng:

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

Có cách nào để đăng ký nhiều khóa công khai và xác nhận chúng cho mỗi người dùng? – Hooli

+0

Tôi đã cập nhật câu trả lời bằng ví dụ về cách bạn có thể triển khai câu trả lời cho nhiều người dùng. – Magnus

Các vấn đề liên quan