Hello, this is 2016 and I am walking on this path now..

In the rootCA function and elsewhere, you have this line:

derBytes, err := x509.CreateCertificate(rand.Reader, &rcat, &rcat, 
&rpriv.PublicKey, rpriv)

However, the last two parameters to this function, according to the golang 
refs (https://golang.org/pkg/crypto/x509/#CreateCertificate) are:

"The parameter *pub* is the public key of the signee"

and

"*priv* is the private key of the signer"

(For quick reference, here is the function signature from the same page: 
...)

func CreateCertificate(rand io <https://golang.org/pkg/io/>.Reader 
<https://golang.org/pkg/io/#Reader>, template, parent *Certificate 
<https://golang.org/pkg/crypto/x509/#Certificate>, pub, priv interface{}) (cert 
[]byte <https://golang.org/pkg/builtin/#byte>, err error 
<https://golang.org/pkg/builtin/#error>)


This does not seem to tally with your usage.

BTW, I much appreciate your work here. I hope perhaps it could be led to 
correctness slowly and form a great reference?





On Sunday, October 19, 2014 at 9:43:48 AM UTC-7, Darko Luketic wrote:
>
> This is how the certs are generated
>
> package main
>
> import (
>     "crypto/rand"
>     "crypto/rsa"
>     "crypto/sha512"
>     "crypto/x509"
>     "crypto/x509/pkix"
>     "encoding/asn1"
>     "encoding/pem"
>     "fmt"
>     "math/big"
>     "net"
>     "os"
>     "time"
>     //"strconv"
> )
>
> var (
>     organization  = []string{"domain.tld", "My Name"}
>     streetaddress = []string{"Street. 123"}
>     postalcode    = []string{"12345"}
>     province      = []string{"Province"}
>     locality      = []string{"City"}
>     country       = []string{"DE"}
> )
>
> var (
>     rcat  = rootCATemplate()
>     icat  = intermediateCATemplate()
>     rpriv *rsa.PrivateKey
>     ipriv *rsa.PrivateKey
> )
>
> func main() {
>     rootCA()
>     intermediateCA()
>     serverCert("server1.name", "1.2.3.4", "2a01::2")
>     serverCert("server2.name", "2.3.4.5", "2a02::2")
> }
>
> func rootCATemplate() x509.Certificate {
>     template := x509.Certificate{}
>     template.Subject = pkix.Name{
>         Organization:  organization,
>         StreetAddress: streetaddress,
>         PostalCode:    postalcode,
>         Province:      province,
>         Locality:      locality,
>         Country:       country,
>         CommonName:    "icod.de CA",
>     }
>
>     template.NotBefore = time.Now()
>     template.NotAfter = template.NotBefore.Add(172800 * time.Hour)
>     template.KeyUsage = x509.KeyUsageCertSign | 
> x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | 
> x509.KeyUsageCRLSign
>     template.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, 
> x509.ExtKeyUsageServerAuth}
>     template.IsCA = true
>     template.BasicConstraintsValid = true
>     extSubjectAltName := pkix.Extension{}
>     extSubjectAltName.Id = asn1.ObjectIdentifier{2, 5, 29, 17}
>     extSubjectAltName.Critical = false
>     extSubjectAltName.Value = []byte(`email...@dom1.de <javascript:>, URI:
> http://ca.dom1.de/` <http://ca.dom1.de/>)
>     template.ExtraExtensions = []pkix.Extension{extSubjectAltName}
>     return template
> }
>
> func intermediateCATemplate() x509.Certificate {
>     template := x509.Certificate{}
>     template.Subject = pkix.Name{
>         Organization:  organization,
>         StreetAddress: streetaddress,
>         PostalCode:    postalcode,
>         Province:      province,
>         Locality:      locality,
>         Country:       country,
>         CommonName:    "SelfTLS CA",
>     }
>
>     template.NotBefore = time.Now()
>     template.NotAfter = template.NotBefore.Add(172800 * time.Hour)
>     template.KeyUsage = x509.KeyUsageCertSign | 
> x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | 
> x509.KeyUsageCRLSign
>     template.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, 
> x509.ExtKeyUsageServerAuth}
>     template.IsCA = true
>     template.BasicConstraintsValid = true
>     extSubjectAltName := pkix.Extension{}
>     extSubjectAltName.Id = asn1.ObjectIdentifier{2, 5, 29, 17}
>     extSubjectAltName.Critical = false
>     extSubjectAltName.Value = []byte(`emai...@dom2.com <javascript:>, URI:
> http://ca.dom2.com/` <http://ca.dom2.com/>)
>     template.ExtraExtensions = []pkix.Extension{extSubjectAltName}
>     return template
> }
>
> // hosts: []string{"hostname","ipv4addr","ipv6addr"}
> func serverTemplate(hosts []string) x509.Certificate {
>     template := x509.Certificate{}
>     template.Subject = pkix.Name{
>         Organization:  organization,
>         StreetAddress: streetaddress,
>         PostalCode:    postalcode,
>         Province:      province,
>         Locality:      locality,
>         Country:       country,
>     }
>
>     template.NotBefore = time.Now()
>     template.NotAfter = template.NotBefore.Add(86400 * time.Hour)
>     template.KeyUsage = x509.KeyUsageKeyEncipherment | 
> x509.KeyUsageDigitalSignature
>     template.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, 
> x509.ExtKeyUsageServerAuth}
>     template.BasicConstraintsValid = true
>
>     for _, h := range hosts {
>         if ip := net.ParseIP(h); ip != nil {
>             template.IPAddresses = append(template.IPAddresses, ip)
>         } else {
>             template.DNSNames = append(template.DNSNames, h)
>             template.Subject.CommonName = h
>         }
>     }
>     return template
> }
>
> func serverCert(host, ipv4, ipv6 string) {
>     tpl := serverTemplate([]string{host, ipv4, ipv6})
>     priv, err := rsa.GenerateKey(rand.Reader, 4096)
>     if err != nil {
>         fmt.Println("Failed to generate private key:", err)
>         os.Exit(1)
>     }
>     serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
>     tpl.SerialNumber, err = rand.Int(rand.Reader, serialNumberLimit)
>     if err != nil {
>         fmt.Println("Failed to generate serial number:", err)
>         os.Exit(1)
>     }
>     h := sha512.New()
>     pb, e := x509.MarshalPKIXPublicKey(&priv.PublicKey)
>     if e != nil {
>         fmt.Println(e.Error())
>         return
>     }
>     h.Write(pb)
>     tpl.SubjectKeyId = h.Sum(nil)
>     derBytes, err := x509.CreateCertificate(rand.Reader, &tpl, &icat, 
> &priv.PublicKey, ipriv)
>     if err != nil {
>         fmt.Println("Failed to create certificate:", err)
>         os.Exit(1)
>     }
>     certOut, err := os.Create(host + ".crt")
>     if err != nil {
>         fmt.Println("Failed to open "+host+".crt for writing:", err)
>         os.Exit(1)
>     }
>     pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
>     certOut.Close()
>     keyOut, err := os.OpenFile(host+".key", 
> os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
>     if err != nil {
>         fmt.Println("failed to open "+host+".key for writing:", err)
>         os.Exit(1)
>     }
>     pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: 
> x509.MarshalPKCS1PrivateKey(priv)})
>     keyOut.Close()
> }
>
> func intermediateCA() {
>     var err error
>     ipriv, err = rsa.GenerateKey(rand.Reader, 4096)
>     if err != nil {
>         fmt.Println("Failed to generate private key:", err)
>         os.Exit(1)
>     }
>     serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
>     icat.SerialNumber, err = rand.Int(rand.Reader, serialNumberLimit)
>     if err != nil {
>         fmt.Println("Failed to generate serial number:", err)
>         os.Exit(1)
>     }
>     h := sha512.New()
>     pb, e := x509.MarshalPKIXPublicKey(&ipriv.PublicKey)
>     if e != nil {
>         fmt.Println(e.Error())
>         return
>     }
>     h.Write(pb)
>     icat.SubjectKeyId = h.Sum(nil)
>
>     derBytes, err := x509.CreateCertificate(rand.Reader, &icat, &rcat, 
> &ipriv.PublicKey, rpriv)
>     if err != nil {
>         fmt.Println("Failed to create certificate:", err)
>         os.Exit(1)
>     }
>     certOut, err := os.Create("intermediate.crt")
>     if err != nil {
>         fmt.Println("Failed to open ca.pem for writing:", err)
>         os.Exit(1)
>     }
>     pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
>     certOut.Close()
>     keyOut, err := os.OpenFile("intermediate.key", 
> os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
>     if err != nil {
>         fmt.Println("failed to open ca.key for writing:", err)
>         os.Exit(1)
>     }
>     pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: 
> x509.MarshalPKCS1PrivateKey(ipriv)})
>     keyOut.Close()
> }
>
> func rootCA() {
>     var err error
>     rpriv, err = rsa.GenerateKey(rand.Reader, 4096)
>     if err != nil {
>         fmt.Println("Failed to generate private key:", err)
>         os.Exit(1)
>     }
>     serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
>     rcat.SerialNumber, err = rand.Int(rand.Reader, serialNumberLimit)
>     if err != nil {
>         fmt.Println("Failed to generate serial number:", err)
>         os.Exit(1)
>     }
>     h := sha512.New()
>     pb, e := x509.MarshalPKIXPublicKey(&rpriv.PublicKey)
>     if e != nil {
>         fmt.Println(e.Error())
>         return
>     }
>     h.Write(pb)
>     rcat.SubjectKeyId = h.Sum(nil)
>
>     derBytes, err := x509.CreateCertificate(rand.Reader, &rcat, &rcat, 
> &rpriv.PublicKey, rpriv)
>     if err != nil {
>         fmt.Println("Failed to create certificate:", err)
>         os.Exit(1)
>     }
>     certOut, err := os.Create("rootca.crt")
>     if err != nil {
>         fmt.Println("Failed to open ca.pem for writing:", err)
>         os.Exit(1)
>     }
>     pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
>     certOut.Close()
>     keyOut, err := os.OpenFile("rootca.key", 
> os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
>     if err != nil {
>         fmt.Println("failed to open ca.key for writing:", err)
>         os.Exit(1)
>     }
>     pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: 
> x509.MarshalPKCS1PrivateKey(rpriv)})
>     keyOut.Close()
> }
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to