package ssl import ( "crypto/rand" "crypto/x509" "crypto/x509/pkix" "math/big" "net" "time" ) func GetRoot() (*x509.Certificate, error) { serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) if err != nil { return nil, err } return &x509.Certificate{ SerialNumber: serialNumber, Subject: pkix.Name{ Organization: []string{"Filestash"}, }, NotBefore: time.Now().Add(-24 * time.Hour), NotAfter: time.Now().Add(24 * 365 * 100 * time.Hour), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, IsCA: false, IPAddresses: func() []net.IP { ips := []net.IP{} ifaces, err := net.Interfaces() if err != nil { return []net.IP{net.ParseIP("127.0.0.1")} } for _, i := range ifaces { addrs, err := i.Addrs() if err != nil { return []net.IP{net.ParseIP("127.0.0.1")} } for _, addr := range addrs { var ip net.IP switch v := addr.(type) { case *net.IPNet: ip = v.IP case *net.IPAddr: ip = v.IP } ips = append(ips, ip) } } return ips }(), }, nil }