apache sshd公钥认证

时间:2013-03-12 21:20:10

标签: java authorization public-key sshd mina

我正在尝试使用apache mina sshd设置ssh服务器。我想使用公钥认证,基本上我想知道如何实现

package org.apache.sshd.server;
import java.security.PublicKey;
import org.apache.sshd.server.session.ServerSession;

public interface PublickeyAuthenticator {

boolean authenticate(String username, PublicKey key, ServerSession session);

}

我看到传递的是另一个公钥。所以我假设您应该将param中给出的公钥与服务器所具有的公钥进行比较。但我不知道该怎么做。

我发现的一件事是this实施。这似乎毫无意义,因为它似乎比较了公钥的模数与自身。假设这个实现有一个bug,并且应该比较每个公钥的模数,这是否足以进行身份​​验证 - 模数是否一致?当然,如果我只是将我公开的公钥提供给这个功能,那么我会得到认证吗?

2 个答案:

答案 0 :(得分:8)

我想我在org.apache.sshd.server.auth.UserAuthPublicKey#auth的来源中找到了答案。这个类用密钥进行实际的auth。我觉得困惑的是方法的名称 - authenticate()。真正发生的事情如下:

  • 服务器要求提供客户端的公钥

  • 公钥传递给PublickeyAuthenticator#authenticate

  • 您应该在authenticate()中执行的操作是检查这是您要允许的公钥

  • 如果authenticate()返回true,则UserAuthPublicKey#auth将检查邮件是否已使用私钥签名。如果有,则验证已经过验证。

答案 1 :(得分:1)

下面的代码是如何使用Apache MINA SSHD执行公钥身份验证的示例,该示例代码将创建一个SFTP服务器。

import java.io.File;
import java.io.IOException;
import java.util.Collections;

@Service
public class MySftpServer {

    private Log log = LogFactory.getLog(MySftpServer.class);

    @PostConstruct
    public void startServer() throws IOException {
        start();
    }

    private void start() throws IOException {
        SshServer sshd = SshServer.setUpDefaultServer();
        sshd.setHost("localhost");
        sshd.setPort(2222);
        sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("host.ser")));
        sshd.setSubsystemFactories(Collections.singletonList(new SftpSubsystemFactory()));
        sshd.setPasswordAuthenticator((username, password, session) -> username.equals("test") && password.equals("password"));
        sshd.setPublickeyAuthenticator(new AuthorizedKeysAuthenticator(new File("<Location of authorized_keys file>")));
        sshd.start();
        log.info("SFTP server started");
    }
}

类似于@northshorefiend在回答中提到的内容,在这种情况下,AuthorizedKeysAuthenticator接受传递给服务器的公钥,并根据authorized_keys文件new AuthorizedKeysAuthenticator(new File("<Location of authorized_keys file>")对其进行验证。如果文件中存在指定的公钥,则它将通过身份验证。

您可以阅读有关此herehere

的更多详细信息