使用Node.js ssh2包连接EC2实例执行命令时认证失败求助
使用ssh2连接EC2实例出现认证失败的解决建议
问题场景
尝试通过Node.js的ssh2包连接EC2实例并执行命令,代码如下:
const { Client } = require('ssh2') const fs = require('fs') const CONFIG = { hostname: '...', port: 22, username: 'ubuntu', privateKeyPath: './EC2.pem', passphrase: null, } const COMMANDS = ['ls'] function executeRemoteCommands() { return new Promise((resolve, reject) => { const outputs = [] const client = new Client() client .on('ready', () => { let remaining = COMMANDS.length for (const cmd of COMMANDS) { client.exec(cmd, (err, stream) => { if (err) reject(err) stream .on('close', (code, signal) => { remaining-- if (remaining === 0) { client.end() resolve(outputs) } }) .on('data', (data) => { outputs.push(data.toString()) }) .stderr.on('data', (data) => { reject(data.toString()) }) }) } }) .on('error', (err) => { reject(err) }) .connect({ host: CONFIG.hostname, port: CONFIG.port, username: CONFIG.username, privateKey: fs.readFileSync(CONFIG.privateKeyPath), passphrase: CONFIG.passphrase, }) }) } executeRemoteCommands().then((outputs) => { console.log(outputs) })
报错信息
运行代码后出现认证失败错误:
function\node_modules\ssh2\lib\client.js:865 const err = new Error('All configured authentication methods failed'); ^ Error: All configured authentication methods failed at doNextAuth (function\node_modules\ssh2\lib\client.js:865:21) at tryNextAuth (function\node_modules\ssh2\lib\client.js:1082:7) at USERAUTH_FAILURE (function\node_modules\ssh2\lib\client.js:430:11) at 51 (function\node_modules\ssh2\lib\protocol\handlers.misc.js:408:16) at Protocol.onPayload (function\node_modules\ssh2\lib\protocol\Protocol.js:2052:10) at AESGCMDecipherNative.decrypt (function\node_modules\ssh2\lib\protocol\crypto.js:987:26) at Protocol.parsePacket [as _parse] (function\node_modules\ssh2\lib\protocol\Protocol.js:2021:25) at Protocol.parse (function\node_modules\ssh2\lib\protocol\Protocol.js:306:16) at Socket.<anonymous> (function\node_modules\ssh2\lib\client.js:775:21) at Socket.emit (node:events:513:28) { level: 'client-authentication' }
已排查内容
- EC2.pem密钥有效,长期正常使用
- 密钥路径正确,否则会出现ENOENT错误
- EC2实例已开放22端口
- 尝试过
ubuntu@<IP地址>、root等用户名,均无效 - 不清楚需要使用何种passphrase
解决建议
严格设置密钥文件权限
SSH要求私钥文件权限必须为600(仅当前用户可读可写),否则会拒绝使用。Linux/macOS执行:chmod 600 ./EC2.pemWindows系统需右键文件→属性→安全→高级,删除除当前用户外所有用户的权限,仅保留当前用户的完全控制权限。
验证密钥是否需要passphrase
用本地SSH命令测试连接:ssh -i ./EC2.pem ubuntu@<你的EC2公网IP>如果命令提示输入密码,说明你的pem密钥设置了passphrase,将该密码填入代码的
CONFIG.passphrase字段;如果无密码提示,确保passphrase为null即可。确认EC2实例的正确用户名
不同AMI的默认用户名不同:- Ubuntu AMI:
ubuntu - Amazon Linux 2/2023:
ec2-user - CentOS/RHEL:
centos或ec2-user - Debian:
admin或debian
可通过EC2控制台实例详情的AMI ID,查询对应镜像的官方默认用户名。
- Ubuntu AMI:
检查安全组与网络ACL规则
除了开放22端口入站规则,还要确保安全组允许你的本地公网IP访问;网络ACL需同时允许22端口的入站和出站流量。添加调试日志排查细节
在代码中添加调试日志,查看认证过程的具体错误:// 在client.connect之前添加 client.on('debug', (msg) => { console.log('SSH调试信息:', msg); });运行后可看到认证步骤的详细输出,定位是密钥格式、用户名还是其他环节出错。
验证密钥格式完整性
查看pem文件内容,确保开头为-----BEGIN RSA PRIVATE KEY-----或-----BEGIN OPENSSH PRIVATE KEY-----,结尾对应结束标识,文件未被篡改或损坏。若为OPENSSH格式,确保Node.js版本在12及以上(ssh2对该格式的支持需较新版本)。
内容的提问来源于stack exchange,提问作者Nikolay Dyankov
相关产品推荐
相关产品推荐

