From d3bf787b8c384e2a7d39c847656311c2aec7f873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Aas=20Sja=CC=8Afjell?= Date: Wed, 21 Sep 2016 09:01:19 +0200 Subject: [PATCH 1/7] Bedre sertifikatvalidering og bugfiks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I utgangspunktet så fungerer sertifikatvalideringen bra, men det er for mye automagi på Windows som vi må håndtere. For eksempel, så vil validering av et produksjonssertifikat mot testkjede gå fint fordi validatoren plukker opp sertifikater fra store på windows. Dette er ikke noe vi klarer å stoppe, så nå løper vi gjennom alle sertifikater og ser at kjeden kun er bygd vha sertifikater som vi har matet den med. Passe usexy, men det gjør jobben. Dette gjør også at vi vil nekte prodsertifikater å validere mot test og andre veien. --- .../CertificateChainValidatorTests.cs | 51 ++++++++++--- .../Difi.Felles.Utility.Tester.csproj | 2 +- ...ter.cs => CertificateChainUtilityTests.cs} | 24 +++++- .../CertificateChainValidator.cs | 75 +++++++++++++++---- 4 files changed, 119 insertions(+), 33 deletions(-) rename Difi.Felles.Utility.Tester/Utilities/{SertifikatkjedeUtilityTester.cs => CertificateChainUtilityTests.cs} (58%) diff --git a/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs b/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs index b5b07e7..a1887a3 100755 --- a/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs +++ b/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs @@ -1,6 +1,6 @@ using System.Linq; using System.Security.Cryptography.X509Certificates; -using ApiClientShared; +using Difi.Felles.Utility.Exceptions; using Difi.Felles.Utility.Utilities; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -9,13 +9,11 @@ namespace Difi.Felles.Utility.Tester [TestClass] public class CertificateChainValidatorTests { - private static readonly ResourceUtility ResourceUtility = new ResourceUtility("Difi.Felles.Utility.Tester.Testdata.Sertifikater"); - [TestClass] public class ErGyldigSertifikatkjedeMethod : CertificateChainValidatorTests { [TestMethod] - public void ErGyldigSertifikatkjedeMedProduksjonssertifikater() + public void Gyldig_produksjonssertifikat_når_validerer_mot_produksjonskjede() { //Arrange var produksjonssertifikat = SertifikatUtility.GetProduksjonsMottakerSertifikatOppslagstjenesten(); @@ -29,7 +27,7 @@ public void ErGyldigSertifikatkjedeMedProduksjonssertifikater() } [TestMethod] - public void ErGyldigSertifikatkjedeMedFunksjoneltTestmiljøsertifikater() + public void Gyldig_testsertifikat_når_validerer_mot_testkjede() { //Arrange var testSertifikat = SertifikatUtility.GetFunksjoneltTestmiljøMottakerSertifikatOppslagstjenesten(); @@ -43,7 +41,7 @@ public void ErGyldigSertifikatkjedeMedFunksjoneltTestmiljøsertifikater() } [TestMethod] - public void ErGyldigSertifikatkjedeOgKjedestatusMedProduksjonssertifikater() + public void Gyldig_produksjonssertifikat_og_kjedestatus_når_validerer_mot_produksjonskjede() { //Arrange var produksjonssertifikat = SertifikatUtility.GetProduksjonsMottakerSertifikatOppslagstjenesten(); @@ -60,7 +58,7 @@ public void ErGyldigSertifikatkjedeOgKjedestatusMedProduksjonssertifikater() } [TestMethod] - public void ErGyldigSertifikatkjedeOgKjedestatusMedFunksjoneltTestmiljøsertifikater() + public void Gyldig_testsertifikat_og_kjedestatus_når_validerer_mot_testkjede() { //Arrange var testSertifikat = SertifikatUtility.GetFunksjoneltTestmiljøMottakerSertifikatOppslagstjenesten(); @@ -72,11 +70,11 @@ public void ErGyldigSertifikatkjedeOgKjedestatusMedFunksjoneltTestmiljøsertifik //Assert Assert.IsTrue(erGyldigResponssertifikat); - Assert.IsTrue(kjedestatus.Length == 0 || kjedestatus.ElementAt(0).Status == X509ChainStatusFlags.UntrustedRoot); + Assert.IsTrue((kjedestatus.Length == 0) || (kjedestatus.ElementAt(0).Status == X509ChainStatusFlags.UntrustedRoot)); } [TestMethod] - public void FeilerMedSertifikatUtenGyldigKjedeMedProduksjonssertifikater() + public void Feiler_med_selvsignert_sertifikat_når_validerer_mot_produksjonskjede() { //Arrange var selvsignertSertifikat = SertifikatUtility.GetEnhetstesterSelvsignertSertifikat(); @@ -91,7 +89,7 @@ public void FeilerMedSertifikatUtenGyldigKjedeMedProduksjonssertifikater() } [TestMethod] - public void FeilerMedSertifikatUtenGyldigKjedeMedFunksjoneltTestmiljøsertifikater() + public void Feiler_med_selvsignert_sertifikat_når_validerer_mot_testkjede() { //Arrange var selvsignertSertifikat = SertifikatUtility.GetEnhetstesterSelvsignertSertifikat(); @@ -106,7 +104,7 @@ public void FeilerMedSertifikatUtenGyldigKjedeMedFunksjoneltTestmiljøsertifikat } [TestMethod] - public void FeilerMedSertifikatUtenGyldigKjedeReturnererKjedestatusMedProduksjonssertifikater() + public void Feiler_med_selvsignert_sertifikat_og_kjedestatus_når_validerer_mot_produksjonskjede() { //Arrange var selvsignertSertifikat = SertifikatUtility.GetEnhetstesterSelvsignertSertifikat(); @@ -123,9 +121,10 @@ public void FeilerMedSertifikatUtenGyldigKjedeReturnererKjedestatusMedProduksjon } [TestMethod] - public void FeilerMedSertifikatUtenGyldigKjedeReturnererKjedestatusMedFunksjoneltTestmiljøsertifikater() + public void Feiler_med_selvsignert_sertifikat_og_kjedestatus_når_validerer_mot_testkjede() { var selvsignertSertifikat = SertifikatUtility.GetEnhetstesterSelvsignertSertifikat(); + //Act var sertifikatValidator = new CertificateChainValidator(CertificateChainUtility.FunksjoneltTestmiljøSertifikater()); @@ -136,6 +135,34 @@ public void FeilerMedSertifikatUtenGyldigKjedeReturnererKjedestatusMedFunksjonel Assert.IsFalse(erGyldigResponssertifikat); Assert.IsTrue(kjedestatus.ElementAt(0).Status == X509ChainStatusFlags.UntrustedRoot); } + + [TestMethod] + [ExpectedException(typeof(SecurityException))] + public void Feiler_med_produksjonssertifikat_når_validerer_mot_testkjede() + { + //Arrange + var produksjonssertifikat = SertifikatUtility.GetProduksjonsMottakerSertifikatOppslagstjenesten(); + + //Act + var sertifikatValidator = new CertificateChainValidator(CertificateChainUtility.FunksjoneltTestmiljøSertifikater()); + + X509ChainStatus[] kjedestatus; + var erGyldigResponssertifikat = sertifikatValidator.ErGyldigSertifikatkjede(produksjonssertifikat, out kjedestatus); + } + + [TestMethod] + [ExpectedException(typeof(SecurityException))] + public void Feiler_med_testsertifikat_når_validerer_mot_produksjonskjede() + { + //Arrange + var testsertifikat = SertifikatUtility.GetFunksjoneltTestmiljøMottakerSertifikatOppslagstjenesten(); + + //Act + var sertifikatValidator = new CertificateChainValidator(CertificateChainUtility.ProduksjonsSertifikater()); + + X509ChainStatus[] kjedestatus; + var erGyldigResponssertifikat = sertifikatValidator.ErGyldigSertifikatkjede(testsertifikat, out kjedestatus); + } } } } \ No newline at end of file diff --git a/Difi.Felles.Utility.Tester/Difi.Felles.Utility.Tester.csproj b/Difi.Felles.Utility.Tester/Difi.Felles.Utility.Tester.csproj index 4e60f09..3adbb6c 100755 --- a/Difi.Felles.Utility.Tester/Difi.Felles.Utility.Tester.csproj +++ b/Difi.Felles.Utility.Tester/Difi.Felles.Utility.Tester.csproj @@ -72,7 +72,7 @@ - + diff --git a/Difi.Felles.Utility.Tester/Utilities/SertifikatkjedeUtilityTester.cs b/Difi.Felles.Utility.Tester/Utilities/CertificateChainUtilityTests.cs similarity index 58% rename from Difi.Felles.Utility.Tester/Utilities/SertifikatkjedeUtilityTester.cs rename to Difi.Felles.Utility.Tester/Utilities/CertificateChainUtilityTests.cs index 3cffe41..e9d132a 100755 --- a/Difi.Felles.Utility.Tester/Utilities/SertifikatkjedeUtilityTester.cs +++ b/Difi.Felles.Utility.Tester/Utilities/CertificateChainUtilityTests.cs @@ -1,13 +1,14 @@ -using Difi.Felles.Utility.Utilities; +using System.Diagnostics; +using Difi.Felles.Utility.Utilities; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Difi.Felles.Utility.Tester.Utilities { [TestClass] - public class SertifikatkjedeUtilityTester + public class CertificateChainUtilityTests { [TestClass] - public class TestsertifikaterMethod : SertifikatkjedeUtilityTester + public class TestsertifikaterMethod : CertificateChainUtilityTests { [TestMethod] public void ReturnererFireSertifikaterMedThumbprint() @@ -26,7 +27,7 @@ public void ReturnererFireSertifikaterMedThumbprint() } [TestClass] - public class ProduksjonssertifikaterMethod : SertifikatkjedeUtilityTester + public class ProduksjonssertifikaterMethod : CertificateChainUtilityTests { [TestMethod] public void ReturnererFireSertifikaterMedThumbprint() @@ -43,5 +44,20 @@ public void ReturnererFireSertifikaterMedThumbprint() } } } + + [TestClass] + public class CertificateChainInfoTests : CertificateChainUtilityTests + { + [TestMethod] + public void DebugMesages() + { + int i = 0; + foreach (var certificate in CertificateChainUtility.FunksjoneltTestmiljøSertifikater()) + { + Trace.WriteLine($"{i++}: Issuer `{certificate.Issuer}`, thumbprint `{certificate.Thumbprint}`"); + } + } + + } } } \ No newline at end of file diff --git a/Difi.Felles.Utility/CertificateChainValidator.cs b/Difi.Felles.Utility/CertificateChainValidator.cs index 2a58057..6fb2335 100755 --- a/Difi.Felles.Utility/CertificateChainValidator.cs +++ b/Difi.Felles.Utility/CertificateChainValidator.cs @@ -1,4 +1,8 @@ -using System.Security.Cryptography.X509Certificates; +using System; +using System.Linq; +using System.Net.Mime; +using System.Security.Cryptography.X509Certificates; +using Difi.Felles.Utility.Exceptions; namespace Difi.Felles.Utility { @@ -22,44 +26,83 @@ public bool ErGyldigSertifikatkjede(X509Certificate2 sertifikat, out X509ChainSt var chain = new X509Chain { ChainPolicy = ChainPolicy() + }; var erGyldigResponssertifikat = chain.Build(sertifikat); - if (!erGyldigResponssertifikat) - { - erGyldigResponssertifikat = ErGyldigResponssertifikatHvisKunUntrustedRoot(chain); - } + ValiderAtKunBrukerValidatorSertifikater(chain,sertifikat); + + erGyldigResponssertifikat = ErGyldigResponssertifikatKjede(chain); + kjedestatus = chain.ChainStatus; return erGyldigResponssertifikat; } + private void ValiderAtKunBrukerValidatorSertifikater(X509Chain chain, X509Certificate2 sertifikat) + { + foreach (var chainElement in chain.ChainElements) + { + var erSertifikatSomValideres = ErSammeSertifikat(chainElement.Certificate, sertifikat); + if (erSertifikatSomValideres) + { + continue; + } + + var erISertifikatlager = SertifikatLager.Cast().Any(lagerSertifikat => ErSammeSertifikat(chainElement.Certificate, lagerSertifikat)); + + if (!erISertifikatlager) + { + var chainAsString = chain.ChainElements.Cast().Aggregate("",(result, curr) => GetCertificateInfo(result, curr.Certificate)); + var lagerAsString = SertifikatLager.Cast().Aggregate("", GetCertificateInfo); + + throw new SecurityException($"Validering av sertifikat '{sertifikat.Subject}' (thumbprint '{sertifikat.Thumbprint}') feilet. Dette skjer fordi kjeden ble bygd " + + $"med følgende sertifikater {chainAsString}, men kun følgende er godkjent for å bygge kjeden: {lagerAsString}"); + } + } + } + + private static bool ErSammeSertifikat(X509Certificate2 sertifikat1, X509Certificate2 sertifikat2) + { + return sertifikat2.Thumbprint == sertifikat1.Thumbprint; + } + + private static string GetCertificateInfo(string current, X509Certificate2 chainchain) + { + return current + $"'{chainchain.Subject}' {Environment.NewLine}"; + } + public X509ChainPolicy ChainPolicy() { var policy = new X509ChainPolicy { RevocationMode = X509RevocationMode.NoCheck }; + policy.ExtraStore.AddRange(SertifikatLager); return policy; } - private static bool ErGyldigResponssertifikatHvisKunUntrustedRoot(X509Chain chain) + private static bool ErGyldigResponssertifikatKjede(X509Chain chain) { - var erGyldigResponssertifikat = false; - const int forventetKjedelengde = 3; - const int forventetAntallKjedeStatuselementer = 1; - - var kjedeElementer = chain.ChainElements; - var erKjedeMedTreSertifikater = kjedeElementer.Count == forventetKjedelengde; - var erUntrustedRoot = chain.ChainStatus.Length == forventetAntallKjedeStatuselementer && chain.ChainStatus[0].Status == X509ChainStatusFlags.UntrustedRoot; - if (erKjedeMedTreSertifikater && erUntrustedRoot) + if (!HarForventetLengde(chain, 3)) return false; + + switch (chain.ChainStatus.Length) { - erGyldigResponssertifikat = true; + case 0: + return true; + case 1: + var erUntrustedStatus = chain.ChainStatus.ElementAt(0).Status == X509ChainStatusFlags.UntrustedRoot; + return erUntrustedStatus; + default: + return false; } + } - return erGyldigResponssertifikat; + private static bool HarForventetLengde(X509Chain chain, int kjedelengde) + { + return chain.ChainElements.Count == kjedelengde; } } } \ No newline at end of file From 984a0d0971372c57b28cea9fd03f4fb6440199b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Aas=20Sja=CC=8Afjell?= Date: Wed, 21 Sep 2016 10:19:26 +0200 Subject: [PATCH 2/7] Legger CertificateChainValidationException og flytter klasse MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Flytter RsaPkCs1Sha256SignatureDescription, dette er ikke en exception men en Security-klasse - Lager en mer spesifkk exception om det går galt med sertifikatvalideringen. Rydder også litt i strukturen for å bedre se hvordan validerin gjøres. - Bedre XmlDoc for CertificateChainValidator --- .../CertificateChainValidatorTests.cs | 4 +- .../CertificateChainValidator.cs | 58 +++++++++++-------- .../Difi.Felles.Utility.csproj | 3 +- .../CertificateChainValidationException.cs | 10 ++++ .../RsaPkCs1Sha256SignatureDescription.cs | 0 5 files changed, 49 insertions(+), 26 deletions(-) create mode 100755 Difi.Felles.Utility/Exceptions/CertificateChainValidationException.cs rename Difi.Felles.Utility/{Exceptions => Security}/RsaPkCs1Sha256SignatureDescription.cs (100%) diff --git a/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs b/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs index a1887a3..7706197 100755 --- a/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs +++ b/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs @@ -137,7 +137,7 @@ public void Feiler_med_selvsignert_sertifikat_og_kjedestatus_når_validerer_mot_ } [TestMethod] - [ExpectedException(typeof(SecurityException))] + [ExpectedException(typeof(CertificateChainValidationException))] public void Feiler_med_produksjonssertifikat_når_validerer_mot_testkjede() { //Arrange @@ -151,7 +151,7 @@ public void Feiler_med_produksjonssertifikat_når_validerer_mot_testkjede() } [TestMethod] - [ExpectedException(typeof(SecurityException))] + [ExpectedException(typeof(CertificateChainValidationException))] public void Feiler_med_testsertifikat_når_validerer_mot_produksjonskjede() { //Arrange diff --git a/Difi.Felles.Utility/CertificateChainValidator.cs b/Difi.Felles.Utility/CertificateChainValidator.cs index 6fb2335..d04660f 100755 --- a/Difi.Felles.Utility/CertificateChainValidator.cs +++ b/Difi.Felles.Utility/CertificateChainValidator.cs @@ -15,50 +15,62 @@ public CertificateChainValidator(X509Certificate2Collection sertifikatLager) public X509Certificate2Collection SertifikatLager { get; set; } + /// + /// 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) { X509ChainStatus[] kjedestatus; return ErGyldigSertifikatkjede(sertifikat, out kjedestatus); } + /// + /// Validerer sertifikatkjeden til sertifikatet. Gjør dette ved å validere mot + /// + /// + /// Status på kjeden etter validering. + /// Kastes hvis det prøves å gjøre validering mot andre sertifikater enn de i . + /// public bool ErGyldigSertifikatkjede(X509Certificate2 sertifikat, out X509ChainStatus[] kjedestatus) + { + var chain = ByggSertifikatKjede(sertifikat); + kjedestatus = chain.ChainStatus; + + ValiderBrukerValidatorSertifikaterEllerKastException(chain,sertifikat); + + return ErGyldigSertifikatKjede(chain); + } + + private X509Chain ByggSertifikatKjede(X509Certificate2 sertifikat) { var chain = new X509Chain { ChainPolicy = ChainPolicy() - }; - - var erGyldigResponssertifikat = chain.Build(sertifikat); - - ValiderAtKunBrukerValidatorSertifikater(chain,sertifikat); - - erGyldigResponssertifikat = ErGyldigResponssertifikatKjede(chain); - - kjedestatus = chain.ChainStatus; - return erGyldigResponssertifikat; + chain.Build(sertifikat); + return chain; } - private void ValiderAtKunBrukerValidatorSertifikater(X509Chain chain, X509Certificate2 sertifikat) + private void ValiderBrukerValidatorSertifikaterEllerKastException(X509Chain chain, X509Certificate2 sertifikat) { foreach (var chainElement in chain.ChainElements) { var erSertifikatSomValideres = ErSammeSertifikat(chainElement.Certificate, sertifikat); - if (erSertifikatSomValideres) - { - continue; - } + if (erSertifikatSomValideres) { continue; } var erISertifikatlager = SertifikatLager.Cast().Any(lagerSertifikat => ErSammeSertifikat(chainElement.Certificate, lagerSertifikat)); + if (erISertifikatlager) { continue; } - if (!erISertifikatlager) - { - var chainAsString = chain.ChainElements.Cast().Aggregate("",(result, curr) => GetCertificateInfo(result, curr.Certificate)); - var lagerAsString = SertifikatLager.Cast().Aggregate("", GetCertificateInfo); + var chainAsString = chain.ChainElements.Cast().Aggregate("",(result, curr) => GetCertificateInfo(result, curr.Certificate)); + var lagerAsString = SertifikatLager.Cast().Aggregate("", GetCertificateInfo); - throw new SecurityException($"Validering av sertifikat '{sertifikat.Subject}' (thumbprint '{sertifikat.Thumbprint}') feilet. Dette skjer fordi kjeden ble bygd " + - $"med følgende sertifikater {chainAsString}, men kun følgende er godkjent for å bygge kjeden: {lagerAsString}"); - } + throw new CertificateChainValidationException($"Validering av sertifikat '{sertifikat.Subject}' (thumbprint '{sertifikat.Thumbprint}') feilet. Dette skjer fordi kjeden ble bygd " + + $"med følgende sertifikater {chainAsString}, men kun følgende er godkjent for å bygge kjeden: {lagerAsString}. 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 input {nameof(SertifikatLager)}."); } } @@ -84,7 +96,7 @@ public X509ChainPolicy ChainPolicy() return policy; } - private static bool ErGyldigResponssertifikatKjede(X509Chain chain) + private static bool ErGyldigSertifikatKjede(X509Chain chain) { if (!HarForventetLengde(chain, 3)) return false; diff --git a/Difi.Felles.Utility/Difi.Felles.Utility.csproj b/Difi.Felles.Utility/Difi.Felles.Utility.csproj index 9a7d214..09d8dda 100755 --- a/Difi.Felles.Utility/Difi.Felles.Utility.csproj +++ b/Difi.Felles.Utility/Difi.Felles.Utility.csproj @@ -47,7 +47,8 @@ Properties\SharedAssemblyInfo.cs - + + diff --git a/Difi.Felles.Utility/Exceptions/CertificateChainValidationException.cs b/Difi.Felles.Utility/Exceptions/CertificateChainValidationException.cs new file mode 100755 index 0000000..4d3dc08 --- /dev/null +++ b/Difi.Felles.Utility/Exceptions/CertificateChainValidationException.cs @@ -0,0 +1,10 @@ +namespace Difi.Felles.Utility.Exceptions +{ + public class CertificateChainValidationException : SecurityException + { + public CertificateChainValidationException(string message) + : base(message) + { + } + } +} diff --git a/Difi.Felles.Utility/Exceptions/RsaPkCs1Sha256SignatureDescription.cs b/Difi.Felles.Utility/Security/RsaPkCs1Sha256SignatureDescription.cs similarity index 100% rename from Difi.Felles.Utility/Exceptions/RsaPkCs1Sha256SignatureDescription.cs rename to Difi.Felles.Utility/Security/RsaPkCs1Sha256SignatureDescription.cs From b01d0f99756018df06c5e1dff871793d87215caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Aas=20Sja=CC=8Afjell?= Date: Wed, 21 Sep 2016 10:55:38 +0200 Subject: [PATCH 3/7] Rydder opp i AssemblyInfo og bumper versjon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fjerner unødvendig duplisering av assembly info. --- .../Properties/AssemblyInfo.cs | 24 ++----------------- .../Properties/AssemblyInfo.cs | 19 --------------- SharedAssemblyInfo.cs | 24 ++++++++----------- 3 files changed, 12 insertions(+), 55 deletions(-) diff --git a/Difi.Felles.Utility.Tester/Properties/AssemblyInfo.cs b/Difi.Felles.Utility.Tester/Properties/AssemblyInfo.cs index 10df334..d076548 100755 --- a/Difi.Felles.Utility.Tester/Properties/AssemblyInfo.cs +++ b/Difi.Felles.Utility.Tester/Properties/AssemblyInfo.cs @@ -1,25 +1,5 @@ using System.Reflection; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - -[assembly: AssemblyTitle("Difi.Felles.UtilityTests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Difi.Felles.UtilityTests")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. - -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM - -[assembly: Guid("663926ad-e1e6-4008-831f-0201eb029671")] \ No newline at end of file +[assembly: AssemblyTitle("Difi.Felles.Utility.Tester")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/Difi.Felles.Utility/Properties/AssemblyInfo.cs b/Difi.Felles.Utility/Properties/AssemblyInfo.cs index 8dce028..c4d9483 100755 --- a/Difi.Felles.Utility/Properties/AssemblyInfo.cs +++ b/Difi.Felles.Utility/Properties/AssemblyInfo.cs @@ -2,26 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - [assembly: AssemblyTitle("Difi.Felles.Utility")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Difi.Felles.Utility")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. - [assembly: ComVisible(false)] -// The following GUID is for the ID of the typelib if this project is exposed to COM - -[assembly: Guid("0d9102ab-2ab7-4d28-bd7a-6626bdb2b9d2")] [assembly: InternalsVisibleTo("Difi.Oppslagstjeneste.Klient.Tester,PublicKey=00240000048000009400000006020000002400005253413100040000010001008b3388f9c416425f0145bbcf26e66b9a87c4e08b4cd41563e4bc8846df38ba4d997c5408cc77da26d79b03c39874a6af9df0aff3e7bdb3c0e53a91f6d19c50e160f5bf67986a04f0f985eca0252f557ed9ae520dd51e3107d6168d073d4ec5ada28d34e492ad9fb7af29c82309c5c0124211e679caea38d5463d2af9042dafda")] \ No newline at end of file diff --git a/SharedAssemblyInfo.cs b/SharedAssemblyInfo.cs index 0c627bf..e2b15dd 100755 --- a/SharedAssemblyInfo.cs +++ b/SharedAssemblyInfo.cs @@ -1,17 +1,13 @@ -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] - -using System.Reflection; +using System.Reflection; using System.Runtime.CompilerServices; -[assembly: AssemblyVersion("0.6.*")] -[assembly: AssemblyFileVersion("0.6.*")] +[assembly: AssemblyCompany("Direktoratet for forvaltning og IKT (Difi)")] +[assembly: AssemblyTrademark("Direktoratet for forvaltning og IKT (Difi)")] +[assembly: AssemblyProduct("Difi Felles Utility")] +[assembly: AssemblyDescription("Bibliotek brukt av Difi i klientbiblioteker")] +[assembly: AssemblyVersion("0.7.0.*")] +[assembly: AssemblyFileVersion("0.7.0.*")] +[assembly: AssemblyCopyright("© 2015-2016 Direktoratet for forvaltning og IKT (Difi)")] +[assembly: AssemblyCulture("")] + [assembly: InternalsVisibleTo("Difi.Felles.Utility.Tester,PublicKey=00240000048000009400000006020000002400005253413100040000010001008b3388f9c416425f0145bbcf26e66b9a87c4e08b4cd41563e4bc8846df38ba4d997c5408cc77da26d79b03c39874a6af9df0aff3e7bdb3c0e53a91f6d19c50e160f5bf67986a04f0f985eca0252f557ed9ae520dd51e3107d6168d073d4ec5ada28d34e492ad9fb7af29c82309c5c0124211e679caea38d5463d2af9042dafda")] \ No newline at end of file From 9f8e5e6b23c38832a39c494efbae0efbad61d34a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Aas=20Sja=CC=8Afjell?= Date: Wed, 21 Sep 2016 12:17:43 +0200 Subject: [PATCH 4/7] =?UTF-8?q?G=C3=A5r=20over=20til=20Xunit=20som=20testr?= =?UTF-8?q?ammeverk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CertificateChainValidatorTests.cs | 58 +++++++++---------- .../CertificateValidatorTests.cs | 28 ++++----- .../Difi.Felles.Utility.Tester.csproj | 21 +++++++ .../Security/SignedXmlWithAgnosticIdTests.cs | 47 +++++++-------- .../Utilities/CertificateChainUtilityTests.cs | 20 +++---- .../Validation/ValidationMessagesTests.cs | 38 ++++++------ .../Validation/XmlValidationRunnerTests.cs | 16 ++--- .../Validation/XmlValidatorTests.cs | 54 ++++++++--------- Difi.Felles.Utility.Tester/packages.config | 5 ++ 9 files changed, 157 insertions(+), 130 deletions(-) diff --git a/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs b/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs index 7706197..c4a7333 100755 --- a/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs +++ b/Difi.Felles.Utility.Tester/CertificateChainValidatorTests.cs @@ -3,16 +3,18 @@ using Difi.Felles.Utility.Exceptions; using Difi.Felles.Utility.Utilities; using Microsoft.VisualStudio.TestTools.UnitTesting; +using Xunit; +using Assert = Xunit.Assert; namespace Difi.Felles.Utility.Tester { - [TestClass] + public class CertificateChainValidatorTests { - [TestClass] + public class ErGyldigSertifikatkjedeMethod : CertificateChainValidatorTests { - [TestMethod] + [Fact] public void Gyldig_produksjonssertifikat_når_validerer_mot_produksjonskjede() { //Arrange @@ -23,10 +25,10 @@ public void Gyldig_produksjonssertifikat_når_validerer_mot_produksjonskjede() var erGyldigResponssertifikat = sertifikatValidator.ErGyldigSertifikatkjede(produksjonssertifikat); //Assert - Assert.IsTrue(erGyldigResponssertifikat); + Assert.True(erGyldigResponssertifikat); } - [TestMethod] + [Fact] public void Gyldig_testsertifikat_når_validerer_mot_testkjede() { //Arrange @@ -37,10 +39,10 @@ public void Gyldig_testsertifikat_når_validerer_mot_testkjede() var erGyldigResponssertifikat = sertifikatValidator.ErGyldigSertifikatkjede(testSertifikat); //Assert - Assert.IsTrue(erGyldigResponssertifikat); + Assert.True(erGyldigResponssertifikat); } - [TestMethod] + [Fact] public void Gyldig_produksjonssertifikat_og_kjedestatus_når_validerer_mot_produksjonskjede() { //Arrange @@ -53,11 +55,11 @@ public void Gyldig_produksjonssertifikat_og_kjedestatus_når_validerer_mot_produ //Assert const int forventetAntallStatusElementer = 0; - Assert.IsTrue(erGyldigResponssertifikat); - Assert.AreEqual(forventetAntallStatusElementer, kjedestatus.Length); + Assert.True(erGyldigResponssertifikat); + Assert.Equal(forventetAntallStatusElementer, kjedestatus.Length); } - [TestMethod] + [Fact] public void Gyldig_testsertifikat_og_kjedestatus_når_validerer_mot_testkjede() { //Arrange @@ -69,11 +71,11 @@ public void Gyldig_testsertifikat_og_kjedestatus_når_validerer_mot_testkjede() var erGyldigResponssertifikat = sertifikatValidator.ErGyldigSertifikatkjede(testSertifikat, out kjedestatus); //Assert - Assert.IsTrue(erGyldigResponssertifikat); - Assert.IsTrue((kjedestatus.Length == 0) || (kjedestatus.ElementAt(0).Status == X509ChainStatusFlags.UntrustedRoot)); + Assert.True(erGyldigResponssertifikat); + Assert.True((kjedestatus.Length == 0) || (kjedestatus.ElementAt(0).Status == X509ChainStatusFlags.UntrustedRoot)); } - [TestMethod] + [Fact] public void Feiler_med_selvsignert_sertifikat_når_validerer_mot_produksjonskjede() { //Arrange @@ -85,10 +87,10 @@ public void Feiler_med_selvsignert_sertifikat_når_validerer_mot_produksjonskjed var erGyldigResponssertifikat = sertifikatValidator.ErGyldigSertifikatkjede(selvsignertSertifikat); //Assert - Assert.IsFalse(erGyldigResponssertifikat); + Assert.False(erGyldigResponssertifikat); } - [TestMethod] + [Fact] public void Feiler_med_selvsignert_sertifikat_når_validerer_mot_testkjede() { //Arrange @@ -100,10 +102,10 @@ public void Feiler_med_selvsignert_sertifikat_når_validerer_mot_testkjede() var erGyldigResponssertifikat = sertifikatValidator.ErGyldigSertifikatkjede(selvsignertSertifikat); //Assert - Assert.IsFalse(erGyldigResponssertifikat); + Assert.False(erGyldigResponssertifikat); } - [TestMethod] + [Fact] public void Feiler_med_selvsignert_sertifikat_og_kjedestatus_når_validerer_mot_produksjonskjede() { //Arrange @@ -116,11 +118,11 @@ public void Feiler_med_selvsignert_sertifikat_og_kjedestatus_når_validerer_mot_ var erGyldigResponssertifikat = sertifikatValidator.ErGyldigSertifikatkjede(selvsignertSertifikat, out kjedestatus); //Assert - Assert.IsFalse(erGyldigResponssertifikat); - Assert.IsTrue(kjedestatus.ElementAt(0).Status == X509ChainStatusFlags.UntrustedRoot); + Assert.False(erGyldigResponssertifikat); + Assert.True(kjedestatus.ElementAt(0).Status == X509ChainStatusFlags.UntrustedRoot); } - [TestMethod] + [Fact] public void Feiler_med_selvsignert_sertifikat_og_kjedestatus_når_validerer_mot_testkjede() { var selvsignertSertifikat = SertifikatUtility.GetEnhetstesterSelvsignertSertifikat(); @@ -132,12 +134,11 @@ public void Feiler_med_selvsignert_sertifikat_og_kjedestatus_når_validerer_mot_ var erGyldigResponssertifikat = sertifikatValidator.ErGyldigSertifikatkjede(selvsignertSertifikat, out kjedestatus); //Assert - Assert.IsFalse(erGyldigResponssertifikat); - Assert.IsTrue(kjedestatus.ElementAt(0).Status == X509ChainStatusFlags.UntrustedRoot); + Assert.False(erGyldigResponssertifikat); + Assert.True(kjedestatus.ElementAt(0).Status == X509ChainStatusFlags.UntrustedRoot); } - [TestMethod] - [ExpectedException(typeof(CertificateChainValidationException))] + [Fact] public void Feiler_med_produksjonssertifikat_når_validerer_mot_testkjede() { //Arrange @@ -146,12 +147,10 @@ public void Feiler_med_produksjonssertifikat_når_validerer_mot_testkjede() //Act var sertifikatValidator = new CertificateChainValidator(CertificateChainUtility.FunksjoneltTestmiljøSertifikater()); - X509ChainStatus[] kjedestatus; - var erGyldigResponssertifikat = sertifikatValidator.ErGyldigSertifikatkjede(produksjonssertifikat, out kjedestatus); + Assert.Throws(() => sertifikatValidator.ErGyldigSertifikatkjede(produksjonssertifikat)); } - [TestMethod] - [ExpectedException(typeof(CertificateChainValidationException))] + [Fact] public void Feiler_med_testsertifikat_når_validerer_mot_produksjonskjede() { //Arrange @@ -160,8 +159,7 @@ public void Feiler_med_testsertifikat_når_validerer_mot_produksjonskjede() //Act var sertifikatValidator = new CertificateChainValidator(CertificateChainUtility.ProduksjonsSertifikater()); - X509ChainStatus[] kjedestatus; - var erGyldigResponssertifikat = sertifikatValidator.ErGyldigSertifikatkjede(testsertifikat, out kjedestatus); + Assert.Throws(() => sertifikatValidator.ErGyldigSertifikatkjede(testsertifikat)); } } } diff --git a/Difi.Felles.Utility.Tester/CertificateValidatorTests.cs b/Difi.Felles.Utility.Tester/CertificateValidatorTests.cs index 78b303a..38a7d84 100755 --- a/Difi.Felles.Utility.Tester/CertificateValidatorTests.cs +++ b/Difi.Felles.Utility.Tester/CertificateValidatorTests.cs @@ -1,14 +1,16 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; + + +using Xunit; namespace Difi.Felles.Utility.Tester { - [TestClass] + public class CertificateValidatorTests { - [TestClass] + public class IsValidServerSertifikatMethod : CertificateValidatorTests { - [TestMethod] + [Fact] public void ReturnsFalseWithNullCertificate() { //Arrange @@ -18,10 +20,10 @@ public void ReturnsFalseWithNullCertificate() var isValid = CertificateValidator.IsValidCertificate(null, certificateOrganizationNumber); //Assert - Assert.IsFalse(isValid); + Assert.False(isValid); } - [TestMethod] + [Fact] public void ReturnsFalseIfNotIssuedToServerOrganizationNumber() { //Arrange @@ -31,10 +33,10 @@ public void ReturnsFalseIfNotIssuedToServerOrganizationNumber() var isValid = CertificateValidator.IsValidCertificate(SertifikatUtility.TestIntegrasjonssertifikat(), sertifikatOrganisasjonsnummer); //Assert - Assert.IsFalse(isValid); + Assert.False(isValid); } - [TestMethod] + [Fact] public void ReturnsFalseIfNotActivated() { //Arrange @@ -44,10 +46,10 @@ public void ReturnsFalseIfNotActivated() var isValid = CertificateValidator.IsValidCertificate(SertifikatUtility.NotActivatedTestCertificate(), sertifikatOrganisasjonsnummer); //Assert - Assert.IsFalse(isValid); + Assert.False(isValid); } - [TestMethod] + [Fact] public void ReturnsFalseIfExpired() { //Arrange @@ -57,10 +59,10 @@ public void ReturnsFalseIfExpired() var isValid = CertificateValidator.IsValidCertificate(SertifikatUtility.GetExpiredTestCertificate(), sertifikatOrganisasjonsnummer); //Assert - Assert.IsFalse(isValid); + Assert.False(isValid); } - [TestMethod] + [Fact] public void ReturnsTrueForCorrectCertificate() { //Arrange @@ -70,7 +72,7 @@ public void ReturnsTrueForCorrectCertificate() var isValid = CertificateValidator.IsValidCertificate(SertifikatUtility.GetPostenCertificate(), sertifikatOrganisasjonsnummer); //Assert - Assert.IsTrue(isValid); + Assert.True(isValid); } } } diff --git a/Difi.Felles.Utility.Tester/Difi.Felles.Utility.Tester.csproj b/Difi.Felles.Utility.Tester/Difi.Felles.Utility.Tester.csproj index 3adbb6c..cbb2e1a 100755 --- a/Difi.Felles.Utility.Tester/Difi.Felles.Utility.Tester.csproj +++ b/Difi.Felles.Utility.Tester/Difi.Felles.Utility.Tester.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU @@ -16,6 +17,8 @@ $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages False UnitTest + + true @@ -48,6 +51,18 @@ + + ..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll + True + + + ..\packages\xunit.assert.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.assert.dll + True + + + ..\packages\xunit.extensibility.core.2.0.0\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS\xunit.core.dll + True + @@ -142,6 +157,12 @@ + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + +