public GcmXmppConnection(GcmXmppConfiguration configuration)
        {
            authCompletion = new TaskCompletionSource <bool> ();

            notifications = new Dictionary <string, CompletableNotification> ();
            Configuration = configuration;

            certificates = new X509CertificateCollection();

            // Add local/machine certificate stores to our collection if requested
            //if (Configuration.AddLocalAndMachineCertificateStores) {
            var store = new X509Store(StoreLocation.LocalMachine);

            certificates.AddRange(store.Certificates);

            store = new X509Store(StoreLocation.CurrentUser);
            certificates.AddRange(store.Certificates);
            //}

            // Add optionally specified additional certs into our collection
//            if (Configuration.AdditionalCertificates != null) {
//                foreach (var addlCert in Configuration.AdditionalCertificates)
//                    certificates.Add (addlCert);
//            }

            // Finally, add the main private cert for authenticating to our collection
//            if (certificate != null)
//                certificates.Add (certificate);
        }
示例#2
0
        public ApplePushChannel(ApplePushChannelSettings channelSettings, PushServiceSettings serviceSettings = null) : base(channelSettings, serviceSettings)
        {
            this.appleSettings = channelSettings;

            certificate = this.appleSettings.Certificate;

            certificates = new X509CertificateCollection();

            if (appleSettings.AddLocalAndMachineCertificateStores)
            {
                var store = new X509Store(StoreLocation.LocalMachine);
                certificates.AddRange(store.Certificates);

                store = new X509Store(StoreLocation.CurrentUser);
                certificates.AddRange(store.Certificates);
            }

            certificates.Add(certificate);

            if (this.appleSettings.AdditionalCertificates != null)
            {
                foreach (var addlCert in this.appleSettings.AdditionalCertificates)
                {
                    certificates.Add(addlCert);
                }
            }

            //Start our cleanup task
            taskCleanup = new Task(() => Cleanup(), TaskCreationOptions.LongRunning);
            taskCleanup.ContinueWith((t) => { var ex = t.Exception; }, TaskContinuationOptions.OnlyOnFaulted);
            taskCleanup.Start();
        }
示例#3
0
        public ApplePushChannel(ApplePushChannelSettings channelSettings)
        {
            cancelToken = cancelTokenSrc.Token;

            appleSettings = channelSettings;

            certificate = this.appleSettings.Certificate;

            certificates = new X509CertificateCollection();

            if (appleSettings.AddLocalAndMachineCertificateStores)
            {
                var store = new X509Store(StoreLocation.LocalMachine);
                certificates.AddRange(store.Certificates);

                store = new X509Store(StoreLocation.CurrentUser);
                certificates.AddRange(store.Certificates);
            }

            certificates.Add(certificate);

            if (this.appleSettings.AdditionalCertificates != null)
            {
                foreach (var addlCert in this.appleSettings.AdditionalCertificates)
                {
                    certificates.Add(addlCert);
                }
            }

            timerCleanup = new Timer(state => Cleanup(), null, TimeSpan.FromMilliseconds(1000), TimeSpan.FromMilliseconds(1000));
        }
示例#4
0
        private void ConfigureCertificates()
        {
            _certificate = _appleSettings.Certificate;

            _certificates = new X509CertificateCollection();

            if (_appleSettings.AddLocalAndMachineCertificateStores)
            {
                var store = new X509Store(StoreLocation.LocalMachine);
                _certificates.AddRange(store.Certificates);

                store = new X509Store(StoreLocation.CurrentUser);
                _certificates.AddRange(store.Certificates);
            }

            _certificates.Add(_certificate);

            if (_appleSettings.AdditionalCertificates != null)
            {
                foreach (var additionalCertificate in _appleSettings.AdditionalCertificates)
                {
                    _certificates.Add(additionalCertificate);
                }
            }
        }
