Я пытаюсь написать пользовательский 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
Но все же, возможно ли как-то вернуть сертификат сервера?