簡體   English   中英

apache mina sshd驗證客戶端簽名

[英]apache mina sshd authenticate client signatures

我正在嘗試驗證客戶端從其私鑰生成的簽名並發送到服務器。

我能在庫中找到唯一合適的認證者是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;
                    }
                }
            });

有誰知道mina是否支持簽名驗證,如果支持,如何實施?

我的理解是,我首先必須將用戶公鑰分配/添加到服務器。 如果客戶端提供了id_rsa.pub文件,我該如何將此文件作為公鑰添加到服務器?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM