/// <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); } }