Пользовательский VerifyPeerCertificate в пакете crypto / tls - PullRequest
2 голосов
/ 02 февраля 2020

Я пытаюсь написать пользовательский VerifyPeerCertificate, чтобы получить сертификат, даже если CN и FQDN не совпадают.

Я новичок в golang, поэтому я пытаюсь изменить некоторые код, который я нашел, и заставить его работать, но безуспешно.

Итак, вот мой код:

package main

import (
    "fmt"
    "log"
    "crypto/tls"
    "crypto/x509"
)

func main() {

    customVerify := func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {

        roots := x509.NewCertPool()
        for _, rawCert := range rawCerts {
            c, _ := x509.ParseCertificate(rawCert)

            roots.AddCert(c)
        }
        cert, _ := x509.ParseCertificate(rawCerts[0])
        fmt.Println("subject name is : ",cert.Subject.CommonName)
        opts := x509.VerifyOptions{
            DNSName: cert.Subject.CommonName,
            Roots:   roots,
        }
        if _, err := cert.Verify(opts); err != nil {
            panic("failed to verify certificate: " + err.Error())
            return err
        }

        return nil
    }


    log.SetFlags(log.Lshortfile)

    conf := &tls.Config{
         InsecureSkipVerify: true,
         VerifyPeerCertificate: customVerify,
    }

    conn, err := tls.Dial("tcp", "127.0.0.1:9007", conf)


    if err != nil {

        log.Println(err)
        return
    }
    defer conn.Close()

    n, err := conn.Write([]byte("hello\n"))
    if err != nil {
        log.Println(n, err)
        return
    }

    buf := make([]byte, 100)
    n, err = conn.Read(buf)
    if err != nil {
        log.Println(n, err)
        return
    }

    println(string(buf[:n]))
}

Я пытаюсь получить сертификат локального сервера.

, когда я пытаюсь запустить код, я получаю эту ошибку:

root@mymachine:~/Tproject# go run test.go
subject name is :  dssdemo
test.go:50: remote error: tls: bad certificate

Я пытался имитировать c example_Certificate_Verify

Может ли кто-нибудь помочь мне с этим?

Заранее спасибо.

Редактировать:

Взаимное HTTPS вызывает: test.go:50: remote error: tls: bad certificate Но все же, возможно ли как-то вернуть сертификат сервера?

1 Ответ

0 голосов
/ 10 февраля 2020

Эта пользовательская проверка игнорирует все проверки:

func ipSCert(host, port string) ([]*x509.Certificate, string, error) {

var ipcertchain []*x509.Certificate

customVerify := func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {

    roots := x509.NewCertPool()
    for _, rawCert := range rawCerts {

        c, _ := x509.ParseCertificate(rawCert)
        certItem, _ := x509.ParseCertificate(rawCert)
        ipcertchain = append(ipcertchain, certItem)
        roots.AddCert(c)

    }
    return nil

}

log.SetFlags(log.Lshortfile)

d := &net.Dialer{
    Timeout: time.Duration(TimeoutSeconds) * time.Second,
}

cs, err := cipherSuite()
if err != nil {
    return []*x509.Certificate{&x509.Certificate{}}, "", err
}

conf := &tls.Config{
    InsecureSkipVerify:    true,
    VerifyPeerCertificate: customVerify,
    CipherSuites:          cs,
    MaxVersion:            tlsVersion(),
}

conn, err := tls.DialWithDialer(d, "tcp", host+":"+port, conf)

if err != nil {

    return nil, "", err
}

conn.Close()

return ipcertchain, host, nil

}

...