apache MINA SFTP PublickeyAuthenticator

 
 
 
Сообщения:20
Всем привет
Искал решение пару дней:
Возможно пригодится

SSHD сама не генерирует сертификаты для С# клиента поэтому я использовал JSCH библиотеку
генератор ключей

запуск SSHD сервера на java
sshd = SshServer.setUpDefaultServer();
        sshd.setPort(parseInt(port));
        sshd.setHost(host);
        sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(Paths.get(dir_cer_server)));

        sshd.setPublickeyAuthenticator((username, key, session) ->
        {
            if(key instanceof RSAPublicKey)
            {

                try
                {
                    RSAPublicKey test3 = read.readKey(dir_cer_server);
                    logger.debug(test3.getModulus());
                    logger.debug(((RSAPublicKey) key).getModulus());

                    if(key.hashCode() == test3.hashCode())
                    {
                        logger.debug("Авторизация Пройдена ");
                        return true;
                    }

                }
                catch (IOException e)
                {
                    logger.debug(e.getMessage());
                    e.printStackTrace();
                    return false;
               }
               catch (Exception e)
                {
                    logger.debug(e.getMessage());
                    e.printStackTrace();
                    return false;
                }


            }
            return false; //Doesn't handle other key types currently.
        });

Здесь из клиента с# получаем ключ RSA public key, а функция readFiles читает файл .pub из java и преобразует его в RSA public key. Дальше можно сравнивать и что-то с ним делать.

функция readFiles

public  RSAPublicKey readKey(String key) throws Exception
    {
        // key = "ssh-rsa <myBase64key> <email>"
        byte[] encKey = Base64.decodeBase64(key.split(" ")[1].getBytes());
        DataInputStream dis = new DataInputStream(new ByteArrayInputStream(encKey));

        byte[] header = readElement(dis);
        String pubKeyFormat = new String(header);
        if (!pubKeyFormat.equals("ssh-rsa"))
            throw new RuntimeException("Unsupported format");

        byte[] publicExponent = readElement(dis);
        byte[] modulus = readElement(dis);

        KeySpec spec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(publicExponent));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(spec);

        return pubKey;
    }

    private  byte[] readElement(DataInput dis) throws IOException
    {
        int len = dis.readInt();
        byte[] buf = new byte[len];
        dis.readFully(buf);
        return buf;
    }


Генератор ключей для c# клиента

  Path priv = Paths.get(empty_private_key);
            Path pub = Paths.get(empty_public_key);
            //logger.debug("certification > создаваемый файл "+root_disk_centification+variable.getSlash()+username+variable.getSlash()+username);
            JSch jsch = new JSch();
            int key_size = 2048;

            try
            {
                String comment = "usage:  KeyGen rsa output_keyfile comment";
                Integer type = KeyPair.RSA;
                KeyPair kpair = KeyPair.genKeyPair(jsch, type , key_size);


                kpair.writePrivateKey(new FileOutputStream(priv.toFile()) , passphrase.getBytes());
                kpair.writePublicKey(new FileOutputStream(pub.toFile()) , comment);
                kpair.dispose();
                check = true;
            }
            catch(Exception e)
            {
                logger.debug(e.getMessage());
            }
        }
Изменен:05 дек 2018 11:11
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет