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) []byteMarshalPKCS1PrivateKey 将私钥转换为 ASN.1 DER 编码形式。
func MarshalPKIXPublicKey(查看源代码)
func MarshalPKIXPublicKey(pub interface{}) ([]byte, error)MarshalPKIXPublicKey 将公钥序列化为 DER 编码的 PKIX 格式。
func ParseCRL(查看源代码)
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")
}
}type CertPool(查看源代码)
CertPool 是一组证书。
type CertPool struct {
// 包含已过滤或未导出的字段
}func NewCertPool(查看源代码)
func NewCertPool() *CertPoolNewCertPool 返回一个新的空 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) errorCheckCRLSignature 检查 crl 中的签名来自c。
func (*Certificate) CheckSignature(查看源代码)
func (c *Certificate) CheckSignature(algo SignatureAlgorithm, signed, signature []byte) errorCheckSignature 验证签名是从c的公钥上签名的有效签名。
func (*Certificate) CheckSignatureFrom(查看源代码)
func (c *Certificate) CheckSignatureFrom(parent *Certificate) errorCheckSignatureFrom 验证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) boolfunc (*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() stringtype 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() errorCheckSignature 报告c上的签名是否有效。
type ConstraintViolationError(查看源代码)
当证书不允许请求的使用情况时,会导致 ConstraintViolationError。例如:在公钥不是证书签名密钥时检查签名。
type ConstraintViolationError struct{}func (ConstraintViolationError) Error(查看源代码)
func (ConstraintViolationError) Error() stringtype ExtKeyUsage(查看源代码)
ExtKeyUsage 表示对给定键有效的一组扩展操作。每个 ExtKeyUsage* 常量定义一个独特的动作。
type ExtKeyUsage intconst (
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() stringtype InsecureAlgorithmError(查看源代码)
一个 InsecureAlgorithmError
type InsecureAlgorithmError SignatureAlgorithmfunc (InsecureAlgorithmError) Error(查看源代码)
func (e InsecureAlgorithmError) Error() stringtype InvalidReason(查看源代码)
type InvalidReason intconst (
// 当另一个证书签署证书时,NotAuthorizedToSign会生成结果
// 未标记为CA证书。
NotAuthorizedToSign InvalidReason = iota
// 证书过期时根据时间过期的结果
// 在VerifyOptions中给出。
Expired
// 当中间或根时,结果为CANotAuthorizedForThisName
// certificate具有名称约束,不包括名称
// 被检查。
CANotAuthorizedForThisName
// 当路径长度约束为时,TooManyIntermediates结果
// 被侵犯。
TooManyIntermediates
// 证书的密钥用法表示不兼容的使用结果
// 它可能只用于不同的目的。
IncompatibleUsage
// 当父证书的主题名称时,NameMismatch结果
// 与子项中的颁发者名称不匹配。
NameMismatch
)type KeyUsage(查看源代码)
KeyUsage 表示对给定密钥有效的一组操作。这是一个 KeyUsage* 常量的位图。
type KeyUsage intconst (
KeyUsageDigitalSignature KeyUsage = 1 << iota
KeyUsageContentCommitment
KeyUsageKeyEncipherment
KeyUsageDataEncipherment
KeyUsageKeyAgreement
KeyUsageCertSign
KeyUsageCRLSign
KeyUsageEncipherOnly
KeyUsageDecipherOnly
)type PEMCipher(查看源代码)
type PEMCipher intEncryptPEMBlock 加密算法的可能值。
const (
PEMCipherDES PEMCipher
PEMCipher3DES
PEMCipherAES128
PEMCipherAES192
PEMCipherAES256
)type PublicKeyAlgorithm(查看源代码)
type PublicKeyAlgorithm intconst (
UnknownPublicKeyAlgorithm PublicKeyAlgorithm = iota
RSA
DSA
ECDSA
)type SignatureAlgorithm(查看源代码)
type SignatureAlgorithm intconst (
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() stringtype SystemRootsError(查看源代码)
当我们加载系统根证书失败时,会导致 SystemRootsError 错误。
type SystemRootsError struct {
Err error
}func (SystemRootsError) Error(查看源代码)
func (se SystemRootsError) Error() stringtype UnhandledCriticalExtension(查看源代码)
type UnhandledCriticalExtension struct{}func (UnhandledCriticalExtension) Error(查看源代码)
func (h UnhandledCriticalExtension) Error() stringtype UnknownAuthorityError(查看源代码)
UnknownAuthorityError 在证书颁发者未知时导致
type UnknownAuthorityError struct {
Cert *Certificate
// 包含已过滤或未导出的字段
}func (UnknownAuthorityError) Error(查看源代码)
func (e UnknownAuthorityError) Error() stringtype 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的共享低级别结构。 |
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com

