示例#1
0
        /// <summary>
        /// Считывает информацию о текущей подписи из файла сертификата (*.pem или *.RSA)
        /// </summary>
        /// <param name="fPath">Путь до файла (*.pem или *.RSA)</param>
        /// <returns></returns>
        public static CertInfo ReadCert(string fPath, bool IsPk8Required)
        {
            if (!File.Exists(fPath))
            {
                return(null);
            }

            //Получаем вывод keytool
            string ktOutput = null;

            try
            {
                Environment.ktProc.StartInfo.Arguments = string.Format(Environment.keytoolArgs, fPath);
                Environment.Log(string.Format("Запускаем \"{0}\" с аргументами \"{1}\"", Environment.ktProc.StartInfo.FileName, Environment.ktProc.StartInfo.Arguments));
                Environment.ktProc.Start();
                ktOutput = Environment.ktProc.StandardOutput.ReadToEnd();
                Environment.ktProc.WaitForExit();
            }
            catch (Exception ex) {
                Environment.Log(string.Format("Запуск не удался. Ошибка: \"{0}\"", ex.Message));
                return(null);
            }

            //Если вывод пуст - фейл
            if (string.IsNullOrEmpty(ktOutput))
            {
                return(null);
            }

            //Парсим
            CertInfo cInfo = CertInfo.Parse(ktOutput);

            if (cInfo == null)
            {
                return(null);
            }

            //Проверяем наличие рядом файла pk8. Если есть - добавляем пути, тем самым помечаем пригодным для подписания
            string pk8File = Path.Combine(Path.GetDirectoryName(fPath), fPath.Substring(0, fPath.IndexOf('.')) + ".pk8");

            if (File.Exists(pk8File))
            {
                Environment.Log(string.Format("Найден pk8 \"{0}\". Добавляем как пригодный для подписи", pk8File));
                cInfo.pemPath = fPath;
                cInfo.pk8Path = pk8File;
                CertInfo cnInfoStored = SignCerts.Find(c => (c.SerialNumber == cInfo.SerialNumber && cInfo.pemPath == cInfo.pemPath && c.pk8Path == cInfo.pk8Path));
                if (cnInfoStored == null)
                {
                    SignCerts.Add(cInfo);
                    return(cInfo);
                }
                else
                {
                    return(cnInfoStored);
                }
            }
            else
            {
                if (IsPk8Required)
                {
                    Environment.Log(string.Format("Требуется pk8 \"{0}\", однако он не был найден.", pk8File));
                    return(null);
                }
            }

            //Ищем подпись в коллекции
            CertInfo cInfoStored = Certs.Find(c => (c.SerialNumber == cInfo.SerialNumber));

            if (cInfoStored == null)
            {
                Certs.Add(cInfo);
                return(cInfo);
            }
            else
            {
                return(cInfoStored);
            }
        }