x509: certificate signed by unknown authority на Golang

304
27 сентября 2021, 02:20

Имеется js код такого типа, который делает запрос к апи и получает от него ответ.

var request = require('request');
var requestOptions = {
    login: {
        url: `${serverUrl}/auth/login`,
        method: 'POST',
        body: {
            emailid: "aaaa@aaa.aaa",
            password: "1234",
            entityType: "user"
        }
    },
};

//send request to server 
function sendRequest({ type, token }) {
    if (requestOptions[type]) {
        requestOptions[type].rejectUnauthorized = false;
        requestOptions[type].json = true;
        if (type === 'login') {
            requestOptions[type].headers = {
                'Accept': 'application/json',
            }
        }
        return new Promise((resolve, reject) => {
            request(requestOptions[type], (error, response, body) => {
                if (error) {
                    console.log({
                        error: "Ok",
                        errMessage: error
                    });
                } else {
                    console.log({ sucess: "Ok", body: response.body });
                }
            });
        });
    } else {
        console.log('Invalid request');
    }
}
sendRequest({ type: 'login' });

Пытался его реализовать на golang таким образом

type Payload struct {
    Emailid    string  `json:"emailid"`
    Password   string  `json:"password"`
    EntityType string  `json:"entityType"`
}
func Init(apiKey string, apiSecret string) error {
    data := new(Payload)
    data.Emailid = apiKey
    data.Password = apiSecret
    data.EntityType = "user"
    fmt.Println(data)
    payloadBytes, err := json.Marshal(data)
    if err != nil {
        return fmt.Errorf("Error in Init with payloadBytes, err := json.Marshal(data) %s", err.Error())
    }
    body := bytes.NewReader(payloadBytes)

    req, err := http.NewRequest("POST", "https://url/auth/login", body)
    if err != nil {
        return fmt.Errorf("Error in Init NewRequest %s", err.Error())
    }
    req.Header.Set("Accept", "application/json")
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return fmt.Errorf("Error in Init with resp, err := http.DefaultClient.Do(req) %s", err.Error())
    }
    defer resp.Body.Close()
    htmlData, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return fmt.Errorf("Error in Init with htmlData, err := ioutil.ReadAll(resp.Body) %s", err.Error())
    }
    fmt.Println(string(htmlData))
    return nil
}

Но почему-то запрос к апи возвращает пустой ответ, если запускать код на golang.

Помогите найти ошибку. Заранее буду благодарен.

Answer 1

Если вы запускаете golang код в docker, возможно поможет вот этот хак в Dockerfile если он не multistage добавить такое

RUN apk update && apk add --no-cache git ca-certificates && update-ca-certificates

Если же у вас multistage то там где используется scratch добавить еще такое

COPY --from=go-builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

Вот тут чуть подробней есть инфа.

Answer 2

У вашего сервера плохой сертификат. Вашим первым инстинктом должно быть починить ситуацию с сертификатом на стороне сервера!

Только когда вы абсолютно уверены, что это невозможно, и только когда вы готовы нести за это полную ответственность, вы можете отключить проверку верности сертификата у HTTP-клиента:

// TODO(philipp): UNSAFE! FIX THIS! DON'T USE IN PRODUCTION!
//
// Largely copied from
// https://golang.org/pkg/net/http/#DefaultTransport.
var client = &http.Client{
    Transport: &http.Transport{
        Proxy: http.ProxyFromEnvironment,
        DialContext: (&net.Dialer{
            Timeout:   30 * time.Second,
            KeepAlive: 30 * time.Second,
            DualStack: true,
        }).DialContext,
        ForceAttemptHTTP2:     true,
        MaxIdleConns:          100,
        IdleConnTimeout:       90 * time.Second,
        TLSHandshakeTimeout:   10 * time.Second,
        ExpectContinueTimeout: 1 * time.Second,
        TLSClientConfig: &tls.Config{
            // See comment above.
            // UNSAFE!
            // DON'T USE IN PRODUCTION!
            InsecureSkipVerify: true,
        },
    },
}

Вся ответственность за подобный код лежит на вас!

READ ALSO
Нажатие только определенный div

Нажатие только определенный div

Подскажите пожалуйста, есть такой код

175
Как удалять невидимые символы в CKeditor?

Как удалять невидимые символы в CKeditor?

Доброе время суток, форумчане!

140
Изменить колонтитул при печати

Изменить колонтитул при печати

Браузер автоматически добавляет в колонтитул содержимое тега h1 и добавляет датуМожно как-то изменить его?

162