【问题标题】:Client-server TLS with custom CA具有自定义 CA 的客户端-服务器 TLS
【发布时间】:2021-04-03 16:05:15
【问题描述】:

我写了一个小测试程序来创建

  1. 自定义的自签名 CA 证书#1
  2. 创建由该 CA 颁发的服务器证书#2 - 根证书#1
  3. 使用证书#2 创建服务器
  4. 使用指向证书#1 的 RootCA 创建客户端
  5. 客户端尝试连接服务器并收到错误:

Get "https://localhost:2000": x509: certificate signed by unknown authority(可能是因为 "x509: Ed25519 验证失败" 同时尝试验证候选权威证书 "test-ca")

我知道有很多这样的例子。我以为我跟他们很近,但我在这里。我在这里只展示最相关的结构,但 the full text of the program can be found here:

    ...
    templateCA := &x509.Certificate{
        Subject: pkix.Name{
            CommonName:   "test-ca",
            Organization: []string{"test ca"},
            Country:      []string{"USA"},
            Province:     []string{"NY"},
            Locality:     []string{"New York City"},
        },
        SerialNumber:          serialNumber,
        NotBefore:             time.Now(),
        NotAfter:              time.Now().AddDate(0, 0, 1),
        BasicConstraintsValid: true,
        IsCA:                  true,
        SubjectKeyId:          caSubjectKeyID[:],
        DNSNames:              []string{"test-ca"},
        KeyUsage:              x509.KeyUsageCertSign
    }
    ...
    certBytes, _ := x509.CreateCertificate(rand.Reader, templateCA, templateCA, privKey.Public(), privKey)
    ...
    templateServer := &x509.Certificate{
        Subject: pkix.Name{
            CommonName:   "localhost",
            Organization: []string{"Server"},
            Country:      []string{"USA"},
            Province:     []string{"NY"},
            Locality:     []string{"New York City"},
        },
        SerialNumber:          serialNumber,
        NotBefore:             time.Now(),
        NotAfter:              time.Now().AddDate(0, 0, 1),
        BasicConstraintsValid: true,
        SubjectKeyId:          servSubjectKeyID[:],
        AuthorityKeyId:        caSubjectKeyID[:],
        DNSNames:              []string{"localhost"},
        IPAddresses:           []net.IP{{127, 0, 0, 1}},
        KeyUsage:              x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment,
        ExtKeyUsage:           []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
    }
    ...
    certBytes, _ = x509.CreateCertificate(rand.Reader, templateServer, caCert, privKey.Public(), privKey)
    ...
var (
    tlsMinVersion = uint16(tls.VersionTLS12)
    tlsMaxVersion = uint16(tls.VersionTLS13)
    cipherSuites  = []uint16{
        tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
        tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
        tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
        tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
        tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
        tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
    }
    curvePreferences = []tls.CurveID{
        tls.X25519,
        tls.CurveP256,
        tls.CurveP384,
        tls.CurveP521,
    }
)
    ...
    tlsServerConfig := &tls.Config{
        Certificates:             []tls.Certificate{*tlsSrvCert},
        MinVersion:               tlsMinVersion,
        MaxVersion:               tlsMaxVersion,
        CurvePreferences:         curvePreferences,
        CipherSuites:             cipherSuites,
        PreferServerCipherSuites: true,
    }
    ...
    tlsClientConfig := &tls.Config{
        ServerName:               "localhost",
        RootCAs:                  x509.NewCertPool(),
        MinVersion:               tlsMinVersion,
        MaxVersion:               tlsMaxVersion,
        CurvePreferences:         curvePreferences,
        CipherSuites:             cipherSuites,
        PreferServerCipherSuites: true,
    }
    tlsClientConfig.RootCAs.AddCert(caCert)
    

我错过了什么或做错了什么?

【问题讨论】:

  • 稍微更改了代码 sn-ps 以反映最新情况,但这并没有帮助。仍然得到同样的错误。更进一步:手动创建了一组几乎相同的证书,仅在 ID、序列号和密钥字节方面存在差异。手动创建的证书有效,但生成的证书无效。

标签: go https certificate tls1.2 tls1.3


【解决方案1】:

您可以使用私钥解密数据并加密散列数据以创建数字签名。

您可以使用公钥加密数据并解密数字签名来验证它。

您需要在这里做的是使用 一个 密钥对(公钥/私钥)生成 CA 证书,并使用该证书 + 相同的密钥对为您的服务器生成一个或多个证书(s)。

如果您想使用浏览器/curl 作为您的客户端,您需要在根密钥库中添加 CA 证书。

【讨论】:

【解决方案2】:

感谢@djoudat 指出我的错误。我从上面粘贴了更正的代码 sn-ps。希望有一天,他们可以帮助某人。

...
templateCA := &x509.Certificate{
    Subject: pkix.Name{
        CommonName:   "test-ca",
        Organization: []string{"test ca"},
        Country:      []string{"USA"},
        Province:     []string{"NY"},
        Locality:     []string{"New York City"},
    },
    SerialNumber:          serialNumber,
    NotBefore:             time.Now(),
    NotAfter:              time.Now().AddDate(0, 0, 1),
    BasicConstraintsValid: true,
    IsCA:                  true,
    KeyUsage:              x509.KeyUsageCertSign
    DNSNames:              []string{"test-ca"},
}
...
certBytes, _ := x509.CreateCertificate(rand.Reader, templateCA, templateCA, privKeyCA.Public(), privKeyCA)
...
templateServer := &x509.Certificate{
    Subject: pkix.Name{
        CommonName:   "localhost",
        Organization: []string{"Server"},
        Country:      []string{"USA"},
        Province:     []string{"NY"},
        Locality:     []string{"New York City"},
    },
    SerialNumber:          serialNumber,
    NotBefore:             time.Now(),
    NotAfter:              time.Now().AddDate(0, 0, 1),
    BasicConstraintsValid: true,
    KeyUsage:              x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment,
    ExtKeyUsage:           []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
    DNSNames:              []string{"localhost"},
}
...
certBytes, _ = x509.CreateCertificate(rand.Reader, templateServer, caCert, privKeyServer.Public(), privKeyCA)
...
var (
    tlsMinVersion = uint16(tls.VersionTLS12)
    tlsMaxVersion = uint16(tls.VersionTLS13)
    cipherSuites  = []uint16{
        tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
        tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
        tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
        tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
        tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
        tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
    }
    curvePreferences = []tls.CurveID{
        tls.X25519,
        tls.CurveP256,
        tls.CurveP384,
        tls.CurveP521,
    }
)
...
tlsServerConfig := &tls.Config{
    Certificates:             []tls.Certificate{*tlsSrvCert},
    MinVersion:               tlsMinVersion,
    MaxVersion:               tlsMaxVersion,
    CurvePreferences:         curvePreferences,
    CipherSuites:             cipherSuites,
    PreferServerCipherSuites: true,
}
...
tlsClientConfig := &tls.Config{
    ServerName:               "localhost",
    RootCAs:                  x509.NewCertPool(),
    MinVersion:               tlsMinVersion,
    MaxVersion:               tlsMaxVersion,
    CurvePreferences:         curvePreferences,
    CipherSuites:             cipherSuites,
    PreferServerCipherSuites: true,
}
tlsClientConfig.RootCAs.AddCert(caCert)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-31
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多