// NewSignHandlerFromSigner generates a new SignHandler directly from // an existing signer. func NewSignHandlerFromSigner(s signer.Signer) (h http.Handler, err error) { policy := s.Policy() if policy == nil { err = errors.New(errors.PolicyError, errors.InvalidPolicy) return } // Sign will only respond for profiles that have no auth provider. // So if all of the profiles require authentication, we return an error. haveUnauth := (policy.Default.Provider == nil) for _, profile := range policy.Profiles { if !haveUnauth { break } haveUnauth = (profile.Provider == nil) } if !haveUnauth { err = errors.New(errors.PolicyError, errors.InvalidPolicy) return } return &api.HTTPHandler{ Handler: &SignHandler{ signer: s, }, Methods: []string{"POST"}, }, nil }
func signCSRFile(s signer.Signer, csrFile string, t *testing.T) []byte { csrBytes, err := ioutil.ReadFile(csrFile) if err != nil { t.Fatal(err) } signingRequest := signer.SignRequest{Request: string(csrBytes)} certBytes, err := s.Sign(signingRequest) if err != nil { t.Fatal(err) } return certBytes }
// NewAuthHandlerFromSigner creates a new AuthHandler from the signer // that is passed in. func NewAuthHandlerFromSigner(signer signer.Signer) (http.Handler, error) { policy := signer.Policy() if policy == nil { return nil, errors.New(errors.PolicyError, errors.InvalidPolicy) } if policy.Default == nil && policy.Profiles == nil { return nil, errors.New(errors.PolicyError, errors.InvalidPolicy) } // AuthSign will not respond for profiles that have no auth provider. // So if there are no profiles with auth providers in this policy, // we return an error. haveAuth := (policy.Default.Provider != nil) for _, profile := range policy.Profiles { if haveAuth { break } haveAuth = (profile.Provider != nil) } if !haveAuth { return nil, errors.New(errors.PolicyError, errors.InvalidPolicy) } return &api.HTTPHandler{ Handler: &AuthHandler{ signer: signer, }, Methods: []string{"POST"}, }, nil }
func checkInfo(t *testing.T, s signer.Signer, name string, profile *config.SigningProfile) { req := info.Req{ Profile: name, } resp, err := s.Info(req) if err != nil { t.Fatal("remote info failed:", err) } if strings.Join(profile.Usage, ",") != strings.Join(resp.Usage, ",") { t.Fatalf("Expected usage for profile %s to be %+v, got %+v", name, profile.Usage, resp.Usage) } caBytes, err := ioutil.ReadFile(testCaFile) caBytes = bytes.TrimSpace(caBytes) if err != nil { t.Fatal("fail to read test CA cert:", err) } if bytes.Compare(caBytes, []byte(resp.Certificate)) != 0 { t.Fatal("Get a different CA cert through info api.", len(resp.Certificate), len(caBytes)) } }
func gencertMain(args []string) (err error) { if Config.hostname == "" && !Config.isCA { Config.hostname, args, err = popFirstArgument(args) if err != nil { return } } csrFile, args, err := popFirstArgument(args) if err != nil { return } csrFileBytes, err := readStdin(csrFile) if err != nil { return } var req csr.CertificateRequest err = json.Unmarshal(csrFileBytes, &req) if err != nil { return } if Config.isCA { var key, cert []byte cert, key, err = initca.New(&req) if err != nil { return } printCert(key, nil, cert) } else { if Config.remote != "" { return gencertRemotely(req) } if Config.caFile == "" { log.Error("cannot sign certificate without a CA certificate (provide one with -ca)") return } if Config.caKeyFile == "" { log.Error("cannot sign certificate without a CA key (provide one with -ca-key)") return } var policy *config.Signing // If there is a config, use its signing policy. Otherwise, leave policy == nil // and NewSigner will use DefaultConfig(). if Config.cfg != nil { policy = Config.cfg.Signing } var key, csrPEM []byte g := &csr.Generator{validator} csrPEM, key, err = g.ProcessRequest(&req) if err != nil { key = nil return } var sign *signer.Signer sign, err = signer.NewSigner(Config.caFile, Config.caKeyFile, policy) if err != nil { return } var cert []byte cert, err = sign.Sign(Config.hostname, csrPEM, Config.profile) if err != nil { return } printCert(key, csrPEM, cert) } return nil }