使用加密生成的密钥对打开 sh return "bad key type"

openssh return "bad key type" with a crypto generated key pair

我需要在 node js 代码上生成一个 rsa 密钥对,以便在 docker 容器上与 openssh 客户端一起使用它。

我正在使用 generateKeyPair function of crypto to generate keys and parse[Private]Key of sshpk 将密钥从 pem 格式转换为 openssh 格式。

我的函数是:

import { generateKeyPair } from 'crypto';
import sshpk from 'sshpk';

const createSShKeys = () => {
  return new Promise((resolve, reject) => {
    generateKeyPair('rsa', {
      modulusLength: 4096,
      publicKeyEncoding: {
        type: 'pkcs1',
        format: 'pem',
      },
      privateKeyEncoding: {
        type: 'pkcs1',
        format: 'pem',
      },
    }, (error, publicKey, privateKey) => {
      if (error) {
        reject(error);
      } else {
        const publicKeySShEncoded = sshpk
          .parseKey(publicKey, 'pem')
          .toString('ssh');

        const privateKeySShEncoded = sshpk
          .parsePrivateKey(privateKey, 'pem')
          .toBuffer('ssh', {}) // toString('ssh') is documented, but I not find it in code.
          .toString();

        resolve({
          publicKey:  publicKeySShEncoded,
          privateKey: privateKeySShEncoded,
        });
      } 
    });
  });
};

我用私钥创建了一个 docker secret,并在容器内使用它,但后来我得到:

Host key verification failed.

提示 #1:gitlab.com 不是已知主机

经过搜索,我找到了this answer,我在.ssh/known_hosts文件中添加了主机指纹:

ssh-keyscan -H gitlab.com >> ~/.ssh/known_hosts

但什么都没有改变

提示 #2:按键错误

为了测试密钥对,我记录了这个:

const {
  publicKey,
  privateKey,
} = await createSShKeys();

console.log('#PUBLIC KEY');
console.log(publicKey);

console.log('#PRIVATE KEY');
console.log(privateKey);

并且我已经将私钥存储在一个文件中。我尝试用 :

来验证它
$ ssh-keygen -y -t private_key
bad key type

生成的私钥如下

https://pastebin.com/2JC7kz9r

有没有人已经用 cryptosshpk 成功生成了密钥? 或者遇到过类似的问题?

感谢您的帮助! :)

问题确实是主机的密钥,而不是生成的密钥。

但是"clean"方法不起作用:

ssh-keyscan -H gitlab.com >> ~/.ssh/known_hosts

唯一可行的方法是在 /etc/ssh/ssh_config 上附加这些行:

Host *
   StrictHostKeyChecking no
   UserKnownHostsFile=/dev/null

我不知道为什么。 (如果有人有想法?)

不过总算按键没问题了,估计是copy/paste弄错了(笑)

谢谢大家!