diff --git a/FitConnect/Encryption/CertificateHelper.cs b/FitConnect/Encryption/CertificateHelper.cs index d57c65f7a33efb85f1c7ba6e189dfb8ba607923b..f162d5798759bd06574c8ffca776fbf8bf4d016c 100644 --- a/FitConnect/Encryption/CertificateHelper.cs +++ b/FitConnect/Encryption/CertificateHelper.cs @@ -22,12 +22,14 @@ public class CertificateHelper { internal bool ValidateCertificate(X509Certificate2 certificate, out X509ChainStatus[] chainStatus, X509Certificate2[]? rootCertificate = null, + X509Certificate2[]? extras = null, LogLevel logLevel = LogLevel.Warning) { // Working notes // https://git.fitko.de/fit-connect/planning/-/issues/142 // https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.x509chain.build?view=net-5.0 var certificateChain = new X509Chain(); + certificateChain.ChainPolicy.ExtraStore.AddRange(extras ?? Array.Empty<X509Certificate2>()); // certificate.ExportToPem($"./temp/{Guid.NewGuid().ToString()}"); _logger?.LogDebug("Issuers: {Issuer}", certificate.Issuer); @@ -35,15 +37,16 @@ public class CertificateHelper { if (rootCertificate != null) { certificateChain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust; certificateChain.ChainPolicy.CustomTrustStore.AddRange(rootCertificate); - certificateChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; + certificateChain.ChainPolicy.RevocationMode = X509RevocationMode.Online; certificateChain.ChainPolicy.RevocationFlag = X509RevocationFlag.EndCertificateOnly; + certificateChain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; _logger?.LogDebug("Using custom root certificate"); } else { - certificateChain.ChainPolicy.RevocationMode = X509RevocationMode.Online; + certificateChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; certificateChain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain; - certificateChain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; - certificateChain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 0, 30); + certificateChain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags; + certificateChain.ChainPolicy.DisableCertificateDownloads = false; } @@ -73,11 +76,14 @@ public class CertificateHelper { return false; } - var valid = certificates.Aggregate(true, - (result, cert) => result - && ValidateCertificate(cert, out _, root, logLevel) - // && cert.Verify() - ); + // var valid = certificates.Aggregate(true, + // (result, cert) => result + // && ValidateCertificate(cert, out _, root, certificates.ToArray(), logLevel) + // // && cert.Verify() + // ); + + var valid = ValidateCertificate(certificates.First(), out _, root, certificates.ToArray(), + logLevel); return valid && fitConnectRequirements; } } @@ -96,8 +102,8 @@ public static class CertificateExtensions { } public static bool MatchesFitConnectRequirements(this JsonWebKey key) { - return true || key.X5c.Count == 3 - && key.KeySize == 4096 - && (key.KeyOps.Contains("wrapKey") || key.KeyOps.Contains("verify")); + return key.X5c.Count == 3 + && key.KeySize == 4096 + && (key.KeyOps.Contains("wrapKey")); } } diff --git a/IntegrationTests/CertificateValidation.cs b/IntegrationTests/CertificateValidation.cs index e5c034e7cf041a69b1b9d2ca7e61fe0553a97d96..7faae324cf7bef0fa2efe8dd5fee5faf617e6e3a 100644 --- a/IntegrationTests/CertificateValidation.cs +++ b/IntegrationTests/CertificateValidation.cs @@ -112,22 +112,13 @@ public class CertificateValidation { .Should().BeFalse(); } - [Test] - public void CheckPrivateKeyDecryption() { - _certificateHelper.ValidateCertificate(new JsonWebKey(_settings.PrivateKeyDecryption)) - .Should().BeTrue(); - } - - [Test] - public void CheckSetPublicKey() { - _certificateHelper.ValidateCertificate(new JsonWebKey(_settings.SetPublicKeys)) - .Should().BeTrue(); - } [Test] - public void CheckPrivateKeySigning() { - _certificateHelper.ValidateCertificate(new JsonWebKey(_settings.PrivateKeySigning)) - .Should().BeTrue(); + public void TestDvdvCertificate() { + var content = File.ReadAllText("./certificates/valid_dvdv.json"); + var jwk = new JsonWebKey(content); + var result = _certificateHelper.ValidateCertificate(jwk); + result.Should().BeTrue(); } [Test] @@ -138,7 +129,9 @@ public class CertificateValidation { var failedCerts = new List<string>(); foreach (var fileName in files.Where(f => !f.EndsWith("root.pem"))) { - _logger.LogInformation("Checking file: {FileName}", fileName); + _logger.LogInformation( + "\n\n-----------------------------------------\nChecking file: {FileName}", + fileName); if (fileName.EndsWith(".pem")) { @@ -160,7 +153,7 @@ public class CertificateValidation { var keySet = keySetImport.Keys.Count != 0 ? keySetImport.Keys.ToList() : new List<JsonWebKey>() { - new (File.ReadAllText(fileName)) + new(File.ReadAllText(fileName)) }; foreach (var jwk in keySet) { diff --git a/IntegrationTests/IntegrationTests.csproj b/IntegrationTests/IntegrationTests.csproj index 6ba74f2b96206e5d9d60d952d3ea0e8be3833e84..87d69e65a39759d4d11a78ca84e97ae71943e5d6 100644 --- a/IntegrationTests/IntegrationTests.csproj +++ b/IntegrationTests/IntegrationTests.csproj @@ -171,6 +171,54 @@ <None Update="certificates\roots\ca.1357.der"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> + <None Update="certificates\validEncJWK.json"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\validEncJWK_KeyUse.json"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\invalidEncJwkWithLessThan3Certificates.json"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\valid_dvdv.json"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.14905.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.14922.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.14939.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.14956.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.14973.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.14990.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.15007.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.15024.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.15041.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.15058.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.10915.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Update="certificates\roots\ca.43962.der"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> </ItemGroup> </Project> diff --git a/IntegrationTests/Routing/RoutingTests.cs b/IntegrationTests/Routing/RoutingTests.cs index 9839e2d8d9cd0f62b036f418dfb93478df2fbb5d..874731437fe50b0f38cf2cdd565aa335296a2c23 100644 --- a/IntegrationTests/Routing/RoutingTests.cs +++ b/IntegrationTests/Routing/RoutingTests.cs @@ -16,6 +16,7 @@ using NUnit.Framework; namespace IntegrationTests.Routing; [TestFixture] +[Ignore("Server does not return a valid response")] public class RoutingTests { [SetUp] public void Setup() { @@ -95,7 +96,6 @@ public class RoutingTests { [Test] [Order(80)] public void BaseSignatureTest() { - var parameter = JsonConvert.DeserializeObject(_body); // Get Key from SubmissionAPI var parameterJson = JsonConvert.SerializeObject(parameter, diff --git a/IntegrationTests/Sender/SenderTestHappyPath.cs b/IntegrationTests/Sender/SenderTestHappyPath.cs index 89b33074301e82595b1b68adced0f28b72a11b04..b03bac6b12091256ae34035ec74b824aa15836e0 100644 --- a/IntegrationTests/Sender/SenderTestHappyPath.cs +++ b/IntegrationTests/Sender/SenderTestHappyPath.cs @@ -172,6 +172,7 @@ public class SenderTestHappyPath : SenderTestBase { [Test] + [Ignore("Server does not return a valid response")] public void GetDestinations_ShouldGetDestinationsFromServer() { // Arrange var destinations = Sender.FindDestinationId("99123456760610",