HTTP Post call к клиенту SOAP с сертификатом pix с использованием GO lang в MAC - PullRequest
0 голосов
/ 14 октября 2018

Я хочу сделать мыльный вызов, используя http запросы go lang.У меня есть сертификат pfx с паролем, и я создал три файла расширения pem для личного, клиентского сертификата и личного ключа, как показано ниже.

openssl pkcs12 -in XXXX.pfx -nocerts -nodes -out key.pem
openssl pkcs12 -in XXXX.pfx -cacerts -nokeys -out root.crt
openssl pkcs12 -in XXXX.pfx -clcerts -nokeys -out client.crt

Затем я выполняю приведенный ниже файл GO Lang, который вызывает x509: сертификат подписан неизвестным органом * ошибка 1005 *.

основной пакет

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

const (
    DATA = `XML_TEMPLATE`
)

func createClientConfig(ca, crt, key string) (*tls.Config, error) {
    caCertPEM, err := ioutil.ReadFile(ca)
    if err != nil {
        return nil, err
    }

    roots := x509.NewCertPool()
    ok := roots.AppendCertsFromPEM(caCertPEM)
    if !ok {
        panic("failed to parse root certificate")
    }

    cert, err := tls.LoadX509KeyPair(crt, key)
    if err != nil {
        return nil, err
    }
    return &tls.Config{
        CipherSuites:             []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384},
        Certificates:             []tls.Certificate{cert},
        RootCAs:                  roots,
        InsecureSkipVerify:       false,
        PreferServerCipherSuites: true,
    }, nil
}

func main() {
    var url = "/certificates/"

    clientCert := url + "client.pem"
    clientKey := url + "key.pem"
    rootCert := url + "root.pem"

    tlsConfig, err := createClientConfig(rootCert, clientCert, clientKey)

    if err != nil {
        fmt.Println("Inside the error:::::", err)
        return
    }

    tlsConfig.BuildNameToCertificate()
    tr := &http.Transport{TLSClientConfig: tlsConfig}
    c := &http.Client{
        Transport: tr,
        Timeout:   15 * time.Second,
    }

    request_url := "URL"
    resp, errPost := c.Post(request_url, "text/xml", bytes.NewBufferString(DATA))
    if errPost != nil {
        log.Fatalf("post error: %v", errPost)
    }

    body, errBody := ioutil.ReadAll(resp.Body)
    resp.Body.Close()

    if errBody != nil {
        log.Fatalf("body error: %v", errBody)
    }

    fmt.Printf("done - body: %v", string(body))
}

Если я сделаю InsecureSkipVerify как true Я получаю данные без каких-либо ошибок.Что мне делать, если я хочу сделать это безопасным?Есть ли возможность отправить файл pfx и pass_phrase непосредственно в вызове http?

...