aws / aws-sdk-go

AWS SDK for the Go programming language.

Home Page:http://aws.amazon.com/sdk-for-go/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

InvalidSignatureException when using custom httpclient

sarahzinger opened this issue · comments

Describe the bug

When we try to create a session with a custom httpclient like so:

sess, err := e.sessions.GetSession(awsds.SessionConfig{
  HTTPClient: Somecustomhttpclient
})

we will intermittently get back InvalidSignatureException for requests that are otherwise valid. We hit the same problem when modifying sess.Config.HTTPClient.Transport but otherwise using the sdk's default httpclient.

Expected Behavior

I would expect to be able to override the HTTPClient without hitting auth errors (or would at least expect to reliably hit the same auth error).

Current Behavior

Intermittently getting back the response:

InvalidSignatureException: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

despite having the same auth each time.

Using the default httpclient makes these intermittent errors go away.

Reproduction Steps

It's very inconsistent but our source code can be found here:
https://github.com/grafana/grafana/blob/main/pkg/tsdb/cloudwatch/cloudwatch.go#L260-L287

You can see where we've commented out the custom HTTPClient after several customers ran into the same errors and where we've attempted to overwrite just Transport for a new feature which unfortunately also seems to be returning the same signature exception errors.

I wonder if this is somehow related to #4496

Possible Solution

Identify what the default httpclient does that is unique, and find a way to build that on top of a custom httpclient?

Additional Information/Context

No response

SDK version used

v1.44.325

Environment details (Version of Go (go version)? OS name and version, etc.)

go version 1.21

@sarahzinger -- Is your custom HTTP client implementation modifying the request in any way? (it's not immediately clear to me from the linked code)

Modifying the request within the HTTP client itself is liable to invalidate the request signature.

This issue has not received a response in 1 week. If you want to keep this issue open, please just leave a comment below and auto-close will be canceled.

Hi @lucix-aws . We send the request via a SOCKs proxy, but the request is not modified in any way. As the code shows, however, we do replace the HTTPClient's transport to use our Transport which contains the socks dialer.

I wonder, what is happening within your transport that might cause replacing it to invalidate the signature?

I wonder, what is happening within your transport that might cause replacing it to invalidate the signature?

As far as we're concerned the SDK is just using the default net/http client (not literally http.DefaultClient per se but we are using the standard library's implementation)

Note that I'm not necessarily just talking about mutation of the request, extension (generally via additional headers inserted by the proxy) can also invalidate the signature. We've seen this happen fairly often with inserting proxies into the request workflow - generally the proxy will add a forwarding header (usually X-Forwarded-For) which breaks the signature, which is calculated using all X-* headers.

I am quite sure that the use of the SOCKS proxy dialer is completely transparent to the target of the original request: The socks proxy we use can forward any TCP requests, so it would not make any changes specific to the HTTP protocol (like headers).

Are anything other than X-* headers used to calculate the signature?

You can read more about the sigv4 algorithm here.

Beyond that though I'm going to close this issue. If the default configuration is working, and a caller-provided custom transport causes the issue to surface, we can only assume it's a fault of that customization absent evidence to the contrary. The only advice I can give you based on this information is to compare requests as outgoing from the SDK and as outgoing from the proxy to verify whether anything is being changed.

⚠️COMMENT VISIBILITY WARNING⚠️

Comments on closed issues are hard for our team to see.
If you need more assistance, please either tag a team member or open a new issue that references this one.
If you wish to keep having a conversation with other community members under this issue feel free to do so.