首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

crypto/x509

  • import "crypto/x509"
  • 概述
  • 索引
  • 示例
  • 子目录

概述

软件包x509 分析 X.509 编码的密钥和证书。

在 UNIX 系统上,环境变量 SSL_CERT_FILE和SSL_CERT_DIR 可分别用于覆盖 SSL 证书文件和 SSL 证书文件目录的系统默认位置。

索引

  • Variables
  • func CreateCertificate(rand io.Reader, template, parent *Certificate, pub, priv interface{}) (cert []byte, err error)
  • func CreateCertificateRequest(rand io.Reader, template *CertificateRequest, priv interface{}) (csr []byte, err error)
  • func DecryptPEMBlock(b *pem.Block, password []byte) ([]byte, error)
  • func EncryptPEMBlock(rand io.Reader, blockType string, data, password []byte, alg PEMCipher) (*pem.Block, error)
  • func IsEncryptedPEMBlock(b *pem.Block) bool
  • func MarshalECPrivateKey(key *ecdsa.PrivateKey) ([]byte, error)
  • func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte
  • func MarshalPKIXPublicKey(pub interface{}) ([]byte, error)
  • func ParseCRL(crlBytes []byte) (*pkix.CertificateList, error)
  • func ParseCertificates(asn1Data []byte) ([]*Certificate, error)
  • func ParseDERCRL(derBytes []byte) (*pkix.CertificateList, error)
  • func ParseECPrivateKey(der []byte) (*ecdsa.PrivateKey, error)
  • func ParsePKCS1PrivateKey(der []byte) (*rsa.PrivateKey, error)
  • func ParsePKCS8PrivateKey(der []byte) (key interface{}, err error)
  • func ParsePKIXPublicKey(derBytes []byte) (pub interface{}, err error)
  • type CertPool
  • func NewCertPool() *CertPool
  • func SystemCertPool() (*CertPool, error)
  • func (s *CertPool) AddCert(cert *Certificate)
  • func (s *CertPool) AppendCertsFromPEM(pemCerts []byte) (ok bool)
  • func (s *CertPool) Subjects() [][]byte
  • type Certificate
  • func ParseCertificate(asn1Data []byte) (*Certificate, error)
  • func (c *Certificate) CheckCRLSignature(crl *pkix.CertificateList) error
  • func (c *Certificate) CheckSignature(algo SignatureAlgorithm, signed, signature []byte) error
  • func (c *Certificate) CheckSignatureFrom(parent *Certificate) error
  • func (c *Certificate) CreateCRL(rand io.Reader, priv interface{}, revokedCerts []pkix.RevokedCertificate, now, expiry time.Time) (crlBytes []byte, err error)
  • func (c *Certificate) Equal(other *Certificate) bool
  • func (c *Certificate) Verify(opts VerifyOptions) (chains [][]*Certificate, err error)
  • func (c *Certificate) VerifyHostname(h string) error
  • type CertificateInvalidError
  • func (e CertificateInvalidError) Error() string
  • type CertificateRequest
  • func ParseCertificateRequest(asn1Data []byte) (*CertificateRequest, error)
  • func (c *CertificateRequest) CheckSignature() error
  • type ConstraintViolationError
  • func (ConstraintViolationError) Error() string
  • type ExtKeyUsage
  • type HostnameError
  • func (h HostnameError) Error() string
  • type InsecureAlgorithmError
  • func (e InsecureAlgorithmError) Error() string
  • type InvalidReason
  • type KeyUsage
  • type PEMCipher
  • type PublicKeyAlgorithm
  • type SignatureAlgorithm
  • func (algo SignatureAlgorithm) String() string
  • type SystemRootsError
  • func (se SystemRootsError) Error() string
  • type UnhandledCriticalExtension
  • func (h UnhandledCriticalExtension) Error() string
  • type UnknownAuthorityError
  • func (e UnknownAuthorityError) Error() string
  • type VerifyOptions

示例

Certificate.Verify ParsePKIXPublicKey

文件包

变量

