我是java
和sshd
的新手。现在,我正在尝试使用Apache mina sshd
来实现ssh连接的公钥身份验证。
检查库之后,我发现了setPublickeyAuthenticator
接口。检查描述后,接口setPublickeyAuthenticator
不会使用公共密钥和私有密钥执行安全握手。它的作用是根据其公共密钥确定是否允许特定用户在服务器上使用。
问题1:我想确认是否在setPublickeyAuthenticator#authenticate
函数中,我们只能将参数中的PublicKey
键与~/.ssh/authorized_keys
中的公钥进行比较, 对?
问题2:检查后,可能会有几种密钥格式,RSAPublicKey
格式Begin Public Key ... End Public Key
,ssh2
公钥格式Begin SSH2 Public Key ... End SSH2 Public Key
,open-ssh
键ssh-rsa ...
。 authorized_keys
是open-ssh
格式,setPublickeyAuthenticator#authenticate(Public key)
中的参数公钥格式呢?
问题3:如果问题1 是,则如何调用setPublickeyAuthenticator#authenticate
以进行身份验证?如何测试它是否有效?
问题4: UserAuthPublicKey#doAuth
函数使用公钥和私钥执行安全握手,似乎实现就足够了,我们不需要再次覆盖它,我们只需要修改setPublickeyAuthenticator#authenticate
,对吧?
问题5: sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File(sshDir, "key.ser")));
我真的不知道该函数的含义是什么以及如何使用它?
现在我的代码如下:
public class SSHServer {
protected SshServer sshd = SshServer.setUpDefaultServer();
public SSHServer(int port, final Device device) throws Exception {
sshd.setPort(port);
List<NamedFactory<Command>> ssFactories = new ArrayList<NamedFactory<Command>>();
sshd.setSubsystemFactories(ssFactories);
sshd.setCommandFactory(new CommandFactory());
sshd.setShellFactory(new Factory<Command>());
this.setup();
}
public void setup() {
String sshDir = ".ssh";
authorizedKeysFile = new File(sshDir, ".ssh/authorized_keys");
//private key file
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File(sshDir, "key.ser")));
sshd.setPublickeyAuthenticator(new PublickeyAuthenticator() {
public boolean authenticate(String username, PublicKey key, ServerSession session) {
//the parameter key is the openssh key type
String s1 = "";
if(key instanceof RSAPublicKey) {
s1 = new String(encode((RSAPublicKey)key));
}
String s2 = new
String(Base64.decodeBase64(knownKey.getBytes()));//ssh2 public key type
return s1.equals(s2);
}
public static void main(String[] args) throws Exception {
SSHServer server = new SSHServer(2222, dev);
server.start();
System.out.println("Press enter to quit");
System.in.read();
server.stop();
}