使用AWS Session Manager+SSO通过VSCode Remote-SSH连EC2遇公钥权限拒绝
问题分析与解决方法
为什么会触发公钥错误?
虽然AWS Session Manager代理了SSH连接,但本地SSH客户端仍会默认尝试用本地密钥对做身份验证。只有当Session Manager的代理连接完全建立,且EC2上的SSM Agent正确处理SSH流量时,才会跳过本地密钥验证。如果代理命令执行失败(比如语法错误),SSH会降级到常规公钥认证流程,而你未提供对应密钥,就会出现Permission denied (publickey)。
第一步:修复ProxyCommand语法错误
你的~/.ssh/config里存在明显的语法问题:--profile ExProfile--document-name中,ExProfile与--document-name之间缺少空格,导致AWS CLI无法识别--document-name参数,进而SSM会话启动失败。
修正后的配置:
Host i-0dXXXXXXXXXX User ubuntu ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws sso login --profile ExProfile; aws ssm start-session --target %h --profile ExProfile --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
第二步:确认EC2实例的前置条件
- SSM Agent正常运行:Ubuntu 18.04+官方AMI默认预装SSM Agent,可通过
sudo systemctl status amazon-ssm-agent验证状态,未安装则手动部署。 - IAM权限配置正确:你的SSO关联角色需包含
AmazonSSMFullAccess(或最小权限集:ssm:StartSession、ssm:DescribeSessions、ssm:TerminateSession,以及ec2:DescribeInstances)。 - 实例IAM角色权限:EC2实例的IAM配置文件需附加
AmazonSSMManagedInstanceCore策略,确保SSM Agent能与AWS服务通信。
第三步:强制SSH跳过本地密钥验证(推荐)
为避免SSH降级到公钥认证,可在ssh config中添加IdentitiesOnly yes,强制SSH仅依赖Session Manager代理完成身份验证:
Host i-0dXXXXXXXXXX User ubuntu IdentitiesOnly yes ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws sso login --profile ExProfile; aws ssm start-session --target %h --profile ExProfile --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
第四步:单独验证SSM会话可用性
先在PowerShell中手动执行以下命令,确认SSM会话能正常启动:
aws sso login --profile ExProfile aws ssm start-session --target i-0dXXXXXXXXXX --profile ExProfile --document-name AWS-StartSSHSession --parameters 'portNumber=22'
如果这一步能成功建立会话,说明SSO与SSM配置无问题,再尝试VSCode Remote-SSH连接即可。
内容的提问来源于stack exchange,提问作者JPcodes
相关产品推荐
相关产品推荐