ErrUnsupportedAlgorithm 是尝试执行涉及当前未实现的算法的操作的结果。

var ErrUnsupportedAlgorithm = errors.New("x509: cannot verify signature: algorithm unimplemented")

当检测到不正确的密码时,返回 IncorrectPasswordError。

var IncorrectPasswordError = errors.New("x509: decryption password incorrect")

func CreateCertificate(查看源代码)

func CreateCertificate(rand io.Reader, template, parent *Certificate, pub, priv interface{}) (cert []byte, err error)

CreateCertificate 根据模板创建一个新的证书。使用以下模板成员:AuthorityKeyId,BasicConstraintsValid,DNSNames,ExcludedDNSDomains,ExtKeyUsage,IsCA,KeyUsage,MaxPathLen,MaxPathLenZero,NotAfter,NotBefore,PermittedDNSDomains,PermittedDNSDomainsCritical,SerialNumber,SignatureAlgorithm,Subject,SubjectKeyId和UnknownExtKeyUsage。

该证书由 parent 签署。如果 parent 等于模板,则证书是自签名的。参数 pub 是签名者的公钥,priv 是签名者的私钥。

返回的片是 DER 编码中的证书。

支持通过 crypto.Signer 实现的所有密钥类型(包括 *rsa.PublicKey 和 *ecdsa.PublicKey。)

AuthorityKeyId 将取自父级的 SubjectKeyId(如果有),除非生成的证书是自签名的。否则,将使用来自模板的值。

func CreateCertificateRequest(查看源代码)

func CreateCertificateRequest(rand io.Reader, template *CertificateRequest, priv interface{}) (csr []byte, err error)

CreateCertificateRequest 根据模板创建一个新的证书请求。使用以下模板成员:属性,DNS 名称,EmailAddresses,ExtraExtensions,IPAddresses,SignatureAlgorithm 和 Subject。私钥是签名者的私钥。

返回的片是 DER 编码中的证书请求。

所有通过 crypto.Signer 实现的密钥类型都受支持(包括 *rsa.PublicKey 和 *ecdsa.PublicKey。)

func DecryptPEMBlock(查看源代码)

func DecryptPEMBlock(b *pem.Block, password []byte) ([]byte, error)

DecryptPEMBlock 采用密码加密的PEM块和用于加密它的密码并返回一段 DER 编码字节解密。它检查 DEK-Info 头以确定用于解密的算法。如果不存在 DEK-Info 标头,则返回错误。如果检测到不正确的密码,则返回 IncorrectPasswordError。由于加密 PEM 格式的不足,检测不正确的密码并不总是可能的。在这些情况下,不会返回错误,但解密的 DER 字节将是随机噪声。

func EncryptPEMBlock(查看源代码)

func EncryptPEMBlock(rand io.Reader, blockType string, data, password []byte, alg PEMCipher) (*pem.Block, error)

EncryptPEMBlock 返回一个指定类型的 PEM 块,其中包含用给定算法和密码加密的给定 DER 编码数据。

func IsEncryptedPEMBlock(查看源代码)

func IsEncryptedPEMBlock(b *pem.Block) bool

如果 PEM 块被密码加密,则返回 IsEncryptedPEMBlock 。

func MarshalECPrivateKey(查看源代码)

func MarshalECPrivateKey(key *ecdsa.PrivateKey) ([]byte, error)

MarshalECPrivateKey 将 EC 私钥编组为 ASN.1 DER 格式。

func MarshalPKCS1PrivateKey(查看源代码)

func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte

MarshalPKCS1PrivateKey 将私钥转换为 ASN.1 DER 编码形式。

func MarshalPKIXPublicKey(查看源代码)

func MarshalPKIXPublicKey(pub interface{}) ([]byte, error)

MarshalPKIXPublicKey 将公钥序列化为 DER 编码的 PKIX 格式。

func ParseCRL(crlBytes []byte) (*pkix.CertificateList, error)

ParseCRL 从给定字节分析 CRL。通常情况下,PEM 编码的 CRL 将出现在 DER 编码的位置,所以只要没有任何前导垃圾,该函数就会透明地处理 PEM 编码。