示例#5
0
        public ApnsHttp2Connection(ApnsHttp2Configuration configuration)
        {
            id = ++ID;
            if (id >= int.MaxValue)
            {
                ID = 0;
            }

            Configuration = configuration;

            certificate = Configuration.Certificate;

            certificates = new X509CertificateCollection();

            // Add local/machine certificate stores to our collection if requested
            if (Configuration.AddLocalAndMachineCertificateStores)
            {
                var store = new X509Store(StoreLocation.LocalMachine);
                certificates.AddRange(store.Certificates);

                store = new X509Store(StoreLocation.CurrentUser);
                certificates.AddRange(store.Certificates);
            }

            // Add optionally specified additional certs into our collection
            if (Configuration.AdditionalCertificates != null)
            {
                foreach (var addlCert in Configuration.AdditionalCertificates)
                {
                    certificates.Add(addlCert);
                }
            }

            // Finally, add the main private cert for authenticating to our collection
            if (certificate != null)
            {
                certificates.Add(certificate);
            }

#if NET45
            var httpHandler = new WebRequestHandler
            {
                ClientCertificateOptions = ClientCertificateOption.Manual
            };

            httpHandler.ClientCertificates.AddRange(certificates);
#else
            var httpHandler = new HttpClientHandler
            {
                ClientCertificateOptions = ClientCertificateOption.Manual
            };

            httpHandler.ClientCertificates.AddRange(certificates);
#endif

            httpClient = new HttpClient(httpHandler)
            {
                BaseAddress = new Uri(string.Format("https://{0}:{1}", Configuration.Host, Configuration.Port))
            };
        }
示例#6
0
        public ApnsConnection(ApnsConfiguration configuration)
        {
            id = ++ID;
            if (id >= int.MaxValue)
            {
                ID = 0;
            }

            Configuration = configuration;

            certificate = Configuration.Certificate;

            certificates = new X509CertificateCollection();

            // Add local/machine certificate stores to our collection if requested
            if (Configuration.AddLocalAndMachineCertificateStores)
            {
                var store = new X509Store(StoreLocation.LocalMachine);
                certificates.AddRange(store.Certificates);

                store = new X509Store(StoreLocation.CurrentUser);
                certificates.AddRange(store.Certificates);
            }

            // Add optionally specified additional certs into our collection
            if (Configuration.AdditionalCertificates != null)
            {
                foreach (var addlCert in Configuration.AdditionalCertificates)
                {
                    certificates.Add(addlCert);
                }
            }

            // Finally, add the main private cert for authenticating to our collection
            if (certificate != null)
            {
                certificates.Add(certificate);
            }

            timerBatchWait = new Timer(new TimerCallback(async state => {
                await batchSendSemaphore.WaitAsync();
                try
                {
                    await SendBatch().ConfigureAwait(false);
                }
                catch (Exception exception)
                {
                    //ignore
                }
                finally
                {
                    batchSendSemaphore.Release();
                }
            }), null, Timeout.Infinite, Timeout.Infinite);
        }
示例#7
0
        /// <summary>
        /// Retrieve client SSL certificates. Dependent on connection string
        /// settings we use either file or store based certificates.
        /// </summary>
        private X509CertificateCollection GetClientCertificates()
        {
            X509CertificateCollection certs = new X509CertificateCollection();

            // Check for file-based certificate
            if (Settings.CertificateFile != null)
            {
                if (!Version.isAtLeast(5, 1, 0))
                {
                    throw new MySqlException("Properties.Resources.FileBasedCertificateNotSupported");
                }


                X509Certificate2 clientCert = new X509Certificate2(Settings.CertificateFile,
                                                                   Settings.CertificatePassword);
                certs.Add(clientCert);
                return(certs);
            }

            if (Settings.CertificateStoreLocation == MySqlCertificateStoreLocation.None)
            {
                return(certs);
            }

            StoreLocation location =
                (Settings.CertificateStoreLocation == MySqlCertificateStoreLocation.CurrentUser) ?
                StoreLocation.CurrentUser : StoreLocation.LocalMachine;

            // Check for store-based certificate
            X509Store store = new X509Store(StoreName.My, location);

            store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);


            if (Settings.CertificateThumbprint == null)
            {
                // Return all certificates from the store.
                certs.AddRange(store.Certificates);
                return(certs);
            }

            // Find certificate with given thumbprint
            certs.AddRange(store.Certificates.Find(X509FindType.FindByThumbprint,
                                                   Settings.CertificateThumbprint, true));

            if (certs.Count == 0)
            {
                throw new MySqlException("Certificate with Thumbprint " +
                                         Settings.CertificateThumbprint + " not found");
            }
            return(certs);
        }
        public void AddRange_Array()
        {
            X509CertificateCollection c = new X509CertificateCollection();

            c.AddRange(range);
            Assert.AreEqual(2, c.Count, "Range(a+b)");

            c.AddRange(range);
            Assert.AreEqual(4, c.Count, "Duplicate(a+b)");

            c.Add(x509c);
            Assert.AreEqual(5, c.Count, "New(c)");
        }
