在使用自签名服务器证书建立 TLS 连接时,用户经常会遇到“x509: 证书由未知权限”错误。当客户端无法将自签名证书识别为可信机构时,就会出现此问题。
要解决此错误,问题出在证书生成过程中。提供的代码片段创建一个自签名证书,但忽略设置“IsCA:true”标志。此标志将证书指定为证书颁发机构 (CA),使其能够签署其他证书。
更正后的代码应类似于以下内容:
生成证书:
func generateCertificate() { key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { log.Fatal(err) } subject := x509.Certificate{ SerialNumber: big.NewInt(42), Subject: pkix.Name{ Organization: []string{"My Organization"}, }, } template := x509.Certificate{ SerialNumber: big.NewInt(43), Subject: subject.Subject, KeyUsage: x509.KeyUsageCertSign, IsCA: true, // Setting IsCA to true designates the certificate as a CA ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, } cert, err := x509.CreateCertificate(rand.Reader, &template, &template, &key.PublicKey, key) if err != nil { log.Fatal(err) } // Save the certificate and key to pem files }
客户配置:
func clientSetup() (*tls.Config, error) { cert, err := ioutil.ReadFile("./cert.pem") if err != nil { return nil, err } certpool := x509.NewCertPool() certpool.AppendCertsFromPEM(cert) config := &tls.Config{ RootCAs: certpool, InsecureSkipVerify: true, //!!! Skip certificate verification for testing purposes only } return config, nil }
注意:对于生产环境,应启用证书验证,以确保服务器的真实性。
以上是使用自签名 TLS 证书时如何解决'x509:证书由未知颁发机构签名”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!