func ParseCertificates(查看源代码)

func ParseCertificates(asn1Data []byte) ([]*Certificate, error)

ParseCertificates从给定的ASN.1 DER数据中解析一个或多个证书。证书必须连接在一起,没有中间填充。

func ParseDERCRL(查看源代码)

func ParseDERCRL(derBytes []byte) (*pkix.CertificateList, error)

ParseDERCRL 从给定字节分析 DER 编码的 CRL。

func ParseECPrivateKey(查看源代码)

func ParseECPrivateKey(der []byte) (*ecdsa.PrivateKey, error)

ParseECPrivateKey 解析 ASN.1 椭圆曲线私钥结构。

func ParsePKCS1PrivateKey(查看源代码)

func ParsePKCS1PrivateKey(der []byte) (*rsa.PrivateKey, error)

ParsePKCS1PrivateKey 从其 ASN.1 PKCS#1 DER 编码形式返回一个 RSA 私钥。

func ParsePKCS8PrivateKey(查看源代码)

func ParsePKCS8PrivateKey(der []byte) (key interface{}, err error)

ParsePKCS8PrivateKey 分析未加密的 PKCS#8 私钥。请参阅 RFC 5208。

func ParsePKIXPublicKey(查看源代码)

func ParsePKIXPublicKey(derBytes []byte) (pub interface{}, err error)

ParsePKIXPublicKey 分析 DER 编码的公钥。这些值通常在具有“开始公钥”的 PEM 块中找到。

支持的密钥类型包括 RSA,DSA 和 ECDSA。未知的密钥类型会导致错误。

成功后,pub将是 *rsa.PublicKey,*dsa.PublicKey 或 *ecdsa.PublicKey 类型。

示例

package main

import (
	"crypto/dsa"
	"crypto/ecdsa"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"fmt"
)

func main() {
	const pubPEM = `
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlRuRnThUjU8/prwYxbty
WPT9pURI3lbsKMiB6Fn/VHOKE13p4D8xgOCADpdRagdT6n4etr9atzDKUSvpMtR3
CP5noNc97WiNCggBjVWhs7szEe8ugyqF23XwpHQ6uV1LKH50m92MbOWfCtjU9p/x
qhNpQQ1AZhqNy5Gevap5k8XzRmjSldNAFZMY7Yv3Gi+nyCwGwpVtBUwhuLzgNFK/
yDtw2WcWmUU7NuC8Q6MWvPebxVtCfVp/iQU6q60yyt6aGOBkhAX0LpKAEhKidixY
nP9PNVBvxgu3XZ4P36gZV6+ummKdBVnc3NqwBLu5+CcdRdusmHPHd5pHf4/38Z3/
6qU2a/fPvWzceVTEgZ47QjFMTCTmCwNt29cvi7zZeQzjtwQgn4ipN9NibRH/Ax/q
TbIzHfrJ1xa2RteWSdFjwtxi9C20HUkjXSeI4YlzQMH0fPX6KCE7aVePTOnB69I/
a9/q96DiXZajwlpq3wFctrs1oXqBp5DVrCIj8hU2wNgB7LtQ1mCtsYz//heai0K9
PhE4X6hiE0YmeAZjR0uHl8M/5aW9xCoJ72+12kKpWAa0SFRWLy6FejNYCYpkupVJ
yecLk/4L1W0l6jQQZnWErXZYe0PNFcmwGXy1Rep83kfBRNKRy5tvocalLlwXLdUk
AIU+2GKjyT3iMuzZxxFxPFMCAwEAAQ==
-----END PUBLIC KEY-----`

	block, _ := pem.Decode([]byte(pubPEM))
	if block == nil {
		panic("failed to parse PEM block containing the public key")
	}

	pub, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		panic("failed to parse DER encoded public key: " + err.Error())
	}

	switch pub := pub.(type) {
	case *rsa.PublicKey:
		fmt.Println("pub is of type RSA:", pub)
	case *dsa.PublicKey:
		fmt.Println("pub is of type DSA:", pub)
	case *ecdsa.PublicKey:
		fmt.Println("pub is of type ECDSA:", pub)
	default:
		panic("unknown type of public key")
	}
}

