我正在尝试使用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,并且应该比较每个公钥的模数,这是否足以进行身份验证 - 模数是否一致?当然,如果我只是将我公开的公钥提供给这个功能,那么我会得到认证吗?
答案 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>")
对其进行验证。如果文件中存在指定的公钥,则它将通过身份验证。