示例#9
0
        static X509CertificateCollection LoadCertificates(string filename)
        {
            X509Certificate           x509 = null;
            X509CertificateCollection coll = new X509CertificateCollection();

            switch (Path.GetExtension(filename).ToUpper())
            {
            case ".P7B":
            case ".SPC":
                SoftwarePublisherCertificate spc = SoftwarePublisherCertificate.CreateFromFile(filename);
                coll.AddRange(spc.Certificates);
                spc = null;
                break;

            case ".CER":
            case ".CRT":
                using (FileStream fs = File.OpenRead(filename)) {
                    byte[] data = new byte [fs.Length];
                    fs.Read(data, 0, data.Length);
                    if (data [0] != 0x30)
                    {
                        // maybe it's ASCII PEM base64 encoded ?
                        data = PEM("CERTIFICATE", data);
                    }
                    if (data != null)
                    {
                        x509 = new X509Certificate(data);
                    }
                }
                if (x509 != null)
                {
                    coll.Add(x509);
                }
                break;

            case ".P12":
            case ".PFX":
                // TODO - support PKCS12 with passwords
                PKCS12 p12 = PKCS12.LoadFromFile(filename);
                coll.AddRange(p12.Certificates);
                p12 = null;
                break;

            default:
                Console.WriteLine("Unknown file extension: {0}",
                                  Path.GetExtension(filename));
                break;
            }
            return(coll);
        }
        public void AddRange_CollectionNull()
        {
            X509CertificateCollection coll = null;
            X509CertificateCollection c    = new X509CertificateCollection();

            c.AddRange(coll);
        }
        public void AddRange_ArrayNull()
        {
            X509Certificate[]         array = null;
            X509CertificateCollection c     = new X509CertificateCollection();

            c.AddRange(array);
        }
示例#12
0
        public ApnsHttp2Connection(ApnsHttp2Configuration configuration)
        {
            id = ++ID;
            if (id >= int.MaxValue)
            {
                ID = 0;
            }

            Configuration = configuration;

            certificate = Configuration.Certificate;

            certificates = new X509CertificateCollection();

            // Add local/machine certificate stores to our collection if requested
            if (Configuration.AddLocalAndMachineCertificateStores)
            {
                var store = new X509Store(StoreLocation.LocalMachine);
                certificates.AddRange(store.Certificates);

                store = new X509Store(StoreLocation.CurrentUser);
                certificates.AddRange(store.Certificates);
            }

            // Add optionally specified additional certs into our collection
            if (Configuration.AdditionalCertificates != null)
            {
                foreach (var addlCert in Configuration.AdditionalCertificates)
                {
                    certificates.Add(addlCert);
                }
            }

            // Finally, add the main private cert for authenticating to our collection
            if (certificate != null)
            {
                certificates.Add(certificate);
            }

            var http2Settings = new HttpTwo.Http2ConnectionSettings(
                Configuration.Host,
                (uint)Configuration.Port,
                true,
                certificates);

            http2 = new HttpTwo.Http2Client(http2Settings);
        }
        public void CopyTo_TooSmall()
        {
            X509Certificate[]         array = new X509Certificate [1];
            X509CertificateCollection c     = new X509CertificateCollection();

            c.AddRange(range);
            c.CopyTo(array, 0);
        }
        public void AddRange_Collection()
        {
            X509CertificateCollection coll = new X509CertificateCollection(range);
            X509CertificateCollection c    = new X509CertificateCollection();

            c.AddRange(c);
            Assert.AreEqual(0, c.Count, "Self(none)");

            c.AddRange(coll);
            Assert.AreEqual(2, c.Count, "Range(a+b)");

            c.AddRange(coll);
            Assert.AreEqual(4, c.Count, "Duplicate(a+b)");

            c.Add(x509c);
            Assert.AreEqual(5, c.Count, "New(c)");

            // This leads to an infinite loop until the runtime throws an OutOfMemoryException
            //c.AddRange (c);
            //Assert.AreEqual (10, c.Count, "Self(double)");
        }