CertPool 是一组证书。

type CertPool struct {
        // 包含已过滤或未导出的字段
}

func NewCertPool(查看源代码)

func NewCertPool() *CertPool

NewCertPool 返回一个新的空 CertPool。

func SystemCertPool(查看源代码)

func SystemCertPool() (*CertPool, error)

SystemCertPool 返回系统证书池的副本。

对返回的池的任何突变都不会写入磁盘,也不会影响任何其他池。

func (*CertPool) AddCert(查看源代码)

func (s *CertPool) AddCert(cert *Certificate)

AddCert 将证书添加到池中。

func (*CertPool) AppendCertsFromPEM(查看源代码)

func (s *CertPool) AppendCertsFromPEM(pemCerts []byte) (ok bool)

AppendCertsFromPEM 尝试解析一系列 PEM 编码的证书。它追加找到的任何证书并报告是否成功解析了任何证书。

在许多 Linux 系统上,/etc/ssl/cert.pem 将以适合此功能的格式包含全系列根 CA。

func (*CertPool) Subjects(查看源代码)

func (s *CertPool) Subjects() [][]byte

主题将返回池中所有证书的 DER 编码主题的列表。

type Certificate(查看源代码)

证书代表 X.509 证书。

type Certificate struct {
        Raw                     []byte // 完整的ASN.1 DER内容(证书,签名算法和签名)。
        RawTBSCertificate       []byte // 原始ASN.1 DER内容的证书部分。
        RawSubjectPublicKeyInfo []byte // DER编码的SubjectPublicKeyInfo。 
        RawSubject              []byte // DER编码主题
        RawIssuer               []byte // DER编码发行者

        Signature          []byte
        SignatureAlgorithm SignatureAlgorithm

        PublicKeyAlgorithm PublicKeyAlgorithm
        PublicKey          interface{}

        Version             int
        SerialNumber        *big.Int
        Issuer              pkix.Name
        Subject             pkix.Name
        NotBefore, NotAfter time.Time // 有效期限。
        KeyUsage            KeyUsage

        // 扩展包含原始X.509扩展。 解析证书时,
        // 这可用于提取非关键扩展
        // 由此包解析。 编组证书时,扩展名(Extensions)
        // 字段被忽略,请参阅ExtraExtensions。
        Extensions []pkix.Extension

        // ExtraExtensions包含要复制的原始扩展名
        // 编组证书。 值会覆盖任何扩展名
        // 否则将根据其他字段生成。 ExtraExtensions
        // 解析证书时未填充字段,请参阅扩展(Extensions)。
        ExtraExtensions []pkix.Extension

        // UnhandledCriticalExtensions包含一个扩展ID列表
        // 解析时没有(完全)处理。 如果这样,验证将失败
        // 除非将验证委托给操作系统,否则slice不为空
        // 了解所有关键扩展的库。
        //
        // 用户可以使用扩展程序访问这些扩展程序,并可以删除
        // 如果他们相信他们已经存在,那么这片中的元素
        // 被处理了。
        UnhandledCriticalExtensions []asn1.ObjectIdentifier

        ExtKeyUsage        []ExtKeyUsage           // 扩展密钥用法的顺序。
        UnknownExtKeyUsage []asn1.ObjectIdentifier // 遇到此软件包未知的扩展密钥用法。

        // BasicConstraintsValid表示IsCA,MaxPathLen,
        // 和MaxPathLenZero有效。
        BasicConstraintsValid bool
        IsCA                  bool

        // MaxPathLen和MaxPathLenZero表示存在和
        // BasicConstraints的“pathLenConstraint”的值。
        //
        // 解析证书时,正零非MaxPathLen
        // 表示该字段已指定,-1表示未设置该字段,
        // 和MaxPathLenZero是真的意味着该领域
        // 明确设置为零。 MaxPathLen == 0,MaxPathLenZero == false
        // 应该被视为等于-1(未设置)。
        //
        // 生成证书时,取消设置pathLenConstraint
        // 可以使用MaxPathLen == -1或使用
        // MaxPathLen和MaxPathLenZero均为零值。
        MaxPathLen int
        // MaxPathLenZero表示BasicConstraintsValid == true
        // 和MaxPathLen == 0应解释为实际
        // 最大路径长度为零。 否则,那个组合就是
        // 解释为未设置MaxPathLen。
        MaxPathLenZero bool

        SubjectKeyId   []byte
        AuthorityKeyId []byte

        // RFC 5280, 4.2.2.1 (权限信息访问)
        OCSPServer            []string
        IssuingCertificateURL []string

        // 主题备用名称值
        DNSNames       []string
        EmailAddresses []string
        IPAddresses    []net.IP

        //名称限制
        PermittedDNSDomainsCritical bool // 如果为true,则名称约束标记为关键。
        PermittedDNSDomains         []string
        ExcludedDNSDomains          []string

        // CRL分发点
        CRLDistributionPoints []string

        PolicyIdentifiers []asn1.ObjectIdentifier
}

