func loadPrivateKey(keyConfig cmd.KeyConfig) (crypto.Signer, error) { if keyConfig.File != "" { keyBytes, err := ioutil.ReadFile(keyConfig.File) if err != nil { return nil, fmt.Errorf("Could not read key file %s", keyConfig.File) } return helpers.ParsePrivateKeyPEM(keyBytes) } var pkcs11Config *pkcs11key.Config if keyConfig.ConfigFile != "" { contents, err := ioutil.ReadFile(keyConfig.ConfigFile) if err != nil { return nil, err } pkcs11Config = new(pkcs11key.Config) err = json.Unmarshal(contents, pkcs11Config) if err != nil { return nil, err } } else { pkcs11Config = keyConfig.PKCS11 } if pkcs11Config.Module == "" || pkcs11Config.TokenLabel == "" || pkcs11Config.PIN == "" || pkcs11Config.PrivateKeyLabel == "" { return nil, fmt.Errorf("Missing a field in pkcs11Config %#v", pkcs11Config) } return pkcs11key.New(pkcs11Config.Module, pkcs11Config.TokenLabel, pkcs11Config.PIN, pkcs11Config.PrivateKeyLabel) }
func loadKey(keyConfig cmd.KeyConfig) (priv crypto.Signer, err error) { if keyConfig.File != "" { var keyBytes []byte keyBytes, err = ioutil.ReadFile(keyConfig.File) if err != nil { return nil, fmt.Errorf("Could not read key file %s", keyConfig.File) } priv, err = helpers.ParsePrivateKeyPEM(keyBytes) return } pkcs11Config := keyConfig.PKCS11 if pkcs11Config.Module == "" || pkcs11Config.TokenLabel == "" || pkcs11Config.PIN == "" || pkcs11Config.PrivateKeyLabel == "" || pkcs11Config.SlotID == nil { err = fmt.Errorf("Missing a field in pkcs11Config %#v", pkcs11Config) return } priv, err = pkcs11key.New(pkcs11Config.Module, pkcs11Config.TokenLabel, pkcs11Config.PIN, pkcs11Config.PrivateKeyLabel, *pkcs11Config.SlotID) return }
func main() { // Instantiate the PKCS11 key var pkcs11 struct { Module string Token string PIN string Label string } pkcs11Bytes, err := ioutil.ReadFile(pkcs11FileName) panicOnError(err) err = json.Unmarshal(pkcs11Bytes, &pkcs11) panicOnError(err) p11key, err := pkcs11key.New(pkcs11.Module, pkcs11.Token, pkcs11.PIN, pkcs11.Label) panicOnError(err) // All of the certificates start and end at the same time notBefore := time.Now().Truncate(time.Hour).Add(-1 * time.Hour) notAfter := notBefore.AddDate(1, 0, 0) // Make some keys for the CA and EE caKey, err := rsa.GenerateKey(rand.Reader, 2048) panicOnError(err) eeKey, err := rsa.GenerateKey(rand.Reader, 2048) panicOnError(err) // Make CA cert with ephemeral key template := &x509.Certificate{ NotBefore: notBefore, NotAfter: notAfter, Subject: pkix.Name{CommonName: "Happy Hacker Fake CA"}, BasicConstraintsValid: true, IsCA: true, } caCert := makeCert(template, template, caKey.Public(), caKey) // Make EE cert with ephemeral key and print template = &x509.Certificate{ NotBefore: notBefore, NotAfter: notAfter, Subject: pkix.Name{CommonName: "example.com"}, } eeCert := makeCert(template, caCert, eeKey.Public(), caKey) // Make OCSP responder cert with PKCS#11 key template = &x509.Certificate{ NotBefore: notBefore, NotAfter: notAfter, Subject: pkix.Name{CommonName: "Happy Hacker OCSP Signer"}, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageOCSPSigning}, } ocspCert := makeCert(template, caCert, p11key.Public(), caKey) // Write out all the certs in DER and PEM ioutil.WriteFile(caCertFileName, caCert.Raw, 0666) ioutil.WriteFile(eeCertFileName, eeCert.Raw, 0666) ioutil.WriteFile(ocspCertFileName, ocspCert.Raw, 0666) ioutil.WriteFile(caCertFileNamePEM, toPEM(caCert), 0666) ioutil.WriteFile(eeCertFileNamePEM, toPEM(eeCert), 0666) ioutil.WriteFile(ocspCertFileNamePEM, toPEM(ocspCert), 0666) }
func loadKey(keyConfig KeyConfig) (priv crypto.Signer, err error) { if keyConfig.File != "" { var keyBytes []byte keyBytes, err = ioutil.ReadFile(keyConfig.File) if err != nil { return nil, fmt.Errorf("Could not read key file %s", keyConfig.File) } priv, err = helpers.ParsePrivateKeyPEM(keyBytes) return } pkcs11Config := keyConfig.PKCS11 priv, err = pkcs11key.New(pkcs11Config.Module, pkcs11Config.Token, pkcs11Config.PIN, pkcs11Config.Label) return }
// New returns a new PKCS #11 signer. func NewPKCS11Signer(cfg ocspConfig.Config) (ocsp.Signer, error) { log.Debugf("Loading PKCS #11 module %s", cfg.PKCS11.Module) certData, err := ioutil.ReadFile(cfg.CACertFile) if err != nil { return nil, errors.New(errors.CertificateError, errors.ReadFailed) } cert, err := helpers.ParseCertificatePEM(certData) if err != nil { return nil, err } PKCS11 := cfg.PKCS11 priv, err := pkcs11key.New(PKCS11.Module, PKCS11.Token, PKCS11.PIN, PKCS11.Label) if err != nil { return nil, errors.New(errors.PrivateKeyError, errors.ReadFailed) } return ocsp.NewSigner(cert, cert, priv, cfg.Interval) }
// New returns a new PKCS #11 signer. func New(caCertFile string, policy *config.Signing, cfg *pkcs11key.Config) (signer.Signer, error) { if cfg == nil { return nil, errors.New(errors.PrivateKeyError, errors.ReadFailed) } log.Debugf("Loading PKCS #11 module %s", cfg.Module) certData, err := ioutil.ReadFile(caCertFile) if err != nil { return nil, errors.New(errors.PrivateKeyError, errors.ReadFailed) } cert, err := helpers.ParseCertificatePEM(certData) if err != nil { return nil, err } priv, err := pkcs11key.New(cfg.Module, cfg.TokenLabel, cfg.PIN, cfg.PrivateKeyLabel) if err != nil { return nil, errors.New(errors.PrivateKeyError, errors.ReadFailed) } sigAlgo := signer.DefaultSigAlgo(priv) return local.NewSigner(priv, cert, sigAlgo, policy) }
func main() { app := cli.NewApp() app.Name = "single-ocsp" app.Usage = `Creates a single OCSP response. According to the BRs, the OCSP responses for intermediate certificate must be issued once per year. So there's a need to issue OCSP responses for these certificates, but it doesn't make sense to use all the infrastructure that the "ocsp-updater" tool requires. This tool allows an administrator to manually generate an OCSP response for an intermediate certificate. ` app.Version = cmd.Version() app.Author = "Boulder contributors" app.Email = "*****@*****.**" app.Flags = []cli.Flag{ cli.StringFlag{ Name: "issuer", Usage: "Issuer certificate (DER)", }, cli.StringFlag{ Name: "responder", Usage: "OCSP responder certificate (DER)", }, cli.StringFlag{ Name: "target", Usage: "Certificate whose status is being reported (DER)", }, cli.StringFlag{ Name: "template", Usage: `OCSP template file (JSON), e.g.: { "Status": 0, // Good "ThisUpdate": "2015-08-26T00:00:00Z", "NextUpdate": "2016-08-26T00:00:00Z" } { "Status": 1, // Revoked "ThisUpdate": "2015-08-26T00:00:00Z", "NextUpdate": "2016-08-26T00:00:00Z", "RevokedAt": "2015-08-20T00:00:00Z", "RevocationReason": 1 // Key compromise } `, }, cli.StringFlag{ Name: "pkcs11", Usage: `PKCS#11 configuration (JSON), e.g.: { "Module": "/Library/OpenSC/lib/opensc-pkcs11.so", "Token": "Yubico Yubikey NEO CCID", "Label": "PIV AUTH key", "PIN": "123456" } `, }, cli.StringFlag{ Name: "out", Usage: "File to which the OCSP response will be written", }, } app.Action = func(c *cli.Context) { issuer, responder, target, template, pkcs11, err := readFiles(c) cmd.FailOnError(err, "Failed to read files") // Instantiate the private key from PKCS11 priv, err := pkcs11key.New(pkcs11.Module, pkcs11.TokenLabel, pkcs11.PIN, pkcs11.PrivateKeyLabel, int(pkcs11.SlotID)) cmd.FailOnError(err, "Failed to load PKCS#11 key") // Populate the remaining fields in the template template.SerialNumber = target.SerialNumber template.Certificate = responder // Sign the OCSP response responseBytes, err := ocsp.CreateResponse(issuer, responder, template, priv) cmd.FailOnError(err, "Failed to sign OCSP response") // Write the OCSP response to stdout outFile := c.GlobalString("out") if len(outFile) == 0 { cmd.FailOnError(fmt.Errorf(""), "No output file provided") } ioutil.WriteFile(outFile, responseBytes, 0666) } err := app.Run(os.Args) cmd.FailOnError(err, "Failed to run application") }