示例#15
0
        private X509CertificateCollection GetClientCertificates()
        {
            X509CertificateCollection x509CertificateCollection = new X509CertificateCollection();

            if (this.Settings.CertificateFile != null)
            {
                if (!this.Version.isAtLeast(5, 1, 0))
                {
                    throw new MySqlException(Resources.FileBasedCertificateNotSupported);
                }
                X509Certificate2 value = new X509Certificate2(this.Settings.CertificateFile, this.Settings.CertificatePassword);
                x509CertificateCollection.Add(value);
                return(x509CertificateCollection);
            }
            else
            {
                if (this.Settings.CertificateStoreLocation == MySqlCertificateStoreLocation.None)
                {
                    return(x509CertificateCollection);
                }
                StoreLocation storeLocation = (this.Settings.CertificateStoreLocation == MySqlCertificateStoreLocation.CurrentUser) ? StoreLocation.CurrentUser : StoreLocation.LocalMachine;
                X509Store     x509Store     = new X509Store(StoreName.My, storeLocation);
                x509Store.Open(OpenFlags.OpenExistingOnly);
                if (this.Settings.CertificateThumbprint == null)
                {
                    x509CertificateCollection.AddRange(x509Store.Certificates);
                    return(x509CertificateCollection);
                }
                x509CertificateCollection.AddRange(x509Store.Certificates.Find(X509FindType.FindByThumbprint, this.Settings.CertificateThumbprint, true));
                if (x509CertificateCollection.Count == 0)
                {
                    throw new MySqlException("Certificate with Thumbprint " + this.Settings.CertificateThumbprint + " not found");
                }
                return(x509CertificateCollection);
            }
        }
示例#16
0
        private X509CertificateCollection BuildBagOfCerts()
        {
            X509CertificateCollection collection = new X509CertificateCollection();

            if (this.KeyInfo != null)
            {
                foreach (KeyInfoClause clause in this.KeyInfo)
                {
                    KeyInfoX509Data x509Data = clause as KeyInfoX509Data;
                    if (x509Data != null)
                    {
                        collection.AddRange(Utils.BuildBagOfCerts(x509Data, CertUsageType.Verification));
                    }
                }
            }

            return(collection);
        }
示例#17
0
        public void open()
        {
            try {
                X509Store store = new X509Store(StoreLocation.LocalMachine);
                store.Open(OpenFlags.ReadOnly);

                X509CertificateCollection certificates = new X509CertificateCollection();
                certificates.AddRange(store.Certificates);

                client = new TcpClient();
                client.Connect("gateway.sandbox.push.apple.com", 2195);

                LocalCertificateSelectionCallback localCallBack = new LocalCertificateSelectionCallback(APNSLocalCert.SelectLocalCertificate);

                stream = new SslStream(client.GetStream(), false, (sender, cert, chain, sslPolicyErrors) => true, localCallBack);
                stream.AuthenticateAsClient("gateway.sandbox.push.apple.com", certificates, System.Security.Authentication.SslProtocols.Tls, false);
            } catch (Exception ex) { Console.Write(ex.Message); }
        }