func ParseCertificate(查看源代码)

func ParseCertificate(asn1Data []byte) (*Certificate, error)

ParseCertificate 从给定的 ASN.1 DER 数据中解析单个证书。

func (*Certificate) CheckCRLSignature(查看源代码)

func (c *Certificate) CheckCRLSignature(crl *pkix.CertificateList) error

CheckCRLSignature 检查 crl 中的签名来自c。

func (*Certificate) CheckSignature(查看源代码)

func (c *Certificate) CheckSignature(algo SignatureAlgorithm, signed, signature []byte) error

CheckSignature 验证签名是从c的公钥上签名的有效签名。

func (*Certificate) CheckSignatureFrom(查看源代码)

func (c *Certificate) CheckSignatureFrom(parent *Certificate) error

CheckSignatureFrom 验证c上的签名是来自父项的有效签名。

func (*Certificate) CreateCRL(查看源代码)

func (c *Certificate) CreateCRL(rand io.Reader, priv interface{}, revokedCerts []pkix.RevokedCertificate, now, expiry time.Time) (crlBytes []byte, err error)

CreateCRL 返回一个由此证书签名的 DER 编码的 CRL,其中包含已撤销证书的给定列表。

func (*Certificate) Equal(查看源代码)

func (c *Certificate) Equal(other *Certificate) bool

func (*Certificate) Verify(查看源代码)

func (c *Certificate) Verify(opts VerifyOptions) (chains [][]*Certificate, err error)

验证尝试验证c通过构建一个或多个链从c到 opts.Roots 中的证书,在 opts 中使用证书。如果需要,还需要中间件。如果成功,它将返回一个或多个链,其中链的第一个元素是c,最后一个元素来自 opts.Roots。

如果 opts.Roots 为零,并且系统根目录不可用,则返回的错误将是 SystemRootsError 类型。

警告:这不会做任何撤销检查。

示例

package main

import (
	"crypto/x509"
	"encoding/pem"
)

