Exemplo n.º 1
0
        public async Task TestCertCleanupAtExpiry()
        {
            // create and store a number of test certificates
            var cert1 = CreateAndStoreTestCertificate("cert-test1.example.com", new DateTime(1935, 01, 01), new DateTime(1935, 03, 01));
            var cert2 = CreateAndStoreTestCertificate("cert-test2.example.com", new DateTime(1934, 01, 01), new DateTime(1934, 03, 01));
            var cert3 = CreateAndStoreTestCertificate("cert-test3.example.com", new DateTime(1936, 01, 01), new DateTime(1936, 07, 01));
            var cert4 = CreateAndStoreTestCertificate("cert-test4.example.com", new DateTime(1936, 01, 01), new DateTime(1936, 05, 15));

            // create test site for bindings, add bindings
            var iisManager = new ServerProviderIIS();

            var testSiteDomain = "cert-test.example.com";

            if (await iisManager.SiteExists(testSiteDomain))
            {
                await iisManager.DeleteSite(testSiteDomain);
            }
            var site = await iisManager.CreateSite(testSiteDomain, testSiteDomain, PrimaryIISRoot, "DefaultAppPool");

            await iisManager.AddOrUpdateSiteBinding(
                new Models.BindingInfo
            {
                SiteId           = site.Id.ToString(),
                Host             = testSiteDomain,
                CertificateHash  = cert2.Thumbprint,
                CertificateStore = "MY",
                IsSNIEnabled     = false,
                Port             = 443,
                Protocol         = "https"
            }, addNew : true
                );

            // run cleanup process, removes certs which have expired for over a month and have
            // [Certify] in the friendly name
            CertificateManager.PerformCertificateStoreCleanup(Models.CertificateCleanupMode.AfterExpiry, new DateTime(1936, 06, 01), null, null);

            // check the correct certificates have been removed
            try
            {
                // check cert test 1 removed (expired)
                Assert.IsFalse(CertificateManager.IsCertificateInStore(cert1), "Cert 1 Should Be Removed");

                // check cert test 2 removed (expired)
                Assert.IsFalse(CertificateManager.IsCertificateInStore(cert2), "Cert 2 Should Be Removed");

                // check cert test 3 exists (not expired)
                Assert.IsTrue(CertificateManager.IsCertificateInStore(cert3), "Cert 3 Should Not Be Removed");

                // check cert test 4 removed (expired, but for less than 1 month)
                Assert.IsFalse(CertificateManager.IsCertificateInStore(cert4), "Cert 4 Should  Be Removed");
            }
            finally
            {
                // clean up after test
                await iisManager.DeleteSite(site.Name);

                CertificateManager.RemoveCertificate(cert1);
                CertificateManager.RemoveCertificate(cert2);
                CertificateManager.RemoveCertificate(cert3);
                CertificateManager.RemoveCertificate(cert4);
            }
        }
Exemplo n.º 2
0
        public async Task TestCertCleanupByThumbprint()
        {
            // create and store a number of test certificates
            var cert1 = CreateAndStoreTestCertificate("cert-test1.example.com", new DateTime(1935, 01, 01), new DateTime(1935, 03, 01));
            var cert2 = CreateAndStoreTestCertificate("cert-test2.example.com", new DateTime(1934, 01, 01), new DateTime(1934, 03, 01));
            var cert3 = CreateAndStoreTestCertificate("cert-test2.example.com", new DateTime(1936, 01, 01), new DateTime(1938, 03, 01));

            // create test site for bindings, add bindings
            var iisManager = new ServerProviderIIS();

            var testSiteDomain = "cert-test.example.com";

            if (await iisManager.SiteExists(testSiteDomain))
            {
                await iisManager.DeleteSite(testSiteDomain);
            }
            var site = await iisManager.CreateSite(testSiteDomain, testSiteDomain, PrimaryIISRoot, "DefaultAppPool");

            await iisManager.AddOrUpdateSiteBinding(
                new Models.BindingInfo
            {
                SiteId           = site.Id.ToString(),
                Host             = testSiteDomain,
                CertificateHash  = cert2.Thumbprint,
                CertificateStore = "MY",
                IsSNIEnabled     = false,
                Port             = 443,
                Protocol         = "https"
            }, addNew : true
                );

            // run cleanup process, removes certs by name, excluding the given thumbprints
            CertificateManager.PerformCertificateStoreCleanup(
                Models.CertificateCleanupMode.AfterRenewal,
                new DateTime(1936, 06, 01),
                matchingName: "cert-test2.example.com",
                excludedThumbprints: new List <string> {
                cert3.Thumbprint
            });

            // check the correct certificates have been removed
            try
            {
                // check cert test 1 not removed (does not match)
                Assert.IsTrue(CertificateManager.IsCertificateInStore(cert1), "Cert 1 Should Not Be Removed");

                // check cert test 2 removed (does match)
                Assert.IsFalse(CertificateManager.IsCertificateInStore(cert2), "Cert 2 Should Be Removed");

                // check cert test 3 exists (matches but is excluded by thumbprint)
                Assert.IsTrue(CertificateManager.IsCertificateInStore(cert3), "Cert 3 Should Not Be Removed");
            }
            finally
            {
                // clean up after test
                await iisManager.DeleteSite(site.Name);

                CertificateManager.RemoveCertificate(cert1);
                CertificateManager.RemoveCertificate(cert2);
                CertificateManager.RemoveCertificate(cert3);
            }
        }
