Skip to content

Commit 649b76e

Browse files
committed
Add ignore time option to verify command
1 parent 0f2bbc0 commit 649b76e

File tree

2 files changed

+36
-40
lines changed

2 files changed

+36
-40
lines changed

src/EasySign.CommandLine/BundleWorker.cs

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ protected virtual void RunSign(StatusContext statusContext, X509Certificate2Coll
308308
Logger.LogDebug("Verifying certificate {cert}", cert);
309309
statusContext.Status("[yellow]Verifying Certificate[/]");
310310

311-
bool verifyCert = VerifyCertificate(cert);
311+
bool verifyCert = VerifyCertificate(cert, false);
312312
if (!verifyCert)
313313
{
314314
Logger.LogWarning("Skipping signing with {cert}", cert);
@@ -355,7 +355,8 @@ protected virtual void RunSign(StatusContext statusContext, X509Certificate2Coll
355355
/// Runs the verify command.
356356
/// </summary>
357357
/// <param name="statusContext">The status context for interacting with <see cref="AnsiConsole.Status"/>.</param>
358-
protected virtual void RunVerify(StatusContext statusContext)
358+
/// <param name="ignoreTime">A value indicating whether to ignore time validity checks for certificate verification.</param>
359+
protected virtual void RunVerify(StatusContext statusContext, bool ignoreTime)
359360
{
360361
Logger.LogInformation("Running verify command");
361362

@@ -391,7 +392,7 @@ protected virtual void RunVerify(StatusContext statusContext)
391392
Logger.LogDebug("Verifying certificate {cert}", certificate);
392393
AnsiConsole.MarkupLine($"Verifying Certificate [{Color.Teal}]{certificate.GetNameInfo(X509NameType.SimpleName, false)}[/] Issued by [{Color.Aqua}]{certificate.GetNameInfo(X509NameType.SimpleName, true)}[/]");
393394

394-
bool verifyCert = VerifyCertificate(certificate);
395+
bool verifyCert = VerifyCertificate(certificate, ignoreTime);
395396
if (!verifyCert)
396397
{
397398
Logger.LogWarning("Skipping signature verification for {cert}", certificate);
@@ -516,30 +517,27 @@ protected virtual void RunVerify(StatusContext statusContext)
516517
/// Verifies the validity of a certificate.
517518
/// </summary>
518519
/// <param name="certificate">The certificate to verify.</param>
520+
/// <param name="ignoreTime">A value indicating whether to ignore time validity checks.</param>
519521
/// <returns>True if the certificate is valid; otherwise, false.</returns>
520-
protected bool VerifyCertificate(X509Certificate2 certificate)
522+
protected bool VerifyCertificate(X509Certificate2 certificate, bool ignoreTime)
521523
{
522524
if (Bundle == null)
523525
{
524526
throw new ApplicationException("Bundle is not initialized");
525527
}
526528

527-
List<bool> verifyResults = [];
528-
529529
X509Certificate2? rootCA;
530530
if ((rootCA = GetSelfSigningRootCA()) != null)
531531
{
532532
Logger.LogDebug("Verifying certificate {cert} with self-signing root CA", certificate);
533533

534-
X509ChainPolicy policy = new X509ChainPolicy();
535-
policy.TrustMode = X509ChainTrustMode.CustomRootTrust;
536-
policy.CustomTrustStore.Add(rootCA);
537-
policy.VerificationFlags |= X509VerificationFlags.IgnoreNotTimeValid;
538-
policy.RevocationMode = X509RevocationMode.NoCheck;
539-
540-
bool selfSignVerification = Bundle.VerifyCertificate(certificate, out X509ChainStatus[] selfSignStatuses, policy: policy);
541-
verifyResults.Add(selfSignVerification);
534+
X509ChainPolicy selfSignPolicy = new X509ChainPolicy();
535+
selfSignPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust;
536+
selfSignPolicy.CustomTrustStore.Add(rootCA);
537+
selfSignPolicy.VerificationFlags |= X509VerificationFlags.IgnoreNotTimeValid;
538+
selfSignPolicy.RevocationMode = X509RevocationMode.NoCheck;
542539

540+
bool selfSignVerification = Bundle.VerifyCertificate(certificate, out _, policy: selfSignPolicy);
543541
Logger.LogInformation("Certificate verification with self-signing root CA for {cert}: {result}", certificate, selfSignVerification);
544542

545543
if (selfSignVerification)
@@ -549,36 +547,30 @@ protected bool VerifyCertificate(X509Certificate2 certificate)
549547
}
550548
}
551549

552-
Logger.LogDebug("Verifying certificate {cert} with default verification policy", certificate);
553-
bool defaultVerification = Bundle.VerifyCertificate(certificate, out X509ChainStatus[] statuses);
554-
verifyResults.Add(defaultVerification);
555-
556-
Logger.LogInformation("Certificate verification with default policy for {cert}: {result}", certificate, defaultVerification);
557-
AnsiConsole.MarkupLine($"[{(defaultVerification ? Color.Green : Color.Red)}] Certificate Verification {(defaultVerification ? "Successful" : "Failed")}[/]");
550+
X509ChainPolicy policy = new();
558551

559-
if (!defaultVerification)
552+
if (ignoreTime)
560553
{
561-
bool timeIssue = statuses.Any(x => x.Status.HasFlag(X509ChainStatusFlags.NotTimeValid));
562-
563-
Utilities.EnumerateStatuses(statuses);
564-
565-
if (timeIssue)
566-
{
567-
Logger.LogWarning("Certificate has time validity issues, retrying verification with time check disabled");
554+
policy.VerificationFlags |= X509VerificationFlags.IgnoreCtlNotTimeValid;
555+
}
568556

569-
X509ChainPolicy policy = new X509ChainPolicy();
570-
policy.VerificationFlags |= X509VerificationFlags.IgnoreNotTimeValid;
557+
Logger.LogDebug("Verifying certificate {cert} with system trust store", certificate);
558+
bool defaultVerification = Bundle.VerifyCertificate(certificate, out X509ChainStatus[] statuses, policy);
571559

572-
bool noTimeVerification = Bundle.VerifyCertificate(certificate, out X509ChainStatus[] noTimeStatuses, policy: policy);
573-
verifyResults.Add(noTimeVerification);
560+
Logger.LogInformation("Certificate verification with system trust store for {cert}: {result}", certificate, defaultVerification);
574561

575-
Logger.LogInformation("Certificate verification without time checking for {cert}: {result}", certificate, noTimeVerification);
576-
AnsiConsole.MarkupLine($"[{(noTimeVerification ? Color.Green : Color.Red)}] Certificate Verification without time checking {(noTimeVerification ? "Successful" : "Failed")}[/]");
577-
Utilities.EnumerateStatuses(noTimeStatuses);
578-
}
562+
if (!defaultVerification)
563+
{
564+
Utilities.EnumerateStatuses(statuses);
565+
}
566+
else
567+
{
568+
AnsiConsole.MarkupLine($"[green] Certificate Verification Successful[/]");
569+
return true;
579570
}
580571

581-
return verifyResults.Any(x => x);
572+
AnsiConsole.MarkupLine($"[red] Certificate Verification Failed[/]");
573+
return false;
582574
}
583575
}
584576
}

src/EasySign.CommandLine/CommandProvider.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,16 +275,20 @@ public Command Verify
275275
{
276276
get
277277
{
278+
var ignoreTimeOpt = new Option<bool>("--ignore-time", "Ignore time validation");
279+
ignoreTimeOpt.AddAlias("-i");
280+
278281
Command command = new Command("verify", "Verify bundle")
279282
{
280283
BundlePath,
284+
ignoreTimeOpt,
281285
};
282286

283-
command.SetHandler((bundlePath) =>
287+
command.SetHandler((bundlePath, ignoreTime) =>
284288
{
285289
InitializeBundle(bundlePath);
286-
Utilities.RunInStatusContext("[yellow]Preparing[/]", ctx => RunVerify(ctx));
287-
}, BundlePath);
290+
Utilities.RunInStatusContext("[yellow]Preparing[/]", ctx => RunVerify(ctx, ignoreTime));
291+
}, BundlePath, ignoreTimeOpt);
288292

289293
return command;
290294
}

0 commit comments

Comments
 (0)