func main() {
	// 使用自定义根证书列表进行验证。

	const rootPEM = `
-----BEGIN CERTIFICATE-----
MIIEBDCCAuygAwIBAgIDAjppMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMTMwNDA1MTUxNTU1WhcNMTUwNDA0MTUxNTU1WjBJMQswCQYDVQQG
EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy
bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP
VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv
h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE
ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ
EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC
DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB+zCB+DAfBgNVHSMEGDAWgBTAephojYn7
qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wEgYD
VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMwMTAvoC2g
K4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9ndGdsb2JhbC5jcmwwPQYI
KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vZ3RnbG9iYWwtb2NzcC5n
ZW90cnVzdC5jb20wFwYDVR0gBBAwDjAMBgorBgEEAdZ5AgUBMA0GCSqGSIb3DQEB
BQUAA4IBAQA21waAESetKhSbOHezI6B1WLuxfoNCunLaHtiONgaX4PCVOzf9G0JY
/iLIa704XtE7JW4S615ndkZAkNoUyHgN7ZVm2o6Gb4ChulYylYbc3GrKBIxbf/a/
zG+FA1jDaFETzf3I93k9mTXwVqO94FntT0QJo544evZG0R0SnU++0ED8Vf4GXjza
HFa9llF7b1cq26KqltyMdMKVvvBulRP/F/A8rLIQjcxz++iPAsbw+zOzlTvjwsto
WHPbqCRiOwY1nQ2pM714A5AuTHhdUDqB1O6gyHA43LL5Z/qHQF1hwFGPa4NrzQU6
yuGnBXj8ytqU0CwIPX4WecigUCAkVDNx
-----END CERTIFICATE-----`

	const certPEM = `
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgIIE31FZVaPXTUwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwMTI5MTMyNzQzWhcNMTQwNTI5MDAwMDAw
WjBpMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEYMBYGA1UEAwwPbWFp
bC5nb29nbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfRrObuSW5T7q
5CnSEqefEmtH4CCv6+5EckuriNr1CjfVvqzwfAhopXkLrq45EQm8vkmf7W96XJhC
7ZM0dYi1/qOCAU8wggFLMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAa
BgNVHREEEzARgg9tYWlsLmdvb2dsZS5jb20wCwYDVR0PBAQDAgeAMGgGCCsGAQUF
BwEBBFwwWjArBggrBgEFBQcwAoYfaHR0cDovL3BraS5nb29nbGUuY29tL0dJQUcy
LmNydDArBggrBgEFBQcwAYYfaHR0cDovL2NsaWVudHMxLmdvb2dsZS5jb20vb2Nz
cDAdBgNVHQ4EFgQUiJxtimAuTfwb+aUtBn5UYKreKvMwDAYDVR0TAQH/BAIwADAf
BgNVHSMEGDAWgBRK3QYWG7z2aLV29YG2u2IaulqBLzAXBgNVHSAEEDAOMAwGCisG
AQQB1nkCBQEwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29nbGUuY29t
L0dJQUcyLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAH6RYHxHdcGpMpFE3oxDoFnP+
gtuBCHan2yE2GRbJ2Cw8Lw0MmuKqHlf9RSeYfd3BXeKkj1qO6TVKwCh+0HdZk283
TZZyzmEOyclm3UGFYe82P/iDFt+CeQ3NpmBg+GoaVCuWAARJN/KfglbLyyYygcQq
0SgeDh8dRKUiaW3HQSoYvTvdTuqzwK4CXsr3b5/dAOY8uMuG/IAR3FgwTbZ1dtoW
RvOTa8hYiU6A475WuZKyEHcwnGYe57u2I2KbMgcKjPniocj4QzgYsVAVKW3IwaOh
yE+vPxsiUkvQHdO2fojCkY8jg70jxM+gu59tPDNbw3Uh/2Ij310FgTHsnGQMyA==
-----END CERTIFICATE-----`

	// 首先,创建一组根证书。 对于这个例子我们只
	// 有一个。 也可以省略这个以便使用
	// 当前操作系统的默认根集。
	roots := x509.NewCertPool()
	ok := roots.AppendCertsFromPEM([]byte(rootPEM))
	if !ok {
		panic("failed to parse root certificate")
	}

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

	opts := x509.VerifyOptions{
		DNSName: "mail.google.com",
		Roots:   roots,
	}

	if _, err := cert.Verify(opts); err != nil {
		panic("failed to verify certificate: " + err.Error())
	}
}

func (*Certificate) VerifyHostname(查看源代码)

func (c *Certificate) VerifyHostname(h string) error

如果c是指定主机的有效证书,则 VerifyHostname 返回 nil。否则,它会返回描述不匹配的错误。

type CertificateInvalidError(查看源代码)

发生奇怪错误时会导致 CertificateInvalidError 错误。这个库的用户可能希望统一处理所有这些错误。

