Как я могу использовать ключ из AndroidKeyStore вместо пароля для аутентификации моего клиентского соединения SSH?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу использовать ключ из AndroidKeyStore вместо пароля для аутентификации моего клиентского соединения SSH?

Сообщение Anonymous »

Я не могу войти на сервер, используя аутентификацию по ключу из моего клиентского приложения Android. Я могу войти на сервер из своего приложения, используя аутентификацию по паролю. Я могу войти на сервер, используя аутентификацию по ключу от других клиентов в моей сети.

Код: Выделить всё

protected String sshConnect() {

String stdoutString = null;
String alias = "KEYPAIRTEST";

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.Entry entry = keyStore.getEntry(alias, null);
PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
PublicKey publicKey = keyStore.getCertificate(alias).getPublicKey();
KeyPair keyPair = new KeyPair(publicKey, privateKey);

// create a client instance
try (SshClient client = SshClient.setUpDefaultClient()) {

client.setServerKeyVerifier(AcceptAllServerKeyVerifier.INSTANCE); // should be default
client.addPublicKeyIdentity(keyPair);
//client.addPasswordIdentity(this.password);
client.start();

// connection and authentication
try (ClientSession session = client.connect(username, host, port).verify(TimeUnit.SECONDS.toMillis(defaultTimeoutSeconds)).getSession()) {

session.auth().verify(TimeUnit.SECONDS.toMillis(defaultTimeoutSeconds));

// create a channel to communicate
ClientChannel channel = session.createExecChannel(this.command);

ByteArrayOutputStream stdoutStream = new ByteArrayOutputStream();
channel.setOut(stdoutStream);

// open channel
channel.open().verify(5, TimeUnit.SECONDS);

// close channel
channel.waitFor(EnumSet.of(ClientChannelEvent.CLOSED),
TimeUnit.SECONDS.toMillis(5));

// output after converting to string type
stdoutString = stdoutStream.toString();

} catch (Exception e) {
Log.d(TAG, "sshConnect(): client.connect(): Exception: " + e);
}
} catch (Exception e) {
Log.d(TAG, "sshConnect(): client.start(): Exception: " + e);
}
return stdoutString;
}
Я получил строковую версию открытого ключа со следующим...

Код: Выделить всё

keyStore.getCertificate(alias).getPublicKey();
byte[] encodedPublicKey = publicKey.getEncoded();
String b64PublicKey = Base64.getEncoder().encodeToString(encodedPublicKey);
Я вставил этот открытый ключ на сервер в ~/.ssh/authorized_keys.

Код: Выделить всё

ssh-rsa MlsdfijANBgkqhkiG9w0BAQE..
Я тоже пробовал..

Код: Выделить всё

rsa-sha2-256 MlsdfijANBgkqhkiG9w0BAQE..
Ключи были сгенерированы и сохранены на клиенте в хранилище ключей Android с использованием следующего ..

Код: Выделить всё

KeyPairGenerator kpg = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");

kpg.initialize(new KeyGenParameterSpec.Builder(
alias,
KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setKeySize(2048)
.build());

kpg.generateKeyPair();
Я пытался использовать ключи, но вход не удался, в журналах клиента появились следующие предупреждения.

Код: Выделить всё

W  60 [AsyncTask #1] INFO org.apache.sshd.common.io.DefaultIoServiceFactoryFactory - No detected/configured IoServiceFactoryFactory using Nio2ServiceFactoryFactory

WARN org.apache.sshd.client.keyverifier.AcceptAllServerKeyVerifier - Server at /192.168.13.4:22 presented unverified EC key: SHA256:nNMe+ZsasdILlkGIZfcLwl41ZvVTzTaEOeA
и, наконец, исключение..

Код: Выделить всё

Exception: org.apache.sshd.common.SshException: No more authentication methods available
Что я делаю не так?
Изменить: я пытался предоставить KeyPairProvider, но безуспешно..

Код: Выделить всё

try (SshClient client = SshClient.setUpDefaultClient()) {

try {
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.Entry entry = keyStore.getEntry(alias, null);
PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
PublicKey publicKey = keyStore.getCertificate(alias).getPublicKey();
final KeyPair keyPair = new KeyPair(publicKey, privateKey);

KeyPairProvider keyPairProvider = new KeyPairProvider() {
@Override
public Iterable loadKeys(SessionContext session) {
return Collections.singletonList(keyPair);
}
};

client.setKeyIdentityProvider(keyPairProvider);
Я также добавил цели шифрования и дешифрования, но безуспешно..

Код: Выделить всё

KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY | KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT
Я читал документацию по авторизованным ключам, и вот поддерживаемые типы ключей.

Код: Выделить всё

sk-ecdsa-sha2-nistp256@openssh.com
ecdsa-sha2-nistp256
ecdsa-sha2-nistp384
ecdsa-sha2-nistp521
sk-ssh-ed25519@openssh.com
ssh-ed25519
ssh-dss
ssh-rsa
Может ли «AndroidKeyStore» создать любой из этих типов ключей? Что делает ключ RSA ключом ssh-rsa?

Подробнее здесь: https://stackoverflow.com/questions/784 ... cate-my-ss
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»