public void EnsureCreateHttpsCertificate2_CreatesACertificate_WhenThereAreNoHttpsCertificates() { try { // Arrange const string CertificateName = nameof(EnsureCreateHttpsCertificate_CreatesACertificate_WhenThereAreNoHttpsCertificates) + ".cer"; var manager = new CertificateManager(); manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, TestCertificateSubject); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, TestCertificateSubject); } // Act DateTimeOffset now = DateTimeOffset.UtcNow; now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset); var result = manager.EnsureAspNetCoreHttpsDevelopmentCertificate2(now, now.AddYears(1), CertificateName, trust: false, subject: TestCertificateSubject); // Assert Assert.Equal(EnsureCertificateResult.Succeeded, result.ResultCode); Assert.NotNull(result.Diagnostics); Assert.NotEmpty(result.Diagnostics.Messages); Assert.Empty(result.Diagnostics.Exceptions); Assert.True(File.Exists(CertificateName)); var exportedCertificate = new X509Certificate2(File.ReadAllBytes(CertificateName)); Assert.NotNull(exportedCertificate); Assert.False(exportedCertificate.HasPrivateKey); var httpsCertificates = manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: false); var httpsCertificate = Assert.Single(httpsCertificates, c => c.Subject == TestCertificateSubject); Assert.True(httpsCertificate.HasPrivateKey); Assert.Equal(TestCertificateSubject, httpsCertificate.Subject); Assert.Equal(TestCertificateSubject, httpsCertificate.Issuer); Assert.Equal("sha256RSA", httpsCertificate.SignatureAlgorithm.FriendlyName); Assert.Equal("1.2.840.113549.1.1.11", httpsCertificate.SignatureAlgorithm.Value); Assert.Equal(now.LocalDateTime, httpsCertificate.NotBefore); Assert.Equal(now.AddYears(1).LocalDateTime, httpsCertificate.NotAfter); Assert.Contains( httpsCertificate.Extensions.OfType <X509Extension>(), e => e is X509BasicConstraintsExtension basicConstraints && basicConstraints.Critical == true && basicConstraints.CertificateAuthority == false && basicConstraints.HasPathLengthConstraint == false && basicConstraints.PathLengthConstraint == 0); Assert.Contains( httpsCertificate.Extensions.OfType <X509Extension>(), e => e is X509KeyUsageExtension keyUsage && keyUsage.Critical == true && keyUsage.KeyUsages == X509KeyUsageFlags.KeyEncipherment); Assert.Contains( httpsCertificate.Extensions.OfType <X509Extension>(), e => e is X509EnhancedKeyUsageExtension enhancedKeyUsage && enhancedKeyUsage.Critical == true && enhancedKeyUsage.EnhancedKeyUsages.OfType <Oid>().Single() is Oid keyUsage && keyUsage.Value == "1.3.6.1.5.5.7.3.1"); // Subject alternative name Assert.Contains( httpsCertificate.Extensions.OfType <X509Extension>(), e => e.Critical == true && e.Oid.Value == "2.5.29.17"); // ASP.NET HTTPS Development certificate extension Assert.Contains( httpsCertificate.Extensions.OfType <X509Extension>(), e => e.Critical == false && e.Oid.Value == "1.3.6.1.4.1.311.84.1.1" && Encoding.ASCII.GetString(e.RawData) == "ASP.NET Core HTTPS development certificate"); Assert.Equal(httpsCertificate.GetCertHashString(), exportedCertificate.GetCertHashString()); } catch (Exception e) { Output.WriteLine(e.Message); ListCertificates(Output); throw; } }