From 8a2cf92710e85f04fbd12bc5bb58fbefaea42d7c Mon Sep 17 00:00:00 2001 From: Martin Regen Date: Fri, 1 Dec 2023 09:36:45 +0100 Subject: [PATCH] SHA-1 signatures will no longer be trusted by default (#2406) Since some distributions stop to trust SHA1 signatures by default, replace some internal algorithm checks with SHA256 versions. The test case to force signature check also reenables ECC tests for .NET 4.8 which had been previously disabled. --- .../X509Certificate/X509PfxUtils.cs | 4 +-- .../Security/Certificates/RsaUtils.cs | 4 +-- .../CertificateTestsForECDsa.cs | 2 ++ .../CertificateTestsForRSA.cs | 25 +++++++++++++------ .../Opc.Ua.Security.Certificates.Tests.csproj | 12 +++++++-- 5 files changed, 33 insertions(+), 14 deletions(-) diff --git a/Libraries/Opc.Ua.Security.Certificates/X509Certificate/X509PfxUtils.cs b/Libraries/Opc.Ua.Security.Certificates/X509Certificate/X509PfxUtils.cs index 34a5f82544..6b0c2e1a98 100644 --- a/Libraries/Opc.Ua.Security.Certificates/X509Certificate/X509PfxUtils.cs +++ b/Libraries/Opc.Ua.Security.Certificates/X509Certificate/X509PfxUtils.cs @@ -193,8 +193,8 @@ namespace Opc.Ua.Security.Certificates byte[] testBlock = new byte[TestBlockSize]; var rnd = new Random(); rnd.NextBytes(testBlock); - byte[] signature = rsaPrivateKey.SignData(testBlock, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1); - return rsaPublicKey.VerifyData(testBlock, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1); + byte[] signature = rsaPrivateKey.SignData(testBlock, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + return rsaPublicKey.VerifyData(testBlock, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); } #if ECC_SUPPORT diff --git a/Stack/Opc.Ua.Core/Security/Certificates/RsaUtils.cs b/Stack/Opc.Ua.Core/Security/Certificates/RsaUtils.cs index 68fb7d7086..03d2550b9b 100644 --- a/Stack/Opc.Ua.Core/Security/Certificates/RsaUtils.cs +++ b/Stack/Opc.Ua.Core/Security/Certificates/RsaUtils.cs @@ -330,8 +330,8 @@ namespace Opc.Ua int blockSize = 0x10; byte[] testBlock = new byte[blockSize]; randomSource.NextBytes(testBlock, 0, blockSize); - byte[] signature = privateKey.SignData(testBlock, HashAlgorithmName.SHA1, RSASignaturePadding.Pss); - return publicKey.VerifyData(testBlock, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pss); + byte[] signature = privateKey.SignData(testBlock, HashAlgorithmName.SHA256, RSASignaturePadding.Pss); + return publicKey.VerifyData(testBlock, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pss); } catch { diff --git a/Tests/Opc.Ua.Security.Certificates.Tests/CertificateTestsForECDsa.cs b/Tests/Opc.Ua.Security.Certificates.Tests/CertificateTestsForECDsa.cs index e7132e38b2..f89f83a076 100644 --- a/Tests/Opc.Ua.Security.Certificates.Tests/CertificateTestsForECDsa.cs +++ b/Tests/Opc.Ua.Security.Certificates.Tests/CertificateTestsForECDsa.cs @@ -378,8 +378,10 @@ namespace Opc.Ua.Security.Certificates.Tests PEMWriter.ExportCertificateAsPEM(certificate); if (certificate.HasPrivateKey) { +#if !NETFRAMEWORK PEMWriter.ExportPrivateKeyAsPEM(certificate, password); PEMWriter.ExportECDsaPrivateKeyAsPEM(certificate); +#endif } } #endregion diff --git a/Tests/Opc.Ua.Security.Certificates.Tests/CertificateTestsForRSA.cs b/Tests/Opc.Ua.Security.Certificates.Tests/CertificateTestsForRSA.cs index 93f89a4ef4..cfc2d18bd0 100644 --- a/Tests/Opc.Ua.Security.Certificates.Tests/CertificateTestsForRSA.cs +++ b/Tests/Opc.Ua.Security.Certificates.Tests/CertificateTestsForRSA.cs @@ -84,9 +84,9 @@ namespace Opc.Ua.Security.Certificates.Tests public void VerifyOneSelfSignedAppCertForAll() { var builder = CertificateBuilder.Create(Subject) - .SetNotBefore(DateTime.Today.AddYears(-1)) - .SetNotAfter(DateTime.Today.AddYears(25)) - .AddExtension(new X509SubjectAltNameExtension("urn:opcfoundation.org:mypc", new string[] { "mypc", "mypc.opcfoundation.org", "192.168.1.100" })); + .SetNotBefore(DateTime.Today.AddYears(-1)) + .SetNotAfter(DateTime.Today.AddYears(25)) + .AddExtension(new X509SubjectAltNameExtension("urn:opcfoundation.org:mypc", new string[] { "mypc", "mypc.opcfoundation.org", "192.168.1.100" })); byte[] previousSerialNumber = null; foreach (var keyHash in KeyHashPairs) { @@ -143,21 +143,30 @@ namespace Opc.Ua.Security.Certificates.Tests [Theory] public void CreateSelfSignedForRSADefaultHashCustomKey( - KeyHashPair keyHashPair + KeyHashPair keyHashPair, + bool signOnly ) { // default cert with custom key - X509Certificate2 cert = CertificateBuilder.Create(Subject) - .SetRSAKeySize(keyHashPair.KeySize) - .CreateForRSA(); + var builder = CertificateBuilder.Create(Subject); + + if (signOnly) + { + // Key usage for sign only + X509KeyUsageFlags keyUsageFlags = X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.NonRepudiation; + builder.AddExtension(new X509KeyUsageExtension(keyUsageFlags, true)); + } + + X509Certificate2 cert = builder.SetRSAKeySize(keyHashPair.KeySize).CreateForRSA(); WriteCertificate(cert, $"Default RSA {keyHashPair.KeySize} cert"); + + X509Utils.VerifyRSAKeyPair(cert, cert, true); Assert.AreEqual(Subject, cert.Subject); Assert.AreEqual(keyHashPair.KeySize, cert.GetRSAPublicKey().KeySize); Assert.AreEqual(X509Defaults.HashAlgorithmName, Oids.GetHashAlgorithmName(cert.SignatureAlgorithm.Value)); TestUtils.ValidateSelSignedBasicConstraints(cert); Assert.AreEqual(cert.SubjectName.Name, cert.IssuerName.Name); Assert.AreEqual(cert.SubjectName.RawData, cert.IssuerName.RawData); - X509Utils.VerifyRSAKeyPair(cert, cert, true); Assert.True(X509Utils.VerifySelfSigned(cert)); } diff --git a/Tests/Opc.Ua.Security.Certificates.Tests/Opc.Ua.Security.Certificates.Tests.csproj b/Tests/Opc.Ua.Security.Certificates.Tests/Opc.Ua.Security.Certificates.Tests.csproj index 2a937e9dfd..48c04e98b0 100644 --- a/Tests/Opc.Ua.Security.Certificates.Tests/Opc.Ua.Security.Certificates.Tests.csproj +++ b/Tests/Opc.Ua.Security.Certificates.Tests/Opc.Ua.Security.Certificates.Tests.csproj @@ -1,4 +1,4 @@ - + Exe @@ -15,6 +15,10 @@ $(DefineConstants);ECC_SUPPORT + + $(DefineConstants);ECC_SUPPORT + + $(DefineConstants);ECC_SUPPORT @@ -22,7 +26,11 @@ $(DefineConstants);ECC_SUPPORT - + + + $(DefineConstants);ECC_SUPPORT + +