使用Apache HttpComponents Client签署AWS HTTP请求

我正在尝试向受IAM访问策略保护的AWS Elasticsearch域发出HTTP请求。 我需要签署这些请求,以便AWS授权这些请求。 我正在使用Jest ,后者又使用Apache HttpComponents Client 。

这似乎是一个常见的用例,我想知道是否有某种类型的库,我可以在Apache HttpComponents客户端上使用它来签署所有请求。

我想我找到了! 🙂

这个项目似乎完全符合我的要求: aws-signing-request-interceptor ,描述为“签署AWS请求的Apache客户端请求拦截器。最初是为了使用Jest客户端支持AWS的Elasticsearch Service而创建的。”

编辑:我分叉项目以满足我的需求(Java 7,临时STS凭证),并且它工作得很好。

以下是使用示例(此处没有STS临时凭证):

String region = "us-east-1"; String service = "es"; String url = "???"; // put the AWS ElasticSearch endpoint here DefaultAWSCredentialsProviderChain awsCredentialsProvider = new DefaultAWSCredentialsProviderChain(); final AWSSigner awsSigner = new AWSSigner(awsCredentialsProvider, region, service, () -> new LocalDateTime(DateTimeZone.UTC)); JestClientFactory factory = new JestClientFactory() { @Override protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) { builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner)); return builder; } }; factory.setHttpClientConfig(new HttpClientConfig.Builder(url) .multiThreaded(true) .build()); JestClient client = factory.getObject(); 

这在Async请求的情况下不起作用。

更新:

忽略我以前的评论。 它也在为异步请求添加拦截器之后工作:

 final AWSSigningRequestInterceptor requestInterceptor = new AWSSigningRequestInterceptor(awsSigner); factory = new JestClientFactory() { @Override protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) { builder.addInterceptorLast(requestInterceptor); return builder; } @Override protected HttpAsyncClientBuilder configureHttpClient(HttpAsyncClientBuilder builder) { builder.addInterceptorLast(requestInterceptor); return builder; } };