import { useState } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useQuery } from '@tanstack/react-query'; import { useTrackedMutation } from '../hooks/useTrackedMutation'; import { getCertificate, getCertificateVersions, triggerRenewal, triggerDeployment, archiveCertificate, revokeCertificate, updateCertificate, getTargets, getJobs, getRenewalPolicies, getProfiles, getProfile, downloadCertificatePEM, exportCertificatePKCS12, getOCSPStatus, fetchCRL, getAdminCRLCache } from '../api/client'; import { REVOCATION_REASONS } from '../api/types'; import PageHeader from '../components/PageHeader'; import StatusBadge from '../components/StatusBadge'; import ErrorState from '../components/ErrorState'; import { useAuth } from '../components/AuthProvider'; import { formatDate, formatDateTime, daysUntil, expiryColor, timeAgo } from '../api/utils'; import type { Job, CRLCacheRow } from '../api/types'; function InfoRow({ label, value, editable, onEdit }: { label: string; value: React.ReactNode; editable?: boolean; onEdit?: () => void }) { return (
{crlURL}
{ocspURL}
Both endpoints run unauthenticated under /.well-known/pki/ per RFC 8615 so relying parties can validate revocation without API keys. The CRL is pre-generated by the scheduler (configurable via CERTCTL_CRL_GENERATION_INTERVAL); OCSP is signed by the per-issuer responder cert (RFC 6960 §2.6).
No versions yet
) : (Downloads a .p12 file containing the certificate chain. Private keys are not included (they remain on the agent).
setPkcs12Password(e.target.value)} placeholder="Leave empty for no encryption" className="w-full bg-white border border-surface-border rounded px-3 py-2 text-sm text-ink mb-4 focus:outline-none focus:border-brand-400" />This action cannot be undone. The certificate will be added to the CRL and marked as revoked.
{revokeMutation.isError && (