Exemplo n.º 3
0
        public async Task TestManySiteBindingUpdates()
        {
            var numSites = 100;

            // create a large number of site bindings, to see if we encounter isses saving IIS changes

            try
            {
                var allResults = new List <ActionStep>();
                for (var i = 0; i < numSites; i++)
                {
                    var domain       = "site_" + i + "_toomany.com";
                    var testSiteName = "ManySites_" + i;
                    if (await iisManager.SiteExists(testSiteName))
                    {
                        await iisManager.DeleteSite(testSiteName);
                    }

                    await iisManager.CreateSite(testSiteName, "site_" + i + "_toomany.com", PrimaryIISRoot, null, protocol : "http");

                    var site = await iisManager.GetSiteBindingByDomain(domain);

                    for (var d = 0; d < 2; d++)
                    {
                        var testDomain = Guid.NewGuid().ToString() + domain;

                        allResults.Add(await iisManager.AddOrUpdateSiteBinding(new BindingInfo
                        {
                            SiteId       = site.SiteId,
                            Host         = testDomain,
                            PhysicalPath = PrimaryIISRoot
                        }, addNew: true));
                    }
                }

                // now attempt async creation of bindings
                var allBindingTasksSet1 = new List <Task <ActionStep> >();
                var allBindingTasksSet2 = new List <Task <ActionStep> >();
                for (var i = 0; i < numSites; i++)
                {
                    var domain       = "site_" + i + "_toomany.com";
                    var testSiteName = "ManySites_" + i;

                    var site = await iisManager.GetSiteBindingByDomain(domain);

                    for (var d = 0; d < 2; d++)
                    {
                        var testDomain = Guid.NewGuid().ToString() + domain;

                        if (i < numSites / 2)
                        {
                            allBindingTasksSet1.Add(iisManager.AddOrUpdateSiteBinding(new BindingInfo
                            {
                                SiteId       = site.SiteId,
                                Host         = testDomain,
                                PhysicalPath = PrimaryIISRoot
                            }, addNew: true));
                        }
                        else
                        {
                            allBindingTasksSet2.Add(iisManager.AddOrUpdateSiteBinding(new BindingInfo
                            {
                                SiteId       = site.SiteId,
                                Host         = testDomain,
                                PhysicalPath = PrimaryIISRoot
                            }, addNew: true));
                        }
                    }
                }

                ThreadPool.QueueUserWorkItem(async x =>
                {
                    Thread.Sleep(500);
                    var results = await Task.WhenAll <ActionStep>(allBindingTasksSet1);

                    // verify all actions ok
                    Assert.IsFalse(results.Any(r => r.HasError), "Thread1: One or more actions failed");
                });

                ThreadPool.QueueUserWorkItem(async x =>
                {
                    var results = await Task.WhenAll <ActionStep>(allBindingTasksSet2);

                    // verify all actions ok
                    Assert.IsFalse(results.Any(r => r.HasError), "Thread2: One or more actions failed");
                });
            }
            finally
            {
                // now clean up
                for (var i = 0; i < numSites; i++)
                {
                    var testSiteName = "ManySites_" + i;
                    var domain       = "site_" + i + "_toomany.com";
                    try
                    {
                        await iisManager.DeleteSite(testSiteName);
                    }
                    catch { }
                }
            }
        }