diff --git a/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs b/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs index c4a7333..d2f32e3 100755 --- a/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs +++ b/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs @@ -146,8 +146,9 @@ public void Feiler_med_produksjonssertifikat_når_validerer_mot_testkjede() //Act var sertifikatValidator = new CertificateChainValidator(CertificateChainUtility.FunksjoneltTestmiljøSertifikater()); + var erGyldigSertifikatkjede = sertifikatValidator.ErGyldigSertifikatkjede(produksjonssertifikat); - Assert.Throws(() => sertifikatValidator.ErGyldigSertifikatkjede(produksjonssertifikat)); + Assert.False(erGyldigSertifikatkjede); } [Fact] @@ -158,8 +159,9 @@ public void Feiler_med_testsertifikat_når_validerer_mot_produksjonskjede() //Act var sertifikatValidator = new CertificateChainValidator(CertificateChainUtility.ProduksjonsSertifikater()); + var erGyldigSertifikatkjede = sertifikatValidator.ErGyldigSertifikatkjede(testsertifikat); - Assert.Throws(() => sertifikatValidator.ErGyldigSertifikatkjede(testsertifikat)); + Assert.False(erGyldigSertifikatkjede); } } } diff --git a/Difi.Felles.Utility/CertificateChainValidator.cs b/Difi.Felles.Utility/CertificateChainValidator.cs index bcf0b7c..dfba14f 100755 --- a/Difi.Felles.Utility/CertificateChainValidator.cs +++ b/Difi.Felles.Utility/CertificateChainValidator.cs @@ -19,7 +19,6 @@ public CertificateChainValidator(X509Certificate2Collection sertifikatLager) /// Validerer sertifikatkjeden til sertifikatet. Gjør dette ved å validere mot /// /// - /// Kastes hvis det prøves å gjøre validering mot andre sertifikater enn de i . /// public bool ErGyldigSertifikatkjede(X509Certificate2 sertifikat) { @@ -32,7 +31,6 @@ public bool ErGyldigSertifikatkjede(X509Certificate2 sertifikat) /// /// /// Status på kjeden etter validering hvis validering feilet. - /// Kastes hvis det prøves å gjøre validering mot andre sertifikater enn de i . /// public bool ErGyldigSertifikatkjede(X509Certificate2 sertifikat, out string detaljertFeilinformasjon) { @@ -46,9 +44,11 @@ public SertifikatValideringsResultat ValidateCertificateChain(X509Certificate2 c { var chain = BuildCertificateChain(certificate); - ValidateThatUsingOnlyValidatorCertificatesOrThrow(chain, certificate); + var onlyUsingValidatorCertificatesResult = ValidateThatUsingOnlyValidatorCertificates(chain, certificate); - return ValidateCertificateChain(certificate, chain); + return onlyUsingValidatorCertificatesResult.Type != SertifikatValideringType.Gyldig + ? onlyUsingValidatorCertificatesResult + : ValidateCertificateChain(certificate, chain); } /// @@ -56,14 +56,17 @@ public SertifikatValideringsResultat ValidateCertificateChain(X509Certificate2 c /// /// /// Status på kjeden etter validering hvis validering feilet. - /// Kastes hvis det prøves å gjøre validering mot andre sertifikater enn de i . /// public bool ErGyldigSertifikatkjede(X509Certificate2 sertifikat, out X509ChainStatus[] detaljertFeilinformasjon) { var chain = BuildCertificateChain(sertifikat); detaljertFeilinformasjon = chain.ChainStatus; - ValidateThatUsingOnlyValidatorCertificatesOrThrow(chain,sertifikat); + var onlyUsingValidatorCertificatesResult = ValidateThatUsingOnlyValidatorCertificates(chain,sertifikat); + if (onlyUsingValidatorCertificatesResult.Type != SertifikatValideringType.Gyldig) + { + return false; + } return ValidateCertificateChain(sertifikat, chain).Type == SertifikatValideringType.Gyldig; } @@ -78,7 +81,7 @@ private X509Chain BuildCertificateChain(X509Certificate2 sertifikat) return chain; } - private void ValidateThatUsingOnlyValidatorCertificatesOrThrow(X509Chain chain, X509Certificate2 sertifikat) + private SertifikatValideringsResultat ValidateThatUsingOnlyValidatorCertificates(X509Chain chain, X509Certificate2 sertifikat) { foreach (var chainElement in chain.ChainElements) { @@ -91,11 +94,15 @@ private void ValidateThatUsingOnlyValidatorCertificatesOrThrow(X509Chain chain, var chainAsString = chain.ChainElements.Cast().Aggregate("",(result, curr) => GetCertificateInfo(result, curr.Certificate)); var validatorCertificatesAsString = SertifikatLager.Cast().Aggregate("", GetCertificateInfo); - throw new CertificateChainValidationException($"Validering av sertifikat '{sertifikat.Info()}' feilet. Dette skjer fordi kjeden ble bygd " + - $"med følgende sertifikater {chainAsString}, men kun følgende er godkjent for å bygge kjeden: {validatorCertificatesAsString}. Dette skjer som oftest " + - "om sertifikater blir hentet fra Certificate Store på Windows, og det tillates ikke under validering. Det er kun gyldig å bygge en " + - "kjede med de sertifikatene sendt inn til validatoren."); + return UsedExternalCertificatesResult(sertifikat, chainAsString, validatorCertificatesAsString); } + + return new SertifikatValideringsResultat(SertifikatValideringType.Gyldig, ""); + } + + private static SertifikatValideringsResultat UsedExternalCertificatesResult(X509Certificate2 sertifikat, string chainAsString, string validatorCertificatesAsString) + { + return new SertifikatValideringsResultat(SertifikatValideringType.UgyldigKjede, $"Validering av sertifikat '{sertifikat.Info()}' feilet. Dette skjer fordi kjeden ble bygd med følgende sertifikater {chainAsString}, men kun følgende er godkjent for å bygge kjeden: {validatorCertificatesAsString}. Dette skjer som oftest om sertifikater blir hentet fra Certificate Store på Windows, og det tillates ikke under validering. Det er kun gyldig å bygge en kjede med de sertifikatene sendt inn til validatoren."); } private static bool IsSameCertificate(X509Certificate2 certificate1, X509Certificate2 certificate2) @@ -143,9 +150,9 @@ private static SertifikatValideringsResultat ValidateCertificateChain(X509Certif } } - private static SertifikatValideringsResultat InvalidChainResult(X509Certificate2 theCertificate, params X509ChainStatus[] x509ChainStatuses) + private static SertifikatValideringsResultat InvalidChainResult(X509Certificate2 certificate, params X509ChainStatus[] x509ChainStatuses) { - return CreateSertifikatValideringsResultat(theCertificate, SertifikatValideringType.UgyldigKjede, $"har følgende feil i sertifikatkjeden: {GetPrettyChainErrorStatuses(x509ChainStatuses)}"); + return CreateSertifikatValideringsResultat(certificate, SertifikatValideringType.UgyldigKjede, $"har følgende feil i sertifikatkjeden: {GetPrettyChainErrorStatuses(x509ChainStatuses)}"); } private static SertifikatValideringsResultat ValidResult(X509Certificate2 theCertificate) diff --git a/Difi.Felles.Utility/CertificateValidator.cs b/Difi.Felles.Utility/CertificateValidator.cs index ee474fb..7d97d9c 100755 --- a/Difi.Felles.Utility/CertificateValidator.cs +++ b/Difi.Felles.Utility/CertificateValidator.cs @@ -6,6 +6,11 @@ namespace Difi.Felles.Utility { public class CertificateValidator { + public static bool IsValidCertificate(X509Certificate2 certificate, string certificateOrganizationNumber) + { + return ValidateCertificate(certificate, certificateOrganizationNumber).Type == SertifikatValideringType.Gyldig; + } + public static SertifikatValideringsResultat ValidateCertificateAndChain(X509Certificate2 certificate, string certificateOrganizationNumber, X509Certificate2Collection chainCertificates) { var sertifikatValideringsResultat = ValidateCertificate(certificate, certificateOrganizationNumber); @@ -44,11 +49,6 @@ public static SertifikatValideringsResultat ValidateCertificate(X509Certificate2 return ValidResult(certificate); } - public static bool IsValidCertificate(X509Certificate2 certificate, string certificateOrganizationNumber) - { - return ValidateCertificate(certificate, certificateOrganizationNumber).Type == SertifikatValideringType.Gyldig; - } - private static SertifikatValideringsResultat NoCertificateResult() { return new SertifikatValideringsResultat(SertifikatValideringType.UgyldigSertifikat, $"Sertifikat var {null}!"); diff --git a/Difi.Felles.Utility/Difi.Felles.Utility.csproj b/Difi.Felles.Utility/Difi.Felles.Utility.csproj index 1a04538..290648e 100755 --- a/Difi.Felles.Utility/Difi.Felles.Utility.csproj +++ b/Difi.Felles.Utility/Difi.Felles.Utility.csproj @@ -50,7 +50,6 @@ - diff --git a/Difi.Felles.Utility/Exceptions/CertificateChainValidationException.cs b/Difi.Felles.Utility/Exceptions/CertificateChainValidationException.cs deleted file mode 100755 index 4d3dc08..0000000 --- a/Difi.Felles.Utility/Exceptions/CertificateChainValidationException.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Difi.Felles.Utility.Exceptions -{ - public class CertificateChainValidationException : SecurityException - { - public CertificateChainValidationException(string message) - : base(message) - { - } - } -}