Skip to content

Commit

Permalink
Fjerner exceptionkasting for bruk av maskinsertifikater
Browse files Browse the repository at this point in the history
Nå returnerer vi heller en fin feilmelding som en del av resultatet.
  • Loading branch information
Aleksander Aas Sjåfjell committed Sep 27, 2016
1 parent 201bfd0 commit 964aa72
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 31 deletions.
6 changes: 4 additions & 2 deletions Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<CertificateChainValidationException>(() => sertifikatValidator.ErGyldigSertifikatkjede(produksjonssertifikat));
Assert.False(erGyldigSertifikatkjede);
}

[Fact]
Expand All @@ -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<CertificateChainValidationException>(() => sertifikatValidator.ErGyldigSertifikatkjede(testsertifikat));
Assert.False(erGyldigSertifikatkjede);
}
}
}
Expand Down
33 changes: 20 additions & 13 deletions Difi.Felles.Utility/CertificateChainValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ public CertificateChainValidator(X509Certificate2Collection sertifikatLager)
/// Validerer sertifikatkjeden til sertifikatet. Gjør dette ved å validere mot <see cref="SertifikatLager"/>
/// </summary>
/// <param name="sertifikat"></param>
/// <exception cref="CertificateChainValidationException">Kastes hvis det prøves å gjøre validering mot andre sertifikater enn de i <see cref="SertifikatLager"/>.</exception>
/// <returns></returns>
public bool ErGyldigSertifikatkjede(X509Certificate2 sertifikat)
{
Expand All @@ -32,7 +31,6 @@ public bool ErGyldigSertifikatkjede(X509Certificate2 sertifikat)
/// </summary>
/// <param name="sertifikat"></param>
/// <param name="detaljertFeilinformasjon">Status på kjeden etter validering hvis validering feilet.</param>
/// <exception cref="CertificateChainValidationException">Kastes hvis det prøves å gjøre validering mot andre sertifikater enn de i <see cref="SertifikatLager"/>.</exception>
/// <returns></returns>
public bool ErGyldigSertifikatkjede(X509Certificate2 sertifikat, out string detaljertFeilinformasjon)
{
Expand All @@ -46,24 +44,29 @@ 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);
}

/// <summary>
/// Validerer sertifikatkjeden til sertifikatet. Gjør dette ved å validere mot <see cref="SertifikatLager"/>
/// </summary>
/// <param name="sertifikat"></param>
/// <param name="detaljertFeilinformasjon">Status på kjeden etter validering hvis validering feilet.</param>
/// <exception cref="CertificateChainValidationException">Kastes hvis det prøves å gjøre validering mot andre sertifikater enn de i <see cref="SertifikatLager"/>.</exception>
/// <returns></returns>
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;
}
Expand All @@ -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)
{
Expand All @@ -91,11 +94,15 @@ private void ValidateThatUsingOnlyValidatorCertificatesOrThrow(X509Chain chain,
var chainAsString = chain.ChainElements.Cast<X509ChainElement>().Aggregate("",(result, curr) => GetCertificateInfo(result, curr.Certificate));
var validatorCertificatesAsString = SertifikatLager.Cast<X509Certificate2>().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)
Expand Down Expand Up @@ -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)
Expand Down
10 changes: 5 additions & 5 deletions Difi.Felles.Utility/CertificateValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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}!");
Expand Down
1 change: 0 additions & 1 deletion Difi.Felles.Utility/Difi.Felles.Utility.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@
<Compile Include="Extensions\X509Certificate2Extensions.cs" />
<Compile Include="SertifikatValideringType.cs" />
<Compile Include="SertifikatValideringsResultat.cs" />
<Compile Include="Exceptions\CertificateChainValidationException.cs" />
<Compile Include="Security\RsaPkCs1Sha256SignatureDescription.cs" />
<Compile Include="Exceptions\DifiException.cs" />
<Compile Include="Exceptions\SecurityException.cs" />
Expand Down

This file was deleted.

0 comments on commit 964aa72

Please sign in to comment.