Golang SSL身份验证

时间:2016-10-13 22:26:49

标签: ssl go ssl-certificate

我有certificate.pem用于对远程服务器执行客户端身份验证。当我访问服务器时,通常Chrome弹出,询问我是否要使用该证书,我说是,然后我通过身份验证。我试图弄清楚为什么当我以编程方式调用它时,它不会使用拨号器发送证书:

type DialerHelper func() (io.ReadWriter, error)
func DialIt(addr string, port uint16, config *tls.Config) (Dialer, error) {
    address := fmt.Sprintf("%s:%d", addr, port)
    return DialerHelper(func() (io.ReadWriter, error) {
        return tls.Dial("tcp", address, config)
    }), nil
}
caPool := x509.NewCertPool()
cert, err := ioutil.ReadFile("certificate.pem")
if err != nil {
    panic(err)
}
ok := caPool.AppendCertsFromPEM(cert)
if !ok {
    panic(ok)
}

tlsconfig := &tls.Config{
    InsecureSkipVerify: true,
    RootCAs: caPool, }
tlsconfig.BuildNameToCertificate()
DialIt("some.address.com", 443, tlsconfig)

我不断从服务器收到错误,说没有提供客户端证书。我是否正确地将SSL证书发送到远程服务器?我不是SSL的专家。

编辑:这是我正在尝试复制的功能:curl -k --cert /home/me/.ssh/certificate.pem

1 个答案:

答案 0 :(得分:0)

如果服务器使用从您自己的证书颁发机构生成的证书,则以下代码将执行此操作。

我从未在服务器证书来自公共CA的环境中尝试过客户端证书身份验证,因此我不确定您是如何实现这一点的。也许只是省略设置config.RootCAs。

func loadCertificates(caFileName, certFileName, keyFileName string) (tls.Certificate, *x509.CertPool, error) {

    myCert, err := tls.LoadX509KeyPair(certFileName, keyFileName)
    if err != nil {
        return tls.Certificate{}, nil, err
    }

    ca, err := ioutil.ReadFile(caFileName)
    if err != nil {
        return tls.Certificate{}, nil, err
    }

    certPool := x509.NewCertPool()
    if !certPool.AppendCertsFromPEM(ca) {
        return tls.Certificate{}, nil, errors.New("Failed appending certs")
    }

    return myCert, certPool, nil

}


func GetClientTlsConfiguration(caFileName, certFileName, keyFileName string) (*tls.Config, error) {
    config := &tls.Config{}
    myCert, certPool, err := loadCertificates(caFileName, certFileName, keyFileName)
    if err != nil {
        return nil, err
    }
    config.Certificates = make([]tls.Certificate, 1)
    config.Certificates[0] = myCert

    config.RootCAs = certPool
    config.ClientCAs = certPool

    return config, nil

}


tlsConfig, err := config.GetClientTlsConfiguration("ca.crt", "client.crt", "client.key")

if err != nil {
    log.Fatalf("Error loading tls config - %v", err)
}

client := &http.Client{Transport: &http.Transport{TLSClientConfig: tlsConfig}}

client.Get(.....)