x509 из образа на scratch при обращении к внешнему API
Go-сервис собирается в multi-stage образе:
FROM golang:1.22 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app ./cmd/app
FROM scratch
COPY --from=build /out/app /app
ENTRYPOINT ["/app"]
Локально бинарник работает. В контейнере сервис стартует, отдаёт свой health-эндпоинт, но любой запрос к внешнему API по HTTPS падает с ошибкой x509: certificate signed by unknown authority. Сертификат у API валидный, браузер и curl с хоста ему доверяют.
В чём причина?
- Сертификат внешнего API выпущен внутренним удостоверяющим центром компании, и его корневой сертификат нужно добавлять в доверенные на каждом хосте кластера
- Сборка с `CGO_ENABLED=0` отключает в бинарнике поддержку TLS, нужно собирать с включённым CGO
- В `scratch` не работает разрешение имён, и клиент подключается не к тому хосту, отсюда несовпадение сертификата
- В образе `scratch` нет ничего, кроме бинарника: отсутствует набор корневых сертификатов, поэтому цепочку доверия проверить нечем
