...
1
16
17 package cert
18
19 import (
20 cryptorand "crypto/rand"
21 "crypto/rsa"
22 "crypto/x509"
23 "crypto/x509/pkix"
24 "encoding/pem"
25 "net"
26 )
27
28
29
30 func MakeCSR(privateKey interface{}, subject *pkix.Name, dnsSANs []string, ipSANs []net.IP) (csr []byte, err error) {
31 template := &x509.CertificateRequest{
32 Subject: *subject,
33 DNSNames: dnsSANs,
34 IPAddresses: ipSANs,
35 }
36
37 return MakeCSRFromTemplate(privateKey, template)
38 }
39
40
41
42
43
44 func MakeCSRFromTemplate(privateKey interface{}, template *x509.CertificateRequest) ([]byte, error) {
45 t := *template
46 t.SignatureAlgorithm = sigType(privateKey)
47
48 csrDER, err := x509.CreateCertificateRequest(cryptorand.Reader, &t, privateKey)
49 if err != nil {
50 return nil, err
51 }
52
53 csrPemBlock := &pem.Block{
54 Type: CertificateRequestBlockType,
55 Bytes: csrDER,
56 }
57
58 return pem.EncodeToMemory(csrPemBlock), nil
59 }
60
61 func sigType(privateKey interface{}) x509.SignatureAlgorithm {
62
63 if privateKey, ok := privateKey.(*rsa.PrivateKey); ok {
64 keySize := privateKey.N.BitLen()
65 switch {
66 case keySize >= 4096:
67 return x509.SHA512WithRSA
68 case keySize >= 3072:
69 return x509.SHA384WithRSA
70 default:
71 return x509.SHA256WithRSA
72 }
73 }
74 return x509.UnknownSignatureAlgorithm
75 }
76
View as plain text