web-dev-qa-db-fra.com

Comment envoyer une demande https avec un certificat Golang

J'ai un serveur qui a une API de repos fonctionnant sur https. Je veux appeler cet api de repos dans mon application qui s'exécute sur un port différent, mais comme c'est fini https, je reçois

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 d'une demande de repos à l'aide de 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}
18
codec

Vous devez ajouter l'AC de votre certificat à votre transport comme:

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 tout simplement pas créé CA pour créer vos certificats. Voici la liste des commandes sans explication qui peuvent vous aider à faire signer des certificats avec votre propre autorité de certification. Pour plus d'informations, vous pouvez le rechercher sur 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
    
24
CrazyCrow

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

TLSClientConfig: &tls.Config{
   RootCAs:      caCertPool,
   InsecureSkipVerify: true,
},
0
Jérôme CARRE