func (cas *CertificateAuthorityServerWrapper) GenerateOCSP(ctx context.Context, request *caPB.GenerateOCSPRequest) (*caPB.OCSPResponse, error) { res, err := cas.inner.GenerateOCSP(ctx, core.OCSPSigningRequest{ CertDER: request.CertDER, Status: *request.Status, Reason: revocation.Reason(*request.Reason), RevokedAt: time.Unix(0, *request.RevokedAt), }) if err != nil { return nil, err } return &caPB.OCSPResponse{Response: res}, nil }
func (sas StorageAuthorityServerWrapper) MarkCertificateRevoked(ctx context.Context, request *sapb.MarkCertificateRevokedRequest) (*corepb.Empty, error) { if request == nil || request.Serial == nil || request.Code == nil { return nil, errIncompleteRequest } err := sas.inner.MarkCertificateRevoked(ctx, *request.Serial, revocation.Reason(*request.Code)) if err != nil { return nil, wrapError(err) } return &corepb.Empty{}, nil }
func (ras *RegistrationAuthorityServerWrapper) AdministrativelyRevokeCertificate(ctx context.Context, request *rapb.AdministrativelyRevokeCertificateRequest) (*corepb.Empty, error) { if request == nil || request.Cert == nil || request.Code == nil || request.AdminName == nil { return nil, errIncompleteRequest } cert, err := x509.ParseCertificate(request.Cert) if err != nil { return nil, err } err = ras.inner.AdministrativelyRevokeCertificate(ctx, *cert, revocation.Reason(*request.Code), *request.AdminName) if err != nil { return nil, wrapError(err) } return &corepb.Empty{}, nil }
func (sac StorageAuthorityClientWrapper) GetCertificateStatus(ctx context.Context, serial string) (core.CertificateStatus, error) { response, err := sac.inner.GetCertificateStatus(ctx, &sapb.Serial{Serial: &serial}) if err != nil { return core.CertificateStatus{}, unwrapError(err) } if response == nil || response.Serial == nil || response.SubscriberApproved == nil || response.Status == nil || response.OcspLastUpdated == nil || response.RevokedDate == nil || response.RevokedReason == nil || response.LastExpirationNagSent == nil || response.OcspResponse == nil || response.NotAfter == nil || response.IsExpired == nil { return core.CertificateStatus{}, errIncompleteResponse } return core.CertificateStatus{ Serial: *response.Serial, SubscriberApproved: *response.SubscriberApproved, Status: core.OCSPStatus(*response.Status), OCSPLastUpdated: time.Unix(0, *response.OcspLastUpdated), RevokedDate: time.Unix(0, *response.RevokedDate), RevokedReason: revocation.Reason(*response.RevokedReason), LastExpirationNagSent: time.Unix(0, *response.LastExpirationNagSent), OCSPResponse: response.OcspResponse, NotAfter: time.Unix(0, *response.NotAfter), IsExpired: *response.IsExpired, }, nil }
func main() { usage := func() { fmt.Fprintf(os.Stderr, usageString) os.Exit(1) } if len(os.Args) <= 2 { usage() } command := os.Args[1] flagSet := flag.NewFlagSet(command, flag.ContinueOnError) configFile := flagSet.String("config", "", "File path to the configuration file for this service") err := flagSet.Parse(os.Args[2:]) cmd.FailOnError(err, "Error parsing flagset") if *configFile == "" { usage() } var c config err = cmd.ReadConfigFile(*configFile, &c) cmd.FailOnError(err, "Reading JSON config file into config structure") ctx := context.Background() args := flagSet.Args() switch { case command == "serial-revoke" && len(args) == 2: // 1: serial, 2: reasonCode serial := args[0] reasonCode, err := strconv.Atoi(args[1]) cmd.FailOnError(err, "Reason code argument must be an integer") rac, logger, dbMap, _, _ := setupContext(c) tx, err := dbMap.Begin() if err != nil { cmd.FailOnError(sa.Rollback(tx, err), "Couldn't begin transaction") } err = revokeBySerial(ctx, serial, revocation.Reason(reasonCode), rac, logger, tx) if err != nil { cmd.FailOnError(sa.Rollback(tx, err), "Couldn't revoke certificate") } err = tx.Commit() cmd.FailOnError(err, "Couldn't cleanly close transaction") case command == "reg-revoke" && len(args) == 2: // 1: registration ID, 2: reasonCode regID, err := strconv.ParseInt(args[0], 10, 64) cmd.FailOnError(err, "Registration ID argument must be an integer") reasonCode, err := strconv.Atoi(args[1]) cmd.FailOnError(err, "Reason code argument must be an integer") rac, logger, dbMap, sac, _ := setupContext(c) defer logger.AuditPanic() tx, err := dbMap.Begin() if err != nil { cmd.FailOnError(sa.Rollback(tx, err), "Couldn't begin transaction") } _, err = sac.GetRegistration(ctx, regID) if err != nil { cmd.FailOnError(err, "Couldn't fetch registration") } err = revokeByReg(ctx, regID, revocation.Reason(reasonCode), rac, logger, tx) if err != nil { cmd.FailOnError(sa.Rollback(tx, err), "Couldn't revoke certificate") } err = tx.Commit() cmd.FailOnError(err, "Couldn't cleanly close transaction") case command == "list-reasons": var codes revocationCodes for k := range revocation.ReasonToString { codes = append(codes, k) } sort.Sort(codes) fmt.Printf("Revocation reason codes\n-----------------------\n\n") for _, k := range codes { fmt.Printf("%d: %s\n", k, revocation.ReasonToString[k]) } case command == "auth-revoke" && len(args) == 1: domain := args[0] _, logger, _, sac, stats := setupContext(c) ident := core.AcmeIdentifier{Value: domain, Type: core.IdentifierDNS} authsRevoked, pendingAuthsRevoked, err := sac.RevokeAuthorizationsByDomain(ctx, ident) cmd.FailOnError(err, fmt.Sprintf("Failed to revoke authorizations for %s", ident.Value)) logger.Info(fmt.Sprintf( "Revoked %d pending authorizations and %d final authorizations\n", pendingAuthsRevoked, authsRevoked, )) stats.Inc("RevokedAuthorizations", authsRevoked) stats.Inc("RevokedPendingAuthorizations", pendingAuthsRevoked) default: usage() } }