示例#18
0
		static X509CertificateCollection LoadCertificates (string filename) 
		{
			X509Certificate x509 = null;
			X509CertificateCollection coll = new X509CertificateCollection ();
			switch (Path.GetExtension (filename).ToUpper ()) {
				case ".P7B":
				case ".SPC":
					SoftwarePublisherCertificate spc = SoftwarePublisherCertificate.CreateFromFile (filename);
					coll.AddRange (spc.Certificates);
					spc = null;
					break;
				case ".CER":
				case ".CRT":
					using (FileStream fs = File.OpenRead (filename)) {
						byte[] data = new byte [fs.Length];
						fs.Read (data, 0, data.Length);
						if (data [0] != 0x30) {
							// maybe it's ASCII PEM base64 encoded ?
							data = PEM ("CERTIFICATE", data);
						}
						if (data != null)
							x509 = new X509Certificate (data);
					}
					if (x509 != null)
						coll.Add (x509);
					break;
				case ".P12":
				case ".PFX":
					// TODO - support PKCS12 with passwords
					PKCS12 p12 = PKCS12.LoadFromFile (filename);
					coll.AddRange (p12.Certificates);
					p12 = null;
					break;
				default:
					Console.WriteLine ("Unknown file extension: {0}", 
						Path.GetExtension (filename));
					break;
			}
			return coll;
		}
示例#19
0
        /// <summary>
        /// Retrieves a collection containing the client SSL PFX certificates.
        /// </summary>
        /// <remarks>Dependent on connection string settings.
        /// Either file or store based certificates are used.</remarks>
        private X509CertificateCollection GetPFXClientCertificates()
        {
            X509CertificateCollection certs = new X509CertificateCollection();

            // Check for file-based certificate
            if (_settings.CertificateFile != null)
            {
                X509Certificate2 clientCert = new X509Certificate2(_settings.CertificateFile,
                                                                   _settings.CertificatePassword);
                certs.Add(clientCert);
                return(certs);
            }

            if (_settings.CertificateStoreLocation == MySqlCertificateStoreLocation.None)
            {
                return(certs);
            }

            StoreLocation location =
                (_settings.CertificateStoreLocation == MySqlCertificateStoreLocation.CurrentUser) ?
                StoreLocation.CurrentUser : StoreLocation.LocalMachine;

            try
            {
                // Check for store-based certificate
                X509Store store = new X509Store(StoreName.My, location);
                store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);


                if (_settings.CertificateThumbprint == null)
                {
                    // Return all certificates from the store.
                    certs.AddRange(store.Certificates);

                    if (certs.Count == 0)
                    {
                        throw new MySqlException("No certificates were found in the certificate store");
                    }

                    return(certs);
                }
                else
                {
                    bool validateCert = _settings.SslMode == MySqlSslMode.VerifyCA || _settings.SslMode == MySqlSslMode.VerifyFull;

                    // Find certificate with given thumbprint
                    certs.AddRange(store.Certificates.Find(X509FindType.FindByThumbprint,
                                                           _settings.CertificateThumbprint, validateCert));

                    if (certs.Count == 0)
                    {
                        throw new MySqlException(String.Format(Resources.InvalidCertificateThumbprint, _settings.CertificateThumbprint));
                    }

                    return(certs);
                }
            }
            catch (CryptographicException ex)
            {
                throw new MySqlException("Certificate couldn't be loaded from the CertificateStoreLocation", ex);
            }
        }
