Reputation: 1100
I have a web app written in Go, use oauth2 (package golang.org/x/oauth2
) to sign user in by Google (follow this tutorial https://developers.google.com/identity/sign-in/web/server-side-flow).
When I test app on local, it works fine but when I deploy app and run inside a Docker container (base on alpine:latest
, run binary file), it has an error:
Post https://accounts.google.com/o/oauth2/token: x509: certificate signed by unknown authority
Here is my code to exchange the accessToken:
ctx = context.Background()
config := &oauth2.Config{
ClientID: config.GoogleClientId,
ClientSecret: config.GoogleClientSecret,
RedirectURL: config.GoogleLoginRedirectUrl,
Endpoint: google.Endpoint,
Scopes: []string{"email", "profile"},
}
accessToken, err := config.Exchange(ctx, req.Code)
if err != nil {
log.Println(err.Error()) // Error here
}
Upvotes: 4
Views: 2837
Reputation: 1100
The problem is not caused by Go but Alpine image.
Default Alpine image does not have certificates so the app cannot call to https address (this case is https://accounts.google.com/o/oauth2/token).
To fix this problem, install 2 packages openssl
and ca-certificates
. Example in Dockerfile:
apk add --no-cache ca-certificates openssl
Upvotes: 2
Reputation: 3272
You will need to add the Google Issuing CA certificate to the trusted cert store of the docker image.
The Google CA cert is this https://pki.google.com/GIAG2.crt .
More info on the certificate can be found from here
Then within the Dockerfile , you will need to do something like this
cp GIAG2.crt /usr/local/share/ca-certificates/GIAG2.crt
update-ca-certificates
Upvotes: 1