type CertificateInvalidError struct {
        Cert   *Certificate
        Reason InvalidReason
}

func (CertificateInvalidError) Error(查看源代码)

func (e CertificateInvalidError) Error() string

type CertificateRequest(查看源代码)

CertificateRequest 表示 PKCS#10,证书签名请求。

type CertificateRequest struct {
        Raw                      []byte // 完整的ASN.1 DER内容(CSR,签名算法和签名)。
        RawTBSCertificateRequest []byte // 证书请求信息是原始ASN.1 DER内容的一部分。
        RawSubjectPublicKeyInfo  []byte // DER编码的SubjectPublicKeyInfo。
        RawSubject               []byte // DER编码主题。
        Version            int
        Signature          []byte
        SignatureAlgorithm SignatureAlgorithm

        PublicKeyAlgorithm PublicKeyAlgorithm
        PublicKey          interface{}

        Subject pkix.Name

        // 属性是bugs的干燥外壳,不应使用。
        Attributes []pkix.AttributeTypeAndValueSET

        // 扩展包含原始X.509扩展。 解析CSR时,这个
        // 可用于提取未解析的扩展
        // 包。
        Extensions []pkix.Extension

        // ExtraExtensions包含要复制的原始扩展名
        // marshaled CSR。 值会覆盖否则将覆盖的任何扩展
        // 基于其他领域产出,但被任何领域覆盖
        // 在Attributes中指定的扩展名。
        //
        // 解析CSR时未填充ExtraExtensions字段,请参阅
        // Extensions。
        ExtraExtensions []pkix.Extension

        // 主题备用名称值。
        DNSNames       []string
        EmailAddresses []string
        IPAddresses    []net.IP
}

func ParseCertificateRequest(查看源代码)

func ParseCertificateRequest(asn1Data []byte) (*CertificateRequest, error)

ParseCertificateRequest 解析来自给定 ASN.1 DER 数据的单个证书请求。

func (*CertificateRequest) CheckSignature(查看源代码)

func (c *CertificateRequest) CheckSignature() error

CheckSignature 报告c上的签名是否有效。

type ConstraintViolationError(查看源代码)

当证书不允许请求的使用情况时,会导致 ConstraintViolationError。例如:在公钥不是证书签名密钥时检查签名。

type ConstraintViolationError struct{}

func (ConstraintViolationError) Error(查看源代码)

func (ConstraintViolationError) Error() string

type ExtKeyUsage(查看源代码)

ExtKeyUsage 表示对给定键有效的一组扩展操作。每个 ExtKeyUsage* 常量定义一个独特的动作。

type ExtKeyUsage int
const (
        ExtKeyUsageAny ExtKeyUsage = iota
        ExtKeyUsageServerAuth
        ExtKeyUsageClientAuth
        ExtKeyUsageCodeSigning
        ExtKeyUsageEmailProtection
        ExtKeyUsageIPSECEndSystem
        ExtKeyUsageIPSECTunnel
        ExtKeyUsageIPSECUser
        ExtKeyUsageTimeStamping
        ExtKeyUsageOCSPSigning
        ExtKeyUsageMicrosoftServerGatedCrypto
        ExtKeyUsageNetscapeServerGatedCrypto
)

type HostnameError(查看源代码)

HostnameError 在授权名称集与请求名称不匹配时产生。

type HostnameError struct {
        Certificate *Certificate
        Host        string
}

func (HostnameError) Error(查看源代码)

func (h HostnameError) Error() string

type InsecureAlgorithmError(查看源代码)

一个 InsecureAlgorithmError

type InsecureAlgorithmError SignatureAlgorithm

func (InsecureAlgorithmError) Error(查看源代码)

func (e InsecureAlgorithmError) Error() string

type InvalidReason(查看源代码)

