code: func ocspSignerMain(args []string, c cli.Config) (err error) {
  	// Read the cert to be revoked from file
  	certBytes, err := ioutil.ReadFile(c.CertFile)
  	if err != nil {
  		log.Critical("Unable to read certificate: ", err)
  		return
  	}
  	cert, err := helpers.ParseCertificatePEM(certBytes)
  	if err != nil {
  		log.Critical("Unable to parse certificate: ", err)
  		return
  	}
  
  	req := ocsp.SignRequest{
  		Certificate: cert,
  		Status:      c.Status,
  	}
  
  	if c.Status == "revoked" {
  		var reasonCode int
  		reasonCode, err = ocsp.ReasonStringToCode(c.Reason)
  		if err != nil {
  			log.Critical("Invalid reason code: ", err)
  			return
  		}
  
  		req.Reason = reasonCode
  		req.RevokedAt = time.Now()
  		if c.RevokedAt != "now" {
  			req.RevokedAt, err = time.Parse("2006-01-02", c.RevokedAt)
  			if err != nil {
  				log.Critical("Malformed revocation time: ", c.RevokedAt)
  				return
  			}
  		}
  	}
  
  	s, err := SignerFromConfig(c)
  	if err != nil {
  		log.Critical("Unable to create OCSP signer: ", err)
  		return
  	}
  
  	resp, err := s.Sign(req)
  	if err != nil {
  		log.Critical("Unable to sign OCSP response: ", err)
  		return
  	}
  
  	cli.PrintOCSPResponse(resp)
  	return
  }
docs: // ocspSignerMain is the main CLI of OCSP signer functionality.