Go 如何检查CA颁发的PEM证书的有效性

Go 如何检查CA颁发的PEM证书的有效性,go,x509,Go,X509,我有一个证书(PEM),我想检查证书是否有效并由CA签署。我已经有CA证书(PEM)。使用标准的crypto/x509软件包在Go中检查证书的简单而安全的方法是什么?您需要使用。下面是一个示例,具体说明您在文档中要执行的操作: 免责声明:我将其重新组织为一个函数,并消除了错误处理的恐慌。该代码在其他方面与官方文档中的示例保持不变。谢谢,特别是链接。就我而言,我没有使用VerifyOptions.DNSName。是否有任何特定的理由(不)使用它?这取决于您的用例。一般来说,如果你是客户机,你应该

我有一个证书(PEM),我想检查证书是否有效并由CA签署。我已经有CA证书(PEM)。使用标准的
crypto/x509
软件包在Go中检查证书的简单而安全的方法是什么?

您需要使用。下面是一个示例,具体说明您在文档中要执行的操作:


免责声明:我将其重新组织为一个函数,并消除了错误处理的恐慌。该代码在其他方面与官方文档中的示例保持不变。

谢谢,特别是链接。就我而言,我没有使用
VerifyOptions.DNSName
。是否有任何特定的理由(不)使用它?这取决于您的用例。一般来说,如果你是客户机,你应该使用它,如果你是服务器,你就不能使用它。使用DNSName,库可以根据证书覆盖的所有可能名称进行验证。如果你是一个客户端,你知道你试图连接到的服务器,因此应该检查中间人攻击。如果您是一个服务器,很可能您不知道谁正在连接并计划实施您自己的授权检查。
func verifyCert(rootPEM, certPEM string, name string) error {
    roots := x509.NewCertPool()
    ok := roots.AppendCertsFromPEM([]byte(rootPEM))
    if !ok {
        return fmt.Errorf("failed to parse root certificate")
    }

    block, _ := pem.Decode([]byte(certPEM))
    if block == nil {
        return fmt.Errorf("failed to parse certificate PEM")
    }
    cert, err := x509.ParseCertificate(block.Bytes)
    if err != nil {
        return fmt.Errorf("failed to parse certificate: %v", err.Error())
    }

    opts := x509.VerifyOptions{
        DNSName: name,
        Roots:   roots,
    }

    if _, err := cert.Verify(opts); err != nil {
        return fmt.Errorf("failed to verify certificate: %v", err.Error())
    }

    return nil
}