41 votes

Comment envoyer une demande https avec un certificat golang

J'ai un serveur qui a une API de repos fonctionnant sur https. Je veux faire un appel à cette API de repos dans mon application qui s'exécute sur un port différent, mais comme elle fonctionne en https, j'obtiens les résultats suivants

Post https://localhost:8080/api/v1/myapi: x509: certificate signed by unknown authority

J'ai 2 fichiers pulic_key.pem et private_key qui peuvent être utilisés pour vérifier le certificat. Comment vérifier le certificat lors de l'envoi de la demande de repos en utilisant golang ? J'utilise &http.Client{} pour envoyer une demande de repos. Voici ce que je fais pour ignorer le certificat en ce moment.

tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}

client := &http.Client{Transport: tr}

60voto

CrazyCrow Points 2670

Vous devez ajouter l'autorité de certification de votre certificat à votre transport :

package main

import (
    "crypto/tls"
    "io/ioutil"
    "log"
    "net/http"
    "crypto/x509"
)

func main() {
    caCert, err := ioutil.ReadFile("rootCA.crt")
    if err != nil {
        log.Fatal(err)
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)

    client := &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: &tls.Config{
                RootCAs:      caCertPool,
            },
        },
    }

    _, err := client.Get("https://secure.domain.com")
    if err != nil {
        panic(err)
    }
}

Mais je suppose que vous n'avez pas créé d'AC pour faire vos certificats. Voici la liste des commandes sans explication qui peuvent vous aider à faire des certificats signés avec votre propre CA. Pour plus d'informations, vous pouvez consulter Google.

  1. Génération de l'AC

    openssl genrsa -out rootCA.key 4096
    openssl req -x509 -new -key rootCA.key -days 3650 -out rootCA.crt
  2. Générer un certificat pour secure.domain.com signé avec l'autorité de certification créée

    openssl genrsa -out secure.domain.com.key 2048
    openssl req -new -key secure.domain.com.key -out secure.domain.com.csr
    #In answer to question `Common Name (e.g. server FQDN or YOUR name) []:` you should set `secure.domain.com` (your real domain name)
    openssl x509 -req -in secure.domain.com.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -days 365 -out secure.domain.com.crt

-5voto

Jérôme CARRE Points 1

Si le certificat est auto-signé, vous devez ajouter cette option :

TLSClientConfig: &tls.Config{
   RootCAs:      caCertPool,
   InsecureSkipVerify: true,
},

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X