Java程序中单个用户无法加载AWS凭证的问题排查
我们团队开发了一款连接AWS S3的Java命令行工具,未指定凭证源,仅通过S3Client.builder().region(region).build()让AWS SDK自动获取凭证。所有用户均在Windows系统的Git Bash终端中运行该工具及aws s3命令,且通过aws configure配置凭证,其他用户使用都正常,但有一位用户在同一终端执行java -jar ...时出现如下错误:
Unable to load credentials from any of the providers in the chain AwsCredentialsProviderChain(credentialsProviders=[SystemPropertyCredentialsProvider(), EnvironmentVariableCredentialsProvider(), WebIdentityTokenCredentialsProvider(), ProfileCredentialsProvider(profileName=default, profileFile=ProfileFile(profilesAndSectionsMap=[])), ContainerCredentialsProvider(), InstanceProfileCredentialsProvider()]) : [SystemPropertyCredentialsProvider(): Unable to load credentials from system settings. Access key must be specified either via environment variable (AWS_ACCESS_KEY_ID) or system property (aws.accessKeyId)., EnvironmentVariableCredentialsProvider(): Unable to load credentials from system settings. Access key must be specified either via environment variable (AWS_ACCESS_KEY_ID) or system property (aws.accessKeyId)., WebIdentityTokenCredentialsProvider(): Either the environment variable AWS_WEB_IDENTITY_TOKEN_FILE or the javaproperty aws.webIdentityTokenFile must be set., ProfileCredentialsProvider(profileName=default, profileFile=ProfileFile(profilesAndSectionsMap=[])): Profile file contained no credentials for profile 'default': ProfileFile(profilesAndSectionsMap=[]), ContainerCredentialsProvider(): Cannot fetch credentials from container - neither AWS_CONTAINER_CREDENTIALS_FULL_URI or AWS_CONTAINER_CREDENTIALS_RELATIVE_URI environment variables are set., InstanceProfileCredentialsProvider(): Failed to load credentials from IMDS.]
经检查,该用户的~/.aws/config和~/.aws/credentials文件内容与其他正常用户完全一致:config配置了[default]区域,credentials配置了[default]的访问密钥和密钥,但为何仅该用户的Java工具出现凭证加载失败问题?
从错误信息能看出,AWS SDK的ProfileCredentialsProvider读取到的配置文件是空的(ProfileFile(profilesAndSectionsMap=[])),说明Java程序要么没找到正确的.aws配置文件路径,要么没有读取权限。结合Windows+Git Bash的环境,具体排查方向如下:
Git Bash的
~路径与Java识别的用户目录不一致
Git Bash里的~指向Windows用户目录C:\Users\<用户名>,但Java在Git Bash中运行时,可能因环境变量问题读取的用户目录不匹配。可以在Git Bash中执行echo $HOME,再让Java程序打印System.getProperty("user.home")对比两者是否一致。如果不一致,手动指定配置文件路径:export AWS_CONFIG_FILE="/c/Users/<你的用户名>/.aws/config" export AWS_SHARED_CREDENTIALS_FILE="/c/Users/<你的用户名>/.aws/credentials"设置完成后再运行
java -jar命令测试。配置文件权限异常
即便文件内容一致,该用户的.aws文件夹或内部文件可能缺乏读取权限。在Windows中右键点击.aws文件夹,选择「属性」-「安全」,确保当前用户拥有读取权限;也可以在Git Bash中执行以下命令修复权限(AWS要求凭证文件必须为600权限,文件夹为700):chmod 600 ~/.aws/credentials chmod 600 ~/.aws/config chmod 700 ~/.awsJava或AWS SDK版本差异
检查该用户的Java版本是否与其他用户一致,不同Java版本处理用户目录的逻辑可能有差异。同时确认工具依赖的AWS SDK版本是否正常,若本地依赖包损坏,可让用户重新下载工具包后重试。Git Bash环境变量被篡改
检查用户的Git Bash启动脚本(如~/.bashrc、~/.bash_profile)是否设置过AWS_PROFILE、AWS_CONFIG_FILE等环境变量,导致SDK读取了错误的配置文件路径。可在Git Bash中执行env | grep AWS查看相关变量,确保无异常配置。
内容的提问来源于stack exchange,提问作者Tom Panning

