?
This document uses PHP Chinese website manual Release
import "crypto/x509"
概述
索引
示例
子目錄
軟件包x509 分析 X.509 編碼的密鑰和證書(shū)。
在 UNIX 系統(tǒng)上,環(huán)境變量 SSL_CERT_FILE和SSL_CERT_DIR 可分別用于覆蓋 SSL 證書(shū)文件和 SSL 證書(shū)文件目錄的系統(tǒng)默認(rèn)位置。
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
cert_pool.go pem_decrypt.go pkcs1.go pkcs8.go root.go root_linux.go root_unix.go sec1.go verify.go x509.go
ErrUnsupportedAlgorithm 是嘗試執(zhí)行涉及當(dāng)前未實(shí)現(xiàn)的算法的操作的結(jié)果。
var ErrUnsupportedAlgorithm = errors.New("x509: cannot verify signature: algorithm unimplemented")
當(dāng)檢測(cè)到不正確的密碼時(shí),返回 IncorrectPasswordError。
var IncorrectPasswordError = errors.New("x509: decryption password incorrect")
func CreateCertificate(rand io.Reader, template, parent *Certificate, pub, priv interface{}) (cert []byte, err error)
CreateCertificate 根據(jù)模板創(chuàng)建一個(gè)新的證書(shū)。使用以下模板成員:AuthorityKeyId,BasicConstraintsValid,DNSNames,ExcludedDNSDomains,ExtKeyUsage,IsCA,KeyUsage,MaxPathLen,MaxPathLenZero,NotAfter,NotBefore,PermittedDNSDomains,PermittedDNSDomainsCritical,SerialNumber,SignatureAlgorithm,Subject,SubjectKeyId和UnknownExtKeyUsage。
該證書(shū)由 parent 簽署。如果 parent 等于模板,則證書(shū)是自簽名的。參數(shù) pub 是簽名者的公鑰,priv 是簽名者的私鑰。
返回的片是 DER 編碼中的證書(shū)。
支持通過(guò) crypto.Signer 實(shí)現(xiàn)的所有密鑰類型(包括 *rsa.PublicKey 和 *ecdsa.PublicKey。)
AuthorityKeyId 將取自父級(jí)的 SubjectKeyId(如果有),除非生成的證書(shū)是自簽名的。否則,將使用來(lái)自模板的值。
func CreateCertificateRequest(rand io.Reader, template *CertificateRequest, priv interface{}) (csr []byte, err error)
CreateCertificateRequest 根據(jù)模板創(chuàng)建一個(gè)新的證書(shū)請(qǐng)求。使用以下模板成員:屬性,DNS 名稱,EmailAddresses,ExtraExtensions,IPAddresses,SignatureAlgorithm 和 Subject。私鑰是簽名者的私鑰。
返回的片是 DER 編碼中的證書(shū)請(qǐng)求。
所有通過(guò) crypto.Signer 實(shí)現(xiàn)的密鑰類型都受支持(包括 *rsa.PublicKey 和 *ecdsa.PublicKey。)
func DecryptPEMBlock(b *pem.Block, password []byte) ([]byte, error)
DecryptPEMBlock 采用密碼加密的PEM塊和用于加密它的密碼并返回一段 DER 編碼字節(jié)解密。它檢查 DEK-Info 頭以確定用于解密的算法。如果不存在 DEK-Info 標(biāo)頭,則返回錯(cuò)誤。如果檢測(cè)到不正確的密碼,則返回 IncorrectPasswordError。由于加密 PEM 格式的不足,檢測(cè)不正確的密碼并不總是可能的。在這些情況下,不會(huì)返回錯(cuò)誤,但解密的 DER 字節(jié)將是隨機(jī)噪聲。
func EncryptPEMBlock(rand io.Reader, blockType string, data, password []byte, alg PEMCipher) (*pem.Block, error)
EncryptPEMBlock 返回一個(gè)指定類型的 PEM 塊,其中包含用給定算法和密碼加密的給定 DER 編碼數(shù)據(jù)。
func IsEncryptedPEMBlock(b *pem.Block) bool
如果 PEM 塊被密碼加密,則返回 IsEncryptedPEMBlock 。
func MarshalECPrivateKey(key *ecdsa.PrivateKey) ([]byte, error)
MarshalECPrivateKey 將 EC 私鑰編組為 ASN.1 DER 格式。
func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte
MarshalPKCS1PrivateKey 將私鑰轉(zhuǎn)換為 ASN.1 DER 編碼形式。
func MarshalPKIXPublicKey(pub interface{}) ([]byte, error)
MarshalPKIXPublicKey 將公鑰序列化為 DER 編碼的 PKIX 格式。
func ParseCRL(crlBytes []byte) (*pkix.CertificateList, error)
ParseCRL 從給定字節(jié)分析 CRL。通常情況下,PEM 編碼的 CRL 將出現(xiàn)在 DER 編碼的位置,所以只要沒(méi)有任何前導(dǎo)垃圾,該函數(shù)就會(huì)透明地處理 PEM 編碼。
func ParseCertificates(asn1Data []byte) ([]*Certificate, error)
ParseCertificates從給定的ASN.1 DER數(shù)據(jù)中解析一個(gè)或多個(gè)證書(shū)。證書(shū)必須連接在一起,沒(méi)有中間填充。
func ParseDERCRL(derBytes []byte) (*pkix.CertificateList, error)
ParseDERCRL 從給定字節(jié)分析 DER 編碼的 CRL。
func ParseECPrivateKey(der []byte) (*ecdsa.PrivateKey, error)
ParseECPrivateKey 解析 ASN.1 橢圓曲線私鑰結(jié)構(gòu)。
func ParsePKCS1PrivateKey(der []byte) (*rsa.PrivateKey, error)
ParsePKCS1PrivateKey 從其 ASN.1 PKCS#1 DER 編碼形式返回一個(gè) RSA 私鑰。
func ParsePKCS8PrivateKey(der []byte) (key interface{}, err error)
ParsePKCS8PrivateKey 分析未加密的 PKCS#8 私鑰。請(qǐng)參閱 RFC 5208。
func ParsePKIXPublicKey(derBytes []byte) (pub interface{}, err error)
ParsePKIXPublicKey 分析 DER 編碼的公鑰。這些值通常在具有“開(kāi)始公鑰”的 PEM 塊中找到。
支持的密鑰類型包括 RSA,DSA 和 ECDSA。未知的密鑰類型會(huì)導(dǎo)致錯(cuò)誤。
成功后,pub將是 *rsa.PublicKey,*dsa.PublicKey 或 *ecdsa.PublicKey 類型。
package mainimport ("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 是一組證書(shū)。
type CertPool struct { // 包含已過(guò)濾或未導(dǎo)出的字段}
func NewCertPool() *CertPool
NewCertPool 返回一個(gè)新的空 CertPool。
func SystemCertPool() (*CertPool, error)
SystemCertPool 返回系統(tǒng)證書(shū)池的副本。
對(duì)返回的池的任何突變都不會(huì)寫(xiě)入磁盤(pán),也不會(huì)影響任何其他池。
func (s *CertPool) AddCert(cert *Certificate)
AddCert 將證書(shū)添加到池中。
func (s *CertPool) AppendCertsFromPEM(pemCerts []byte) (ok bool)
AppendCertsFromPEM 嘗試解析一系列 PEM 編碼的證書(shū)。它追加找到的任何證書(shū)并報(bào)告是否成功解析了任何證書(shū)。
在許多 Linux 系統(tǒng)上,/etc/ssl/cert.pem 將以適合此功能的格式包含全系列根 CA。
func (s *CertPool) Subjects() [][]byte
主題將返回池中所有證書(shū)的 DER 編碼主題的列表。
證書(shū)代表 X.509 證書(shū)。
type Certificate struct { Raw []byte // 完整的ASN.1 DER內(nèi)容(證書(shū),簽名算法和簽名)。 RawTBSCertificate []byte // 原始ASN.1 DER內(nèi)容的證書(shū)部分。 RawSubjectPublicKeyInfo []byte // DER編碼的SubjectPublicKeyInfo。 RawSubject []byte // DER編碼主題 RawIssuer []byte // DER編碼發(fā)行者 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 // 擴(kuò)展包含原始X.509擴(kuò)展。 解析證書(shū)時(shí), // 這可用于提取非關(guān)鍵擴(kuò)展 // 由此包解析。 編組證書(shū)時(shí),擴(kuò)展名(Extensions) // 字段被忽略,請(qǐng)參閱ExtraExtensions。 Extensions []pkix.Extension // ExtraExtensions包含要復(fù)制的原始擴(kuò)展名 // 編組證書(shū)。 值會(huì)覆蓋任何擴(kuò)展名 // 否則將根據(jù)其他字段生成。 ExtraExtensions // 解析證書(shū)時(shí)未填充字段,請(qǐng)參閱擴(kuò)展(Extensions)。 ExtraExtensions []pkix.Extension // UnhandledCriticalExtensions包含一個(gè)擴(kuò)展ID列表 // 解析時(shí)沒(méi)有(完全)處理。 如果這樣,驗(yàn)證將失敗 // 除非將驗(yàn)證委托給操作系統(tǒng),否則slice不為空 // 了解所有關(guān)鍵擴(kuò)展的庫(kù)。 // // 用戶可以使用擴(kuò)展程序訪問(wèn)這些擴(kuò)展程序,并可以刪除 // 如果他們相信他們已經(jīng)存在,那么這片中的元素 // 被處理了。 UnhandledCriticalExtensions []asn1.ObjectIdentifier ExtKeyUsage []ExtKeyUsage // 擴(kuò)展密鑰用法的順序。 UnknownExtKeyUsage []asn1.ObjectIdentifier // 遇到此軟件包未知的擴(kuò)展密鑰用法。 // BasicConstraintsValid表示IsCA,MaxPathLen, // 和MaxPathLenZero有效。 BasicConstraintsValid bool IsCA bool // MaxPathLen和MaxPathLenZero表示存在和 // BasicConstraints的“pathLenConstraint”的值。 // // 解析證書(shū)時(shí),正零非MaxPathLen // 表示該字段已指定,-1表示未設(shè)置該字段, // 和MaxPathLenZero是真的意味著該領(lǐng)域 // 明確設(shè)置為零。 MaxPathLen == 0,MaxPathLenZero == false // 應(yīng)該被視為等于-1(未設(shè)置)。 // // 生成證書(shū)時(shí),取消設(shè)置pathLenConstraint // 可以使用MaxPathLen == -1或使用 // MaxPathLen和MaxPathLenZero均為零值。 MaxPathLen int // MaxPathLenZero表示BasicConstraintsValid == true // 和MaxPathLen == 0應(yīng)解釋為實(shí)際 // 最大路徑長(zhǎng)度為零。 否則,那個(gè)組合就是 // 解釋為未設(shè)置MaxPathLen。 MaxPathLenZero bool SubjectKeyId []byte AuthorityKeyId []byte // RFC 5280, 4.2.2.1 (權(quán)限信息訪問(wèn)) OCSPServer []string IssuingCertificateURL []string // 主題備用名稱值 DNSNames []string EmailAddresses []string IPAddresses []net.IP //名稱限制 PermittedDNSDomainsCritical bool // 如果為true,則名稱約束標(biāo)記為關(guān)鍵。 PermittedDNSDomains []string ExcludedDNSDomains []string // CRL分發(fā)點(diǎn) CRLDistributionPoints []string PolicyIdentifiers []asn1.ObjectIdentifier}
func ParseCertificate(asn1Data []byte) (*Certificate, error)
ParseCertificate 從給定的 ASN.1 DER 數(shù)據(jù)中解析單個(gè)證書(shū)。
func (c *Certificate) CheckCRLSignature(crl *pkix.CertificateList) error
CheckCRLSignature 檢查 crl 中的簽名來(lái)自c。
func (c *Certificate) CheckSignature(algo SignatureAlgorithm, signed, signature []byte) error
CheckSignature 驗(yàn)證簽名是從c的公鑰上簽名的有效簽名。
func (c *Certificate) CheckSignatureFrom(parent *Certificate) error
CheckSignatureFrom 驗(yàn)證c上的簽名是來(lái)自父項(xiàng)的有效簽名。
func (c *Certificate) CreateCRL(rand io.Reader, priv interface{}, revokedCerts []pkix.RevokedCertificate, now, expiry time.Time) (crlBytes []byte, err error)
CreateCRL 返回一個(gè)由此證書(shū)簽名的 DER 編碼的 CRL,其中包含已撤銷(xiāo)證書(shū)的給定列表。
func (c *Certificate) Equal(other *Certificate) bool
func (c *Certificate) Verify(opts VerifyOptions) (chains [][]*Certificate, err error)
驗(yàn)證嘗試驗(yàn)證c通過(guò)構(gòu)建一個(gè)或多個(gè)鏈從c到 opts.Roots 中的證書(shū),在 opts 中使用證書(shū)。如果需要,還需要中間件。如果成功,它將返回一個(gè)或多個(gè)鏈,其中鏈的第一個(gè)元素是c,最后一個(gè)元素來(lái)自 opts.Roots。
如果 opts.Roots 為零,并且系統(tǒng)根目錄不可用,則返回的錯(cuò)誤將是 SystemRootsError 類型。
警告:這不會(huì)做任何撤銷(xiāo)檢查。
package mainimport ("crypto/x509""encoding/pem")func main() {// 使用自定義根證書(shū)列表進(jìn)行驗(yàn)證。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-----`// 首先,創(chuàng)建一組根證書(shū)。 對(duì)于這個(gè)例子我們只// 有一個(gè)。 也可以省略這個(gè)以便使用// 當(dāng)前操作系統(tǒng)的默認(rèn)根集。 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 (c *Certificate) VerifyHostname(h string) error
如果c是指定主機(jī)的有效證書(shū),則 VerifyHostname 返回 nil。否則,它會(huì)返回描述不匹配的錯(cuò)誤。
發(fā)生奇怪錯(cuò)誤時(shí)會(huì)導(dǎo)致 CertificateInvalidError 錯(cuò)誤。這個(gè)庫(kù)的用戶可能希望統(tǒng)一處理所有這些錯(cuò)誤。
type CertificateInvalidError struct { Cert *Certificate Reason InvalidReason}
func (e CertificateInvalidError) Error() string
CertificateRequest 表示 PKCS#10,證書(shū)簽名請(qǐng)求。
type CertificateRequest struct { Raw []byte // 完整的ASN.1 DER內(nèi)容(CSR,簽名算法和簽名)。 RawTBSCertificateRequest []byte // 證書(shū)請(qǐng)求信息是原始ASN.1 DER內(nèi)容的一部分。 RawSubjectPublicKeyInfo []byte // DER編碼的SubjectPublicKeyInfo。 RawSubject []byte // DER編碼主題。 Version int Signature []byte SignatureAlgorithm SignatureAlgorithm PublicKeyAlgorithm PublicKeyAlgorithm PublicKey interface{} Subject pkix.Name // 屬性是bugs的干燥外殼,不應(yīng)使用。 Attributes []pkix.AttributeTypeAndValueSET // 擴(kuò)展包含原始X.509擴(kuò)展。 解析CSR時(shí),這個(gè) // 可用于提取未解析的擴(kuò)展 // 包。 Extensions []pkix.Extension // ExtraExtensions包含要復(fù)制的原始擴(kuò)展名 // marshaled CSR。 值會(huì)覆蓋否則將覆蓋的任何擴(kuò)展 // 基于其他領(lǐng)域產(chǎn)出,但被任何領(lǐng)域覆蓋 // 在Attributes中指定的擴(kuò)展名。 // // 解析CSR時(shí)未填充ExtraExtensions字段,請(qǐng)參閱 // Extensions。 ExtraExtensions []pkix.Extension // 主題備用名稱值。 DNSNames []string EmailAddresses []string IPAddresses []net.IP}
func ParseCertificateRequest(asn1Data []byte) (*CertificateRequest, error)
ParseCertificateRequest 解析來(lái)自給定 ASN.1 DER 數(shù)據(jù)的單個(gè)證書(shū)請(qǐng)求。
func (c *CertificateRequest) CheckSignature() error
CheckSignature 報(bào)告c上的簽名是否有效。
當(dāng)證書(shū)不允許請(qǐng)求的使用情況時(shí),會(huì)導(dǎo)致 ConstraintViolationError。例如:在公鑰不是證書(shū)簽名密鑰時(shí)檢查簽名。
type ConstraintViolationError struct{}
func (ConstraintViolationError) Error() string
ExtKeyUsage 表示對(duì)給定鍵有效的一組擴(kuò)展操作。每個(gè) ExtKeyUsage* 常量定義一個(gè)獨(dú)特的動(dòng)作。
type ExtKeyUsage int
const ( ExtKeyUsageAny ExtKeyUsage = iota ExtKeyUsageServerAuth ExtKeyUsageClientAuth ExtKeyUsageCodeSigning ExtKeyUsageEmailProtection ExtKeyUsageIPSECEndSystem ExtKeyUsageIPSECTunnel ExtKeyUsageIPSECUser ExtKeyUsageTimeStamping ExtKeyUsageOCSPSigning ExtKeyUsageMicrosoftServerGatedCrypto ExtKeyUsageNetscapeServerGatedCrypto)
HostnameError 在授權(quán)名稱集與請(qǐng)求名稱不匹配時(shí)產(chǎn)生。
type HostnameError struct { Certificate *Certificate Host string}
func (h HostnameError) Error() string
一個(gè) InsecureAlgorithmError
type InsecureAlgorithmError SignatureAlgorithm
func (e InsecureAlgorithmError) Error() string
type InvalidReason int
const ( // 當(dāng)另一個(gè)證書(shū)簽署證書(shū)時(shí),NotAuthorizedToSign會(huì)生成結(jié)果 // 未標(biāo)記為CA證書(shū)。 NotAuthorizedToSign InvalidReason = iota // 證書(shū)過(guò)期時(shí)根據(jù)時(shí)間過(guò)期的結(jié)果 // 在VerifyOptions中給出。 Expired // 當(dāng)中間或根時(shí),結(jié)果為CANotAuthorizedForThisName // certificate具有名稱約束,不包括名稱 // 被檢查。 CANotAuthorizedForThisName // 當(dāng)路徑長(zhǎng)度約束為時(shí),TooManyIntermediates結(jié)果 // 被侵犯。 TooManyIntermediates // 證書(shū)的密鑰用法表示不兼容的使用結(jié)果 // 它可能只用于不同的目的。 IncompatibleUsage // 當(dāng)父證書(shū)的主題名稱時(shí),NameMismatch結(jié)果 // 與子項(xiàng)中的頒發(fā)者名稱不匹配。 NameMismatch)
KeyUsage 表示對(duì)給定密鑰有效的一組操作。這是一個(gè) KeyUsage* 常量的位圖。
type KeyUsage int
const ( KeyUsageDigitalSignature KeyUsage = 1 << iota KeyUsageContentCommitment KeyUsageKeyEncipherment KeyUsageDataEncipherment KeyUsageKeyAgreement KeyUsageCertSign KeyUsageCRLSign KeyUsageEncipherOnly KeyUsageDecipherOnly)
type PEMCipher int
EncryptPEMBlock 加密算法的可能值。
const ( PEMCipherDES PEMCipher PEMCipher3DES PEMCipherAES128 PEMCipherAES192 PEMCipherAES256)
type PublicKeyAlgorithm int
const ( UnknownPublicKeyAlgorithm PublicKeyAlgorithm = iota RSA DSA ECDSA)
type SignatureAlgorithm int
const ( UnknownSignatureAlgorithm SignatureAlgorithm = iota MD2WithRSA MD5WithRSA SHA1WithRSA SHA256WithRSA SHA384WithRSA SHA512WithRSA DSAWithSHA1 DSAWithSHA256 ECDSAWithSHA1 ECDSAWithSHA256 ECDSAWithSHA384 ECDSAWithSHA512 SHA256WithRSAPSS SHA384WithRSAPSS SHA512WithRSAPSS)
func (algo SignatureAlgorithm) String() string
當(dāng)我們加載系統(tǒng)根證書(shū)失敗時(shí),會(huì)導(dǎo)致 SystemRootsError 錯(cuò)誤。
type SystemRootsError struct { Err error}
func (se SystemRootsError) Error() string
type UnhandledCriticalExtension struct{}
func (h UnhandledCriticalExtension) Error() string
UnknownAuthorityError 在證書(shū)頒發(fā)者未知時(shí)導(dǎo)致
type UnknownAuthorityError struct { Cert *Certificate // 包含已過(guò)濾或未導(dǎo)出的字段}
func (e UnknownAuthorityError) Error() string
VerifyOptions 包含 Certificate.Verify 的參數(shù)。這是一個(gè)結(jié)構(gòu),因?yàn)槠渌?PKIX 驗(yàn)證 API 最終需要許多選項(xiàng)。
type VerifyOptions struct { DNSName string Intermediates *CertPool Roots *CertPool // 如果為nil(零),則使用系統(tǒng)根 CurrentTime time.Time // 如果為零,則使用當(dāng)前時(shí)間 // KeyUsage指定可接受的擴(kuò)展密鑰用法值。 // 空列表表示ExtKeyUsageServerAuth。 密鑰用法被認(rèn)為是 // 約束反映Windows CryptoAPI行為的鏈, // 但不是規(guī)范。 要接受任何密鑰用法,請(qǐng)包括ExtKeyUsageAny。 KeyUsages []ExtKeyUsage}
名稱 | 概要 |
---|---|
pkix | pkix包包含用于ASN.1解析和序列化X.509證書(shū),CRL和OCSP的共享低級(jí)別結(jié)構(gòu)。 |