尝试在Java中实现ssh连接的setPublickeyAuthenticator并对其进行测试

时间:2018-07-16 03:14:36

标签: java sshd

我是javasshd的新手。现在,我正在尝试使用Apache mina sshd来实现ssh连接的公钥身份验证。
检查库之后,我发现了setPublickeyAuthenticator接口。检查描述后,接口setPublickeyAuthenticator不会使用公共密钥和私有密钥执行安全握手。它的作用是根据其公共密钥确定是否允许特定用户在服务器上使用。

问题1:我想确认是否在setPublickeyAuthenticator#authenticate函数中,我们只能将参数中的PublicKey键与~/.ssh/authorized_keys中的公钥进行比较, 对?

问题2:检查后,可能会有几种密钥格式,RSAPublicKey格式Begin Public Key ... End Public Keyssh2公钥格式Begin SSH2 Public Key ... End SSH2 Public Keyopen-sshssh-rsa ...authorized_keysopen-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();
}

0 个答案:

没有答案