代码之家  ›  专栏  ›  技术社区  ›  Invictus

了解相互TLS、客户端配置和服务器名

  •  0
  • Invictus  · 技术社区  · 7 年前

    我试图了解双方TLS的工作原理,我有以下示例:

    但是服务器有一个

    公用名为“svc1.example.cloud”和SAN的服务器证书 如“svc.example.test.cloud”。

    x509:证书对svc.example.test.cloud有效,而不是svc1.example.com。

    所以,我的问题是,我是否应该对TLS clientConfig更改进行修改,以包括服务器名?或者我应该在TLS客户端配置中添加一个自定义verifyPeerCertificate函数,如下所示?

    请让我知道,服务器名应该是什么,我应该在verifyPeerCertificate函数中检查什么。

    func customverify(customCName func(*x509.Certificate) bool) func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {
        if customCName == nil {
            return nil
        }
        return func(_ [][]byte, verifiedChains [][]*x509.Certificate) error {
            for _, certs := range verifiedChains {
                leaf := certs[0]
                if customCName(leaf) {
                    return nil
                }
            }
            return fmt.Errorf("client identity verification failed")
        }
    }
    
    
    
    
    func configureClient(certFile, keyFile string) (*http.Client, error) {
        certpool, err := addRootCA()
        if err != nil {
            return nil, err
        }
    
    cert, err := tls.LoadX509KeyPair(certFile, keyFile)
    if err != nil {
        return nil, err
    }
    transport := ytls.NewClientTransport()
    transport.TLSClientConfig.Certificates = []tls.Certificate{cert}
    transport.TLSClientConfig.RootCAs = certpool
    //transport.TLSClientConfig.ServerName = expectedCName
    transport.TLSClientConfig.VerifyPeerCertificate = customverify(func(cert *x509.Certificate) bool {
        return cert.Subject.CommonName == "svc1.example.cloud"
    })
    
    httpClient := &http.Client{Transport: transport}
    return httpClient, nil
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   nightfury1204    7 年前

    自从 x509:证书对svc.example.test.cloud有效 所以 transport.TLSClientConfig.ServerName = "svc.example.test.cloud"

    https://golang.org/pkg/crypto/tls/#Config

    VerifyPeerCertificate,如果不是nil,则在正常后调用


    正常处理发现的任何已验证链。如果它返回一个
    非零错误,握手被中止并导致该错误。

    如果正常验证失败,则握手将在之前中止

    设置UnsecureSkipVerify,或(对于服务器)在ClientAuth为
    RequestClientCert或RequireOnClientCert,则此回调将
    将被考虑,但verifiedChains参数将始终为零。

    VerifyPeerCertificate函数(rawCerts[][]字节,verifiedChains[][]*x509.证书)错误

    因此,如果正常验证失败,那么 VerifyPeerCertificate 不会接到电话的。另外,如果正常验证通过,我认为你不需要额外的检查 验证PeerCertificate .