type InvalidReason int
const (
        // 当另一个证书签署证书时,NotAuthorizedToSign会生成结果
        // 未标记为CA证书。
        NotAuthorizedToSign InvalidReason = iota
        // 证书过期时根据时间过期的结果
        // 在VerifyOptions中给出。
        Expired
        // 当中间或根时,结果为CANotAuthorizedForThisName
        // certificate具有名称约束,不包括名称
        // 被检查。
        CANotAuthorizedForThisName
        // 当路径长度约束为时,TooManyIntermediates结果
        // 被侵犯。
        TooManyIntermediates
        // 证书的密钥用法表示不兼容的使用结果
        // 它可能只用于不同的目的。
        IncompatibleUsage
        // 当父证书的主题名称时,NameMismatch结果
        // 与子项中的颁发者名称不匹配。
        NameMismatch
)

KeyUsage 表示对给定密钥有效的一组操作。这是一个 KeyUsage* 常量的位图。

type KeyUsage int
const (
        KeyUsageDigitalSignature KeyUsage = 1 << iota
        KeyUsageContentCommitment
        KeyUsageKeyEncipherment
        KeyUsageDataEncipherment
        KeyUsageKeyAgreement
        KeyUsageCertSign
        KeyUsageCRLSign
        KeyUsageEncipherOnly
        KeyUsageDecipherOnly
)

type PEMCipher(查看源代码)

type PEMCipher int

EncryptPEMBlock 加密算法的可能值。

const (
        PEMCipherDES PEMCipher
        PEMCipher3DES
        PEMCipherAES128
        PEMCipherAES192
        PEMCipherAES256
)

type PublicKeyAlgorithm(查看源代码)

type PublicKeyAlgorithm int
const (
        UnknownPublicKeyAlgorithm PublicKeyAlgorithm = iota
        RSA
        DSA
        ECDSA
)

type SignatureAlgorithm(查看源代码)

type SignatureAlgorithm int
const (
        UnknownSignatureAlgorithm SignatureAlgorithm = iota
        MD2WithRSA
        MD5WithRSA
        SHA1WithRSA
        SHA256WithRSA
        SHA384WithRSA
        SHA512WithRSA
        DSAWithSHA1
        DSAWithSHA256
        ECDSAWithSHA1
        ECDSAWithSHA256
        ECDSAWithSHA384
        ECDSAWithSHA512
        SHA256WithRSAPSS
        SHA384WithRSAPSS
        SHA512WithRSAPSS
)

func (SignatureAlgorithm) String(查看源代码)

func (algo SignatureAlgorithm) String() string

type SystemRootsError(查看源代码)

当我们加载系统根证书失败时,会导致 SystemRootsError 错误。

type SystemRootsError struct {
        Err error
}

func (SystemRootsError) Error(查看源代码)

func (se SystemRootsError) Error() string

type UnhandledCriticalExtension(查看源代码)

type UnhandledCriticalExtension struct{}

func (UnhandledCriticalExtension) Error(查看源代码)

func (h UnhandledCriticalExtension) Error() string

type UnknownAuthorityError(查看源代码)

UnknownAuthorityError 在证书颁发者未知时导致

type UnknownAuthorityError struct {
        Cert *Certificate
        // 包含已过滤或未导出的字段
}

func (UnknownAuthorityError) Error(查看源代码)

func (e UnknownAuthorityError) Error() string

type VerifyOptions(查看源代码)

VerifyOptions 包含 Certificate.Verify 的参数。这是一个结构,因为其他 PKIX 验证 API 最终需要许多选项。

type VerifyOptions struct {
        DNSName       string
        Intermediates *CertPool
        Roots         *CertPool // 如果为nil(零),则使用系统根
        CurrentTime   time.Time // 如果为零,则使用当前时间
        // KeyUsage指定可接受的扩展密钥用法值。
        // 空列表表示ExtKeyUsageServerAuth。 密钥用法被认为是
        // 约束反映Windows CryptoAPI行为的链,
        // 但不是规范。 要接受任何密钥用法,请包括ExtKeyUsageAny。
        KeyUsages []ExtKeyUsage
}

Subdirectories

名称

概要

pkix

pkix包包含用于ASN.1解析和序列化X.509证书,CRL和OCSP的共享低级别结构。

扫码关注腾讯云开发者

领取腾讯云代金券