ssl - 如何配置 SSL 身份验证

标签 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

最佳答案

如果服务器使用的是您自己的证书颁发机构生成的证书,则以下代码可以解决问题。

我从未在服务器证书来自公共(public) 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(.....)

关于ssl - 如何配置 SSL 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40032050/

相关文章:

mysql - 提高涉及联合的 MYSQL QUERY 的性能

java - 尽管两个证书都是由经过验证的 CA 颁发的,但仍出现 ssl 异常吗?

c# - 如何在Kestrel中直接使用PEM证书?

java - RM over SSL 与服务器上的单个端口

go - 与其他 Go 进程通信

python-3.x - 使用 pip 安装 requirements.txt 文件时出现 TLS/SSL 问题

go - 关于 Go 语法的困惑

certificate - 服务器证书验证失败。 CAfile :/etc/ssl/certs/ca-certificates. crt CRLfile:无

sockets - 我尝试使用 s_client (openssl) 和 javax.net.ssl 包连接到加密套接字

Android - 如何在给定证书链的情况下为 SSL 身份验证构建 keystore