示例#20
0
        public static void X509CertificateCollectionThrowsArgumentNullException()
        {
            using (X509Certificate certificate = new X509Certificate())
            {
                Assert.Throws<ArgumentNullException>(() => new X509CertificateCollection((X509Certificate[])null));
                Assert.Throws<ArgumentNullException>(() => new X509CertificateCollection((X509CertificateCollection)null));

                X509CertificateCollection collection = new X509CertificateCollection { certificate };

                Assert.Throws<ArgumentNullException>(() => collection[0] = null);
                Assert.Throws<ArgumentNullException>(() => collection.Add(null));
                Assert.Throws<ArgumentNullException>(() => collection.AddRange((X509Certificate[])null));
                Assert.Throws<ArgumentNullException>(() => collection.AddRange((X509CertificateCollection)null));
                Assert.Throws<ArgumentNullException>(() => collection.CopyTo(null, 0));
                Assert.Throws<ArgumentNullException>(() => collection.Insert(0, null));
                Assert.Throws<ArgumentNullException>(() => collection.Remove(null));

                IList ilist = (IList)collection;
                Assert.Throws<ArgumentNullException>(() => ilist[0] = null);
                Assert.Throws<ArgumentNullException>(() => ilist.Add(null));
                Assert.Throws<ArgumentNullException>(() => ilist.CopyTo(null, 0));
                Assert.Throws<ArgumentNullException>(() => ilist.Insert(0, null));
                Assert.Throws<ArgumentNullException>(() => ilist.Remove(null));
            }

            Assert.Throws<ArgumentNullException>(() => new X509CertificateCollection.X509CertificateEnumerator(null));
        }
        public X509CertificateCollection Install(IFirebaseAppPlatform app)
        {
            if (!InstallRootCerts.InstallationRequired)
            {
                return(null);
            }
            object sync = InstallRootCerts.Sync;
            X509CertificateCollection result;

            lock (sync)
            {
                X509CertificateCollection x509CertificateCollection;
                if (InstallRootCerts._installedRoots.TryGetValue(app, out x509CertificateCollection))
                {
                    result = x509CertificateCollection;
                }
                else
                {
                    x509CertificateCollection = new X509CertificateCollection();
                    string text = Path.Combine(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), ".mono"), "certs");
                    bool   flag = false;
                    try
                    {
                        flag = (Directory.Exists(text) || Directory.CreateDirectory(text) != null);
                    }
                    catch (Exception)
                    {
                    }
                    if (!flag)
                    {
                        string writeablePath = Services.AppConfig.GetWriteablePath(app);
                        if (!string.IsNullOrEmpty(writeablePath))
                        {
                            Services.Logging.LogMessage(PlatformLogLevel.Debug, string.Format("Saving root certs in {0} ({1} is not writable)", writeablePath, text));
                            Environment.SetEnvironmentVariable("XDG_CONFIG_HOME", writeablePath);
                            text = writeablePath;
                            this.HackRefreshMonoRootStore();
                        }
                    }
                    X509CertificateCollection value = InstallRootCerts.DecodeDefaultCollection();
                    X509CertificateCollection x509CertificateCollection2 = InstallRootCerts.DecodeCollection(app);
                    if (string.Equals(app.Name, FirebaseHandler.AppUtils.GetDefaultInstanceName()))
                    {
                        x509CertificateCollection2.AddRange(value);
                        x509CertificateCollection = x509CertificateCollection2;
                    }
                    else
                    {
                        x509CertificateCollection.AddRange(value);
                    }
                    InstallRootCerts._installedRoots[app] = x509CertificateCollection2;
                    if (x509CertificateCollection.Count == 0)
                    {
                        result = x509CertificateCollection;
                    }
                    else
                    {
                        InstallRootCerts.InstallDefaultCRLs("Firebase.Platform.cacrl_pem.txt", Path.Combine(text, InstallRootCerts.TrustedRoot));
                        InstallRootCerts.InstallDefaultCRLs("Firebase.Platform.caintermediatecrl_pem.txt", Path.Combine(text, InstallRootCerts.IntermediateCA));
                        Services.Logging.LogMessage(PlatformLogLevel.Debug, string.Format("Installing {0} certs", x509CertificateCollection2.Count));
                        X509Store x509Store = new X509Store(InstallRootCerts.TrustedRoot);
                        x509Store.Open(OpenFlags.ReadWrite);
                        X509CertificateCollection certificates = x509Store.Certificates;
                        X509CertificateCollection.X509CertificateEnumerator enumerator = x509CertificateCollection.GetEnumerator();
                        try
                        {
                            while (enumerator.MoveNext())
                            {
                                X509Certificate current = enumerator.Current;
                                if (!certificates.Contains(current))
                                {
                                    try
                                    {
                                        x509Store.Add((X509Certificate2)current);
                                    }
                                    catch (Exception ex)
                                    {
                                        Services.Logging.LogMessage(PlatformLogLevel.Error, ex.ToString());
                                    }
                                }
                            }
                        }
                        finally
                        {
                            IDisposable disposable;
                            if ((disposable = (enumerator as IDisposable)) != null)
                            {
                                disposable.Dispose();
                            }
                        }
                        x509Store.Close();
                        result = x509CertificateCollection;
                    }
                }
            }
            return(result);
        }
