Mac下.NET6 C#远程Windows EC2实例从S3下载文件遇授权问题
解决Mac下.NET6远程连接Windows Server2012 EC2执行S3下载的权限与加密错误问题
问题场景
Mac环境下用.NET6编写C#程序,通过PowerShell远程连接AWS EC2(Windows Server2012,PowerShell5.x)执行aws s3 cp命令下载文件:
- 开启
NoEncryption = true时,触发Authorization failed错误 - 移除该配置后,触发MI_RESULT_FAILED错误
- 相同代码在局域网Windows10机器上可正常运行
解决方案
1. 配置EC2实例的WinRM HTTPS监听(解决MI_RESULT_FAILED)
Windows Server2012默认WinRM不允许无加密HTTP连接,且HTTPS监听未默认配置,需手动设置:
- 以管理员身份登录EC2实例,打开PowerShell执行以下命令:
# 生成自签名证书,替换为实例公网IP/域名 $cert = New-SelfSignedCertificate -DnsName "your-ec2-public-ip" -CertStoreLocation "Cert:\LocalMachine\My" # 创建WinRM HTTPS监听 winrm create winrm/config/Listener?Address=*+Transport=HTTPS "@{Hostname=`"your-ec2-public-ip`"; CertificateThumbprint=`"$($cert.Thumbprint)`"}" # 开放防火墙5986端口 New-NetFirewallRule -Name "WinRM-HTTPS-In" -DisplayName "WinRM HTTPS" -Enabled True -Protocol TCP -LocalPort 5986 -Action Allow
2. 调整C#代码的WinRM连接参数
修改WSManConnectionInfo配置,改用HTTPS协议并适配自签名证书:
var connectionInfo = new WSManConnectionInfo { ComputerName = host, Credential = credential, Scheme = WSManConnectionInfo.HttpsScheme, Port = 5986, // WinRM HTTPS默认端口 AuthenticationMechanism = AuthenticationMechanism.Negotiate, // 跳过自签名证书的CA与CN校验(生产环境建议使用可信CA签发的证书) SkipCACheck = true, SkipCNCheck = true };
3. 确保EC2实例的S3访问权限
- 优先给EC2实例绑定带S3只读权限的IAM角色,这样
aws s3 cp可直接通过实例角色认证,无需在实例内配置密钥,避免权限错误。 - 若必须使用访问密钥,需在EC2实例上通过
aws configure完成CLI配置,或在命令中显式指定:string s3DownloadCommand = $"aws s3 cp s3://{bucket}{s3path} {localPath} --access-key YOUR_ACCESS_KEY --secret-key YOUR_SECRET_KEY";
4. 验证远程用户权限
确保远程连接使用的用户(user参数)在EC2实例上具备:
- 执行
aws命令的权限 - 写入目标路径
localPath的权限 - 建议使用管理员权限用户进行测试
验证
修改代码并完成EC2配置后,重新执行程序,即可正常远程连接并完成S3文件下载。
内容的提问来源于stack exchange,提问作者Vinay Pandey
相关产品推荐
相关产品推荐

