public void LoadCertificatesFromStore() { int lastSelectedCertItem = CertificateItem; List<X509Certificate2> certs = SignatureProcessor.GetAllCertificatesFromStore(CertificateStore); Certificates.Clear(); foreach(X509Certificate2 c in certs.Where((cert) => cert.HasPrivateKey)) { Certificates.Add(c); } CertificateItem = lastSelectedCertItem; }
public string SignWithSelectedCert(X509Certificate2 cert) { //use SignInfo from Session SignatureInfo si = Session.SignInfo; XmlDocument docToSign = new XmlDocument(); docToSign.LoadXml(Session.DataToSign); string signedData = string.Empty; try { signedData = SignatureProcessor.Sign(Session.SignInfo.SigType, cert, docToSign, false, Session.SignInfo.NodeId); } catch (Exception e) { SetErrorMessage(e.Message); } return signedData; }
public bool SelectInteropCertificate() { X509Certificate2 selectedCert = new X509Certificate2(); StoreLocation certificateStore = StoreLocation.CurrentUser; if ((selectedCert = SignatureProcessor.SelectCertificateUI(StoreLocation.CurrentUser)) == null) { certificateStore = StoreLocation.LocalMachine; selectedCert = SignatureProcessor.SelectCertificateUI(StoreLocation.LocalMachine); } /* selectedCert = SignatureProcessor.SelectCertificateUI(StoreLocation.CurrentUser) ?? SignatureProcessor.SelectCertificateUI(StoreLocation.LocalMachine); */ if (selectedCert != null) { SetConfigField("InteropCertificateThumbprint", selectedCert.Thumbprint); SetConfigField("InteropCertificateStore", certificateStore.ToString()); saveChangesToConfig(); //LoadConfig(); return true; } return false; }
private bool checkConfig(XDocument cfg) { string binConfigPath = cfg.Root?.Element("CfgBinPath")?.Value; string certFilePath = cfg.Root?.Element("CertificateFilePath")?.Value; StoreLocation storeLocation; StoreLocation.TryParse(cfg.Root?.Element("CertificateStore")?.Value, true, out storeLocation); if(storeLocation != 0) { CertificateStore = storeLocation; } else { CertificateStore = StoreLocation.CurrentUser; SetConfigField("CertificateStore", CertificateStore.ToString()); } #region [set window position and size] string lastHeightStr = cfg.Root?.Element("WindowHeight")?.Value; string lastWidthStr = cfg.Root?.Element("WindowWidth")?.Value; string lastLeftStr = cfg.Root?.Element("WindowLeft")?.Value; string lastTopStr = cfg.Root?.Element("WindowTop")?.Value; if(!string.IsNullOrEmpty(lastHeightStr)) { WindowHeight = Int32.Parse(lastHeightStr); } else { WindowHeight = 780; SetConfigField("WindowHeight", WindowHeight.ToString()); } if(!string.IsNullOrEmpty(lastWidthStr)) { WindowWidth = Int32.Parse(lastWidthStr); } else { WindowWidth = 590; SetConfigField("WindowWidth", WindowWidth.ToString()); } if(!string.IsNullOrEmpty(lastLeftStr)) { WindowLeft = Int32.Parse(lastLeftStr); } else { WindowLeft = 100; SetConfigField("WindowLeft", WindowLeft.ToString()); } if(!string.IsNullOrEmpty(lastTopStr)) { WindowTop = Int32.Parse(lastTopStr); } else { WindowTop = 20; SetConfigField("WindowTop", WindowTop.ToString()); } #endregion string lastCertificateStr = cfg.Root?.Element("CertificateItem")?.Value; if(!string.IsNullOrEmpty(lastCertificateStr)) { CertificateItem = Int32.Parse(lastCertificateStr); } else { CertificateItem = 0; SetConfigField("CertificateItem", CertificateItem.ToString()); } string interopCertificateThumb = cfg.Root?.Element("InteropCertificateThumbprint")?.Value; if (string.IsNullOrEmpty(interopCertificateThumb)) { // Thread.Sleep(1000); SetErrorMessage("Не указан сертификат подписи для взаимодействия"); bool certSelected = SelectInteropCertificate(); if (!certSelected) { MessageBox.Show( "Не указан сертификат подписи для взаимодействия.\nУкажите сертификат подписи, используя соответствующий пункт меню «Настройка» программы.", "Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error); return false; } else { StoreLocation.TryParse(cfg.Root?.Element("InteropCertificateStore")?.Value, true, out _interopCertificateStoreLocation); } } else { _interopCertificateThumbprint = interopCertificateThumb; StoreLocation.TryParse(cfg.Root?.Element("InteropCertificateStore")?.Value, true, out _interopCertificateStoreLocation); } saveChangesToConfig(); //signed (and siphered) binary config if(string.IsNullOrEmpty(binConfigPath)) { SetErrorMessage("Личный конфигурационный файл не найден"); bool privateConfigSelected = LoadPrivateConfig(); if (!privateConfigSelected) { MessageBox.Show("Личный конфигурационный файл не найден.\nСкачайте новый личный конфигурационный файл с корпоративного портала.", "Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error); return false; } } else { //means htere is a config //check it's signature, but first load our certificate if(string.IsNullOrEmpty(certFilePath)) { MessageBox.Show("Файл сертификата сервера не найден.\nСкачайте файл сертификата сервера с корпоративного портала.", "Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error); SetErrorMessage("Файл сертификата сервера не найден"); bool serverCertifcateSelected = LoadServerCertificate(); if (!serverCertifcateSelected) { return false; } } else { //means certificate && config present //check cert expiration date X509Certificate2 cert = new X509Certificate2(); try { cert.Import(certFilePath); if (cert.NotAfter > DateTime.Now) { //cert ok //check config signature string configContents = Util.DecryptConfig(binConfigPath,ProgramFolder); if (string.IsNullOrEmpty(configContents)) { MessageBox.Show("Личный конфигурационный файл поврежден.\nСкачайте новый личный конфигурационный файл с корпоративного портала.", "Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error); SetErrorMessage("Личный конфигурационный файл поврежден"); return false; } XmlDocument xdocConfig = new XmlDocument(); // this stuff is for try { xdocConfig.LoadXml(configContents); // check signature further } catch (Exception e) { MessageBox.Show( $"Личный конфигурационный файл поврежден.\nСкачайте новый личный конфигурационный файл с корпоративного портала.\n\n{e.Message}", "Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error); SetErrorMessage("Личный конфигурационный файл поврежден"); return false; } XDocument privateConfig = XDocument.Parse(configContents); try { #if !DEBUG if (SignatureProcessor.VerifySignature(SignatureProcessor.SignatureType.Smev3SidebysideDetached, xdocConfig, cert)) { #endif #if DEBUG if(SignatureProcessor.VerifySignature(SignatureProcessor.SignatureType.Smev3SidebysideDetached, xdocConfig)) { #endif //config signature OK - loading contents if (privateConfig.Root?.Attribute("version").Value == ProgramVersion) { //means config version corresponds to a program version _ourCertificate = cert; _serverUri = new Uri(privateConfig.Root?.Element("Server").Element("GetFileUri")?.Value ?? ""); _serverSignatureCertificateThumbprint = privateConfig.Root?.Element("Server").Element("CertificateThumbprint")?.Value ?? ""; _serverHttpsCertificateThumbprint = privateConfig.Root?.Element("Server").Element("SSLCertificateThumbprint")?.Value ?? ""; ClearError("Конфигурационный файл успешно загружен"); } else { //means version in config is not right one MessageBox.Show( $"Текущая версия программы <{ProgramVersion}> устарела.\nСкачайте новую версию с корпоративного портала.", "Программа устарела.", MessageBoxButton.OK, MessageBoxImage.Error); SetErrorMessage($"Установленная версия программы <{ProgramVersion}> устарела"); return false; } } else { //signature incorrect Debug.WriteLine("Invalid Signature"); MessageBox.Show( "Личный конфигурационный файл поврежден.\nСкачайте новый личный конфигурационный файл с корпоративного портала.", "Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error); SetErrorMessage("Личный конфигурационный файл поврежден"); return false; } } catch (Exception e) { MessageBox.Show( $"Личный конфигурационный файл поврежден.\nСкачайте новый личный конфигурационный файл с корпоративного портала.\n\n{e.Message}", "Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error); SetErrorMessage("Личный конфигурационный файл поврежден"); return false; } } else { //cert expired MessageBox.Show("Файл сертификата сервера просрочен.\nСкачайте новый файл сертификата сервера с корпоративного портала.", "Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error); SetErrorMessage("Файл сертификата сервера просрочен"); return false; } } catch (Exception e) { //certificate corrupted MessageBox.Show($"Ошибка загрузки сертификата сервера. Файл поврежден.\nСкачайте новый файл сертификата сервера с корпоративного портала.\n\n{e.Message}", "Ошибка загрузки начальной конфигурации.", MessageBoxButton.OK, MessageBoxImage.Error); SetErrorMessage("Ошибка загрузки сертификата сервера"); return false; } } } return true; }
public SigningSession(string sessionMessage) { /* * <SessionResponse version='1.1'> * <SigningInfo id="SIGNED_BY_SERVER" session_id="..." vsrsion="..."> * <DocumentToSign>PE1haW4+Cgk8YXBwX2lkPtCg0YPRgdGB0LrQuNC1INCx0YPQutCy0Ys8L2FwcF9pZD4KCTxzZW5kZXJfaWQ+0KHQvdC+0LLQsCDQsdGD0LrQstGLPC9zZW5kZXJfaWQ+Cgk8c2VydmljZV9pZD4xMDAwMTAwNTQ4NTwvc2VydmljZV9pZD4KPC9NYWluPg==</DocumentToSign> * <DocumentXsl>PHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgoJPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL01haW4iPgoJCTxwPjxzdHJvbmc+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii8vYXBwX2lkIi8+PC9zdHJvbmc+PC9wPgoJCTxwPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvL3NlbmRlcl9pZCIvPjwvcD4KCQk8cD48dT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLy9zZXJ2aWNlX2lkIi8+PC91PjwvcD4KCTwveHNsOnRlbXBsYXRlPgo8L3hzbDpzdHlsZXNoZWV0Pg==</DocumentXsl> * <SignatureInfo> * <Type>enveloped</Type> * <NodeId> * * SIGNED_1 * </NodeId> * </SignatureInfo> * </SigningInfo> * <Signature/> * </SessionResponse> */ Success = false; SignatureIsCorrect = false; VersionIsCorrect = false; ServerSessionMessage = XDocument.Parse(sessionMessage); if ((RequestedProgramVersion = ServerSessionMessage.Root.Attribute("version").Value) != MainViewModel.ProgramVersion) { return; } SessionId = ServerSessionMessage.Root?.Element("SigningInfo").Attribute("session_id").Value ?? string.Empty; VersionIsCorrect = true; XmlDocument signedDoc = new XmlDocument(); signedDoc.LoadXml(sessionMessage); #if !DEBUG if (!SignatureProcessor.VerifySignature(SignatureProcessor.SignatureType.Smev2SidebysideDetached, signedDoc)) { return; } #endif SignatureIsCorrect = true; DataToSign = Encoding.UTF8.GetString( Convert.FromBase64String( ServerSessionMessage.Root.Descendants("DocumentToSign").First().Value ) ); DocToSign = XDocument.Parse(DataToSign); try { XslStylesheet = XDocument.Parse( Encoding.UTF8.GetString( Convert.FromBase64String( ServerSessionMessage.Root.Descendants("DocumentXsl").First().Value ) ) ); HumanReadableHtml = _transformDoc(); } catch (Exception) { HumanReadableHtml = DocToSign.Root.ToString(); } SignInfo = new SignatureInfo(ServerSessionMessage.Root.Descendants("SignatureInfo").First()); Success = VersionIsCorrect || SignatureIsCorrect; }