示例#22
0
文件: certmgr.cs 项目: ngraziano/mono
		static X509CertificateCollection LoadCertificates (string filename, string password, bool verbose) 
		{
			X509Certificate x509 = null;
			X509CertificateCollection coll = new X509CertificateCollection ();
			switch (Path.GetExtension (filename).ToUpper ()) {
				case ".P7B":
				case ".SPC":
					SoftwarePublisherCertificate spc = SoftwarePublisherCertificate.CreateFromFile (filename);
					coll.AddRange (spc.Certificates);
					spc = null;
					break;
				case ".CER":
				case ".CRT":
					using (FileStream fs = File.OpenRead (filename)) {
						byte[] data = new byte [fs.Length];
						fs.Read (data, 0, data.Length);
						if (data [0] != 0x30) {
							// maybe it's ASCII PEM base64 encoded ?
							data = PEM ("CERTIFICATE", data);
						}
						if (data != null)
							x509 = new X509Certificate (data);
					}
					if (x509 != null)
						coll.Add (x509);
					break;
				case ".P12":
				case ".PFX":
					PKCS12 p12 = password == null ? PKCS12.LoadFromFile (filename)
						: PKCS12.LoadFromFile (filename, password);
					X509CertificateCollection tmp = new X509CertificateCollection (p12.Certificates);

					for (int i = 0; i != p12.Keys.Count; i++) {
						X509Certificate cert = p12.Certificates[i];
						RSACryptoServiceProvider pk = p12.Keys[i] as RSACryptoServiceProvider;

						if (pk == null || pk.PublicOnly)
							continue;

						if (verbose)
							Console.WriteLine ("Found key for certificate: {0}", cert.SubjectName);

						tmp[0].RSA = pk;
					}
					coll.AddRange(tmp);
					p12 = null;
					break;
				default:
					Console.WriteLine ("Unknown file extension: {0}", 
						Path.GetExtension (filename));
					break;
			}
			return coll;
		}
示例#23
0
        static X509CertificateCollection LoadCertificates(string filename, string password, bool verbose)
        {
            X509Certificate           x509 = null;
            X509CertificateCollection coll = new X509CertificateCollection();

            switch (Path.GetExtension(filename).ToUpper())
            {
            case ".P7B":
            case ".SPC":
                SoftwarePublisherCertificate spc = SoftwarePublisherCertificate.CreateFromFile(filename);
                coll.AddRange(spc.Certificates);
                spc = null;
                break;

            case ".CER":
            case ".CRT":
                using (FileStream fs = File.OpenRead(filename)) {
                    byte[] data = new byte [fs.Length];
                    fs.Read(data, 0, data.Length);
                    if (data [0] != 0x30)
                    {
                        // maybe it's ASCII PEM base64 encoded ?
                        data = PEM("CERTIFICATE", data);
                    }
                    if (data != null)
                    {
                        x509 = new X509Certificate(data);
                    }
                }
                if (x509 != null)
                {
                    coll.Add(x509);
                }
                break;

            case ".P12":
            case ".PFX":
                PKCS12 p12 = password == null?PKCS12.LoadFromFile(filename)
                                 : PKCS12.LoadFromFile(filename, password);

                X509CertificateCollection tmp = new X509CertificateCollection(p12.Certificates);

                for (int i = 0; i != p12.Keys.Count; i++)
                {
                    X509Certificate          cert = p12.Certificates[i];
                    RSACryptoServiceProvider pk   = p12.Keys[i] as RSACryptoServiceProvider;

                    if (pk == null || pk.PublicOnly)
                    {
                        continue;
                    }

                    if (verbose)
                    {
                        Console.WriteLine("Found key for certificate: {0}", cert.SubjectName);
                    }

                    tmp[0].RSA = pk;
                }
                coll.AddRange(tmp);
                p12 = null;
                break;

            default:
                Console.WriteLine("Unknown file extension: {0}",
                                  Path.GetExtension(filename));
                break;
            }
            return(coll);
        }