33800 Docs

← Retour

Fix SSH setup-key : generation de cles cassee

Date : 15/02/2026 Status : EN ATTENTE Projet : connectors-api Fichier : src/services/ssh.ts

Probleme

L'endpoint POST /api/ssh/setup-key genere des cles SSH inutilisables :

  1. Cle publique invalide : convertToOpenSSH() met du SPKI DER brut en format ssh-rsa (le format SSH wire est different du format SPKI)
  2. Cle privee incompatible : generateKeyPairSync('rsa', { privateKeyEncoding: { type: 'pkcs8' } }) genere du PKCS#8, que ssh2 ne parse pas → erreur "Cannot parse privateKey: Unsupported key format"
  3. Perte du mot de passe : setup-key supprime le password de l'instance (password_encrypted: undefined), donc si la cle est cassee, plus aucune methode d'auth ne fonctionne

Impact : toute instance SSH avec PasswordAuthentication no (ex: nginx) est inaccessible apres setup-key.

Solution

Utiliser ssh2.utils.generateKeyPairSync('ed25519') — la lib SSH elle-meme genere les cles dans le format exact qu'elle consomme.

Teste dans le container :

Changements dans src/services/ssh.ts

1. Methode setupAutoKey (lignes ~976-1028)

Avant :

const { generateKeyPairSync } = await import('crypto');
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
  modulusLength: 4096,
  publicKeyEncoding: { type: 'spki', format: 'pem' },
  privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
});
const sshPublicKey = this.convertToOpenSSH(publicKey, `${config.username}@connectors-hub`);

Apres :

import { utils as sshUtils } from 'ssh2';
// ...
const keys = sshUtils.generateKeyPairSync('ed25519', {
  comment: `${config.username}@connectors-hub`
});
const sshPublicKey = keys.public.trim();
const privateKey = keys.private;

2. Conserver le mot de passe comme fallback

Avant :

const newConfig: SSHConfig = {
  ...config,
  auth_method: 'auto_key',
  private_key_encrypted: encrypt(privateKey),
  password_encrypted: undefined,  // ← SUPPRIME le password
  key_installed: true
};

Apres :

const newConfig: SSHConfig = {
  ...config,
  auth_method: 'auto_key',
  private_key_encrypted: encrypt(privateKey),
  // password_encrypted conserve — fallback si la cle ne marche pas
  key_installed: true
};

3. Supprimer convertToOpenSSH (lignes ~1033-1043)

Methode inutile et cassee. Plus utilisee.

4. Apres deploiement

Fichiers modifies

Fichier Action
src/services/ssh.ts Fix setupAutoKey + supprimer convertToOpenSSH

Risques