github.com/brimstone/sbuca@v0.0.0-20151202175429-8691d9eba5c5/pkix/csr.go (about) 1 package pkix 2 3 import ( 4 "crypto/rand" 5 "crypto/x509" 6 "encoding/pem" 7 "errors" 8 "io/ioutil" 9 ) 10 11 type CertificateRequest struct { 12 DerBytes []byte 13 14 Csr *x509.CertificateRequest 15 } 16 17 func NewCertificateRequest(key *Key) (*CertificateRequest, error) { 18 template := &x509.CertificateRequest{ 19 Subject: GenSubject(""), //FIXME 20 //Attributes: 21 //SignatureAlgorithm, 22 //Extensions: 23 DNSNames: []string{}, 24 //EmailAddress: 25 //IPAddresses: 26 } 27 28 derBytes, err := x509.CreateCertificateRequest(rand.Reader, template, key.PrivateKey) 29 if err != nil { 30 return nil, err 31 } 32 csr, err := NewCertificateRequestFromDER(derBytes) 33 if err != nil { 34 return nil, err 35 } 36 37 return csr, nil 38 } 39 40 func NewCertificateRequestFromDER(derBytes []byte) (*CertificateRequest, error) { 41 42 csr, err := x509.ParseCertificateRequest(derBytes) 43 if err != nil { 44 return nil, err 45 } 46 47 certificateRequest := &CertificateRequest{ 48 DerBytes: derBytes, 49 Csr: csr, 50 } 51 52 return certificateRequest, nil 53 } 54 func NewCertificateRequestFromPEM(pemBytes []byte) (*CertificateRequest, error) { 55 56 pemBlock, _ := pem.Decode(pemBytes) 57 if pemBlock == nil { 58 return nil, errors.New("PEM decode failed") 59 } 60 61 csr, err := x509.ParseCertificateRequest(pemBlock.Bytes) 62 if err != nil { 63 return nil, err 64 } 65 66 certificateRequest := &CertificateRequest{ 67 DerBytes: pemBlock.Bytes, 68 Csr: csr, 69 } 70 71 return certificateRequest, nil 72 } 73 func NewCertificateRequestFromPEMFile(filename string) (*CertificateRequest, error) { 74 75 data, err := ioutil.ReadFile(filename) 76 if err != nil { 77 return nil, err 78 } 79 80 return NewCertificateRequestFromPEM(data) 81 } 82 83 func (csr *CertificateRequest) ToPEM() ([]byte, error) { 84 85 pemBlock := &pem.Block{ 86 Type: "CERTIFICATE REQUEST", 87 Bytes: csr.DerBytes, 88 } 89 90 pemBytes := pem.EncodeToMemory(pemBlock) 91 92 return pemBytes, nil 93 }