服务器尝试发送 Expo 通知时收到 "x.509 certificate signed by unknown authority"

Got "x.509 certificate signed by unknown authority" when the server tried to send Expo notifications

当我尝试向 Expo 推送通知服务器发送通知时收到“x.509 证书由未知授权机构签名”的错误消息。

我用 Golang 编写的服务器存储 expo 推送令牌。然后,它加载这些令牌并构建 expo.PushMessage 列表并使用 PublishMultiple 函数推送它们。

我有两台服务器,一台用于测试,另一台用于生产。它在测试服务器中运行良好。我收到了关于我的测试的推送通知 phone。因此,我更新了我的生产服务器,然后生产服务器生成 x.509 certificate signed by unknown authority 消息。

首先,我怀疑我的 expo 推送令牌已损坏,但是当我使用 Expo push notifications tool 时推送令牌运行良好。

我不知道去哪里寻找解决方案。谁能帮我?如果您想了解我的服务器代码或设置,我会修改问题。目前,我不确定应该提供哪部分代码或设置来找到解决方案。

以下代码是唯一可能发生错误的地方。

import (
    expo "github.com/oliveroneill/exponent-server-sdk-golang/sdk"
    "github.com/pkg/errors"
)

type Client struct {
    PushClient *expo.PushClient
}

func NewClient() *Client {
    client := expo.NewPushClient(nil)

    return &Client{PushClient: client}
}

func (c *Client) PushNotifications(deviceKeys []string, title string, body string) (error, map[string]string) {
    messages := make([]expo.PushMessage, 0)
    for _, deviceKey := range deviceKeys {
        pushToken, err := expo.NewExponentPushToken(deviceKey)
        if err != nil {
            continue
        }

        messages = append(messages, expo.PushMessage{
            To:        pushToken,
            Body:      body,
            Data:      nil,
            Sound:     "default",
            Title:     title,
            Priority:  expo.DefaultPriority,
            ChannelID: "default",
        })
    }

    // This is only place the error can occur
    // PublishMultiple function is a part of the Expo SDK
    responses, err := c.PushClient.PublishMultiple(messages)
    if err != nil {
        return errors.WithStack(err), nil
    }

    sentErrors := make(map[string]string)
    for index, response := range responses {
        err := response.ValidateResponse()
        if err != nil && index >= len(deviceKeys) {
            sentErrors[deviceKeys[index]] = err.Error()
        }
    }

    return nil, sentErrors
}

用于构建我的生产服务器的 dockerfile:

FROM golang:1.13-alpine as builder

WORKDIR /usr/src/app
ARG app
COPY . .

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -mod vendor -a -ldflags '-s' -o main ./apps/$app

FROM scratch

COPY --from=builder /usr/src/app/main /app/main

WORKDIR /app
CMD ["./main"]

golang:*-alpine 图像是 intentionally minimal 并且没有系统证书池。

最简单的解决方案是在构建 docker 图像时自己添加它,方法是添加:

RUN apk add --no-cache ca-certificates