/// <summary>
        /// Gets a signing certificate
        /// </summary>
        /// <returns></returns>
        public static X509Certificate2 Get(CertificateConfig cfg = null)
        {
            X509Certificate2 cert = null;

            //read the cfg off the web.config if necessary
            if (cfg == null)
            {
                cfg =
                    Newtonsoft.Json.JsonConvert.DeserializeObject <CertificateConfig>(
                        ConfigurationManager.AppSettings["CertificateConfig"]);
            }

            if (cfg == null)
            {
                throw new InvalidOperationException("Certificate confoguration object missing.");
            }


            switch (cfg.StorageType)
            {
            case CertificateStorageType.File:
                cert = ReadCertificateFromFile(cfg);
                break;

            case CertificateStorageType.Embedded:
                cert = GetEmbeddedCertificate(cfg);
                break;

            case CertificateStorageType.Store:
                cert = GetCertificateFromStore(cfg);
                break;
            }

            return(cert);
        }
        /// <summary>
        /// Reads a certificate from a file
        /// </summary>
        /// <param name="cfg"></param>
        /// <returns></returns>
        private static X509Certificate2 ReadCertificateFromFile(CertificateConfig cfg)
        {
            X509Certificate2 cert = null;

            if (!string.IsNullOrEmpty(cfg.Password))
            {
                cert = new X509Certificate2(cfg.FilePath.SolvePath(), cfg.Password);
            }
            else
            {
                cert = new X509Certificate2(cfg.FilePath.SolvePath());
            }

            return(cert);
        }
        /// <summary>
        /// Reads certificate from Personal certificates
        /// </summary>
        /// <param name="cfg"></param>
        /// <returns></returns>
        private static X509Certificate2 GetCertificateFromStore(CertificateConfig cfg)
        {
            X509Certificate2 cert = null;

            var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);

            store.Open(OpenFlags.ReadOnly);

            var certs = store.Certificates.Find(X509FindType.FindBySubjectName, cfg.Subject, true); //true so only valid certs are removed

            if (certs.Count > 0)
            {
                cert = certs[0];
            }

            store.Close();

            return(cert);
        }
        /// <summary>
        /// Reads a cretificate from an embedded resource
        /// </summary>
        /// <param name="cfg"></param>
        /// <returns></returns>
        private static X509Certificate2 GetEmbeddedCertificate(CertificateConfig cfg)
        {
            X509Certificate2 cert = null;

            byte[] certData;
            var    assembly = typeof(Certificate).Assembly;

            using (var stream = assembly.GetManifestResourceStream(cfg.NameSpace))
            {
                certData = ReadStream(stream);
            }

            if (!string.IsNullOrEmpty(cfg.Password))
            {
                cert = new X509Certificate2(certData, cfg.Password);
            }
            else
            {
                cert = new X509Certificate2(certData);
            }

            return(cert);
        }