diff --git a/ChatController/ChatController.csproj b/ChatController/ChatController.csproj index a68ca3a..6fd9e5b 100644 --- a/ChatController/ChatController.csproj +++ b/ChatController/ChatController.csproj @@ -109,6 +109,7 @@ OwnChatMessageBox.xaml + diff --git a/ChatController/HauptKlassen/Chat.cs b/ChatController/HauptKlassen/Chat.cs index e7f058f..61f9ecb 100644 --- a/ChatController/HauptKlassen/Chat.cs +++ b/ChatController/HauptKlassen/Chat.cs @@ -10,9 +10,7 @@ using System.IO; using System.Linq; using System.Net; using System.Net.Http; -using System.Net.Security; using System.Runtime.CompilerServices; -using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; using System.Windows; @@ -34,6 +32,7 @@ using ContextMenu = System.Windows.Controls.ContextMenu; using DataFormats = System.Windows.Forms.DataFormats; using Image = System.Drawing.Image; using MessageBox = System.Windows.MessageBox; +using ChatController.Security; namespace ChatController.HauptKlassen { @@ -70,63 +69,10 @@ namespace ChatController.HauptKlassen private static void PinCertificate() { - ServicePointManager.ServerCertificateValidationCallback = PinPublicKey; + ServicePointManager.ServerCertificateValidationCallback = CertificateChecker.PinPublicKey; } - //!!!!Wenn hier neue Keys hinzugefügt werden, muss das auch in der Klasse BeWo.LoginControl und im DatabaseTerminator gemacht werden!! - - private const string PinningFailMessage = "Es konnte keine sichere Verbindung zum Server hergestellt werden."; - - private const String PUB_KEY_X3 = "9CD30CF05AE52E47B7725D3783B3686330EAD735261925E1BDBE35F170922FB7B84B4105ABA99E350858ECB12AC468870BA3E375E4E6F3A76271BA7981601FD7919A9FF3D0786771C8690E9591CFFEE699E9603C48CC7ECA4D7712249D471B5AEBB9EC1E37001C9CAC7BA705EACE4AEBBD41E53698B9CBFD6D3C9668DF232A42900C867467C87FA59AB8526114133F65E98287CBDBFA0E56F68689F3853F9786AFB0DC1AEF6B0D95167DC42BA065B299043675806BAC4AF31B9049782FA2964F2A20252904C674C0D031CD8F31389516BAA833B843F1B11FC3307FA27931133D2D36F8E3FCF2336AB93931C5AFC48D0D1D641633AAFA8429B6D40BC0D87DC3930203010001"; - - private const String PUB_KEY_R3 = "BB021528CCF6A094D30F12EC8D5592C3F882F199A67A4288A75D26AAB52BB9C54CB1AF8E6BF975C8A3D70F4794145535578C9EA8A23919F5823C42A94E6EF53BC32EDB8DC0B05CF35938E7EDCF69F05A0B1BBEC094242587FA3771B313E71CACE19BEFDBE43B45524596A9C153CE34C852EEB5AEED8FDE6070E2A554ABB66D0E97A540346B2BD3BC66EB66347CFA6B8B8F572999F830175DBA726FFB81C5ADD286583D17C7E709BBF12BF786DCC1DA715DD446E3CCAD25C188BC60677566B3F118F7A25CE653FF3A88B647A5FF1318EA9809773F9D53F9CF01E5F5A6701714AF63A4FF99B3939DDC53A706FE48851DA169AE2575BB13CC5203F5ED51A18BDB150203010001"; - - private const String PUB_KEY_E1 = "245c2da22afd1c4ba65d97732731acb2a06962ef65e8a6b0f0ac4b9fff1c0b700fd3982f4dfc0f009b37f074055732972e05ef2a4325a3fb6e342713f64f7e69d302995eeb244792c1249be6b1218fc12481fc68cc1f69ba58f51922f774c616"; - - private const String PUB_KEY_E5 = "0d0b3a8a6b618eb6efdc5f58e7c6424554ab63f66661480a2e5975b481023750b73f1679dc98eca1289772201c2ccfd57c52204e54785b84146bc090ae85ecc051413c5a877f064dd4fe60d1fa6c2de17d951088a208540f991a4ce6ea0aacd8"; - - private const String PUB_KEY_E6 = "d9f19e4687f8217160a826eba3fab9eada1db912a7d426d95114b1617c7596bf220b391fd5bed10a46aa2d3c4a09842ebe409555e91940376675ed324e770449f8707bc318e7cef77110feac74d800d4ed6d1c731633109c3ab2ea6c62f4bdb8"; - - private const String PUB_KEY_R10 = "CF57E5E6C45412EDB447FEC92758764650288C1D3E88DF059DD5B51829BDDDB55ABFFAF6CEA3BEAF00214B625A5A3C012FC55803F689FF8E1143EBC1B5E01407968F6F1FD7E7BA8139097565B7C2AF185B372628E7A3F4072B6D1AFFAB58BC95AE40FFE9CB57C4B55B7F780D1861BC17E754C6BB4991CD6E18D18085EEA66536BC74EABC504CEAFC21F338169394BAB0D36B3806CD16127ACA5275C8AD76B2C29C5D98455C6F617BC62DEE3C13528601D957E6381CDF8DB51F92919AE74A1CCC45A87255F0B0E6A307ECFDA71B669E3F488B71847158C93AFAEF5EF25B442B3C74E78FB247C1076ACD9AB70D96F712812651540AEC61F6F7F5E2F28AC8950D8D0203010001"; - - private const String PUB_KEY_R11 = "BA87BC5C1B0039CBCA0ACDD46710F9013CA54EA561CB26CA52FB1501B7B928F5281EED27B324183967090C08ECE03AB03B770EBDF3E53954410C4EAE41D69974DE51DBEF7BFF58BDA8B713F6DE31D5F272C9726A0B8374959C4600641499F3B1D922D9CDA892AA1C267A3FFEEF58057B089581DB710F8EFBE33109BB09BE504D5F8F91763D5A9D9E83F2E9C466B3E106664348188065A037189A9B843297B1B2BDC4F815009D2788FBE26317966C9B27674BC4DB285E69C279F0495CE02450E1C4BCA105AC7B406D00B4C2413FA758B82FC55C9BA5BB099EF1FEEBB08539FDA80AEF45C478EB652AC2CF5F3CDEE35C4D1BF70B272BAA0B4277534F796A1D87D90203010001"; - - - private static bool PinPublicKey(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors) - { - try - { - if (certificate == null || chain == null) - return false; - - bool chainContainsPk = false; - - foreach (var element in chain.ChainElements) - { - String pk = element.Certificate.GetPublicKeyString().ToLower(); - - if (pk.Contains(PUB_KEY_X3.ToLower()) || - pk.Contains(PUB_KEY_R3.ToLower()) || - pk.Contains(PUB_KEY_E1.ToLower()) || - pk.Contains(PUB_KEY_E5.ToLower()) || - pk.Contains(PUB_KEY_E6.ToLower()) || - pk.Contains(PUB_KEY_R10.ToLower()) || - pk.Contains(PUB_KEY_R11.ToLower())) - { - chainContainsPk = true; - } - } - - bool subjectAccepted = certificate.Subject.Trim().ToLower().EndsWith(".bewoplaner.de") || - certificate.Subject.Trim().ToLower().EndsWith(".ownchat.de"); - return chainContainsPk && subjectAccepted; - } - catch (Exception e) - { - return false; - } - - } + diff --git a/ChatController/HauptKlassen/Login.cs b/ChatController/HauptKlassen/Login.cs index 9278afb..71bce79 100644 --- a/ChatController/HauptKlassen/Login.cs +++ b/ChatController/HauptKlassen/Login.cs @@ -12,6 +12,7 @@ using System.Windows; using ChatController.Core; using ChatController.Data; using ChatController.LoginKlassen; +using ChatController.Security; using ChatController.Utilities; using Newtonsoft.Json; @@ -26,70 +27,9 @@ namespace ChatController.HauptKlassen private void PinCertificate() { - ServicePointManager.ServerCertificateValidationCallback = PinPublicKey; + ServicePointManager.ServerCertificateValidationCallback = CertificateChecker.PinPublicKey; } - private bool PinPublicKey(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors) - { - try - { - if(certificate is null || chain is null) - { - return false; - } - - var chainContainsPk = false; - - foreach(var element in chain.ChainElements) - { - var pk = element.Certificate.GetPublicKeyString(); - if(pk == PubKeyX3 || pk == PubKeyR3 || pk == PubKeyE1) - { - chainContainsPk = true; - } - } - - var subjectAccepted = certificate.Subject.Trim().ToLower().EndsWith(".bewoplaner.de") || certificate.Subject.Trim().ToLower().EndsWith(".ownchat.de"); - - var result = chainContainsPk && subjectAccepted; - - if(false == result) - { - throw new Exception(PinningFailMessage); - } - - return result; - } - catch(Exception exception) - { - if(exception.Message?.Equals(PinningFailMessage) ?? false) - { - _ExceptionCallback?.Invoke(PinningFailMessage); - } - - return false; - } - } - - private const string PinningFailMessage = "Es konnte keine sichere Verbindung zum Server hergestellt werden."; - - private const string PubKeyX3 = "3082010A02820101009CD30CF05AE52E47B7725D3783B3686330EAD735261925E1BDBE35F170922FB7B84B4105ABA99E350858ECB12AC468870BA3E375E4E6F3A76271BA7981601FD7919A9FF3D0786771C8690E9591CFFEE699E9603C48CC7ECA4D7712249D471B5AEBB9EC1E37001C9CAC7BA705EACE4AEBBD41E53698B9CBFD6D3C9668DF232A42900C867467C87FA59AB8526114133F65E98287CBDBFA0E56F68689F3853F9786AFB0DC1AEF6B0D95167DC42BA065B299043675806BAC4AF31B9049782FA2964F2A20252904C674C0D031CD8F31389516BAA833B843F1B11FC3307FA27931133D2D36F8E3FCF2336AB93931C5AFC48D0D1D641633AAFA8429B6D40BC0D87DC3930203010001"; - - private const string PubKeyR3 = "3082010A0282010100BB021528CCF6A094D30F12EC8D5592C3F882F199A67A4288A75D26AAB52BB9C54CB1AF8E6BF975C8A3D70F4794145535578C9EA8A23919F5823C42A94E6EF53BC32EDB8DC0B05CF35938E7EDCF69F05A0B1BBEC094242587FA3771B313E71CACE19BEFDBE43B45524596A9C153CE34C852EEB5AEED8FDE6070E2A554ABB66D0E97A540346B2BD3BC66EB66347CFA6B8B8F572999F830175DBA726FFB81C5ADD286583D17C7E709BBF12BF786DCC1DA715DD446E3CCAD25C188BC60677566B3F118F7A25CE653FF3A88B647A5FF1318EA9809773F9D53F9CF01E5F5A6701714AF63A4FF99B3939DDC53A706FE48851DA169AE2575BB13CC5203F5ED51A18BDB150203010001"; - - private const string PubKeyE1 = "04245C2DA22AFD1C4BA65D97732731ACB2A06962EF65E8A6B0F0AC4B9FFF1C0B700FD3982F4DFC0F009B37F074055732972E05EF2A4325A3FB6E342713F64F7E69D302995EEB244792C1249BE6B1218FC12481FC68CC1F69BA58F51922F774C616"; - - - - - - - - - - - - private string _BaseUrl = string.Empty; private const string DictionaryServerUrl = "https://dict.ownchat.de/api/server/resolve/1/"; @@ -246,9 +186,9 @@ namespace ChatController.HauptKlassen if(lookupResult is null) { - if(response.ErrorException?.InnerException?.Message.Equals(PinningFailMessage) ?? false) + if(response.ErrorException?.InnerException?.Message.Equals(CertificateChecker.PinningFailMessage) ?? false) { - exceptionCallback?.Invoke(PinningFailMessage); + exceptionCallback?.Invoke(CertificateChecker.PinningFailMessage); } else { diff --git a/ChatController/Security/CertificateChecker.cs b/ChatController/Security/CertificateChecker.cs new file mode 100644 index 0000000..97fc0b2 --- /dev/null +++ b/ChatController/Security/CertificateChecker.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; + +namespace ChatController.Security +{ + public class CertificateChecker + { + //!!!!Wenn hier neue Keys hinzugefügt werden, muss das auch in der Klasse BeWo.LoginControl und im DatabaseTerminator gemacht werden!! + + public const string PinningFailMessage = "Es konnte keine sichere Verbindung zum Server hergestellt werden."; + + private const String PUB_KEY_X3 = "9CD30CF05AE52E47B7725D3783B3686330EAD735261925E1BDBE35F170922FB7B84B4105ABA99E350858ECB12AC468870BA3E375E4E6F3A76271BA7981601FD7919A9FF3D0786771C8690E9591CFFEE699E9603C48CC7ECA4D7712249D471B5AEBB9EC1E37001C9CAC7BA705EACE4AEBBD41E53698B9CBFD6D3C9668DF232A42900C867467C87FA59AB8526114133F65E98287CBDBFA0E56F68689F3853F9786AFB0DC1AEF6B0D95167DC42BA065B299043675806BAC4AF31B9049782FA2964F2A20252904C674C0D031CD8F31389516BAA833B843F1B11FC3307FA27931133D2D36F8E3FCF2336AB93931C5AFC48D0D1D641633AAFA8429B6D40BC0D87DC3930203010001"; + + private const String PUB_KEY_R3 = "BB021528CCF6A094D30F12EC8D5592C3F882F199A67A4288A75D26AAB52BB9C54CB1AF8E6BF975C8A3D70F4794145535578C9EA8A23919F5823C42A94E6EF53BC32EDB8DC0B05CF35938E7EDCF69F05A0B1BBEC094242587FA3771B313E71CACE19BEFDBE43B45524596A9C153CE34C852EEB5AEED8FDE6070E2A554ABB66D0E97A540346B2BD3BC66EB66347CFA6B8B8F572999F830175DBA726FFB81C5ADD286583D17C7E709BBF12BF786DCC1DA715DD446E3CCAD25C188BC60677566B3F118F7A25CE653FF3A88B647A5FF1318EA9809773F9D53F9CF01E5F5A6701714AF63A4FF99B3939DDC53A706FE48851DA169AE2575BB13CC5203F5ED51A18BDB150203010001"; + + private const String PUB_KEY_E1 = "245c2da22afd1c4ba65d97732731acb2a06962ef65e8a6b0f0ac4b9fff1c0b700fd3982f4dfc0f009b37f074055732972e05ef2a4325a3fb6e342713f64f7e69d302995eeb244792c1249be6b1218fc12481fc68cc1f69ba58f51922f774c616"; + + private const String PUB_KEY_E5 = "0d0b3a8a6b618eb6efdc5f58e7c6424554ab63f66661480a2e5975b481023750b73f1679dc98eca1289772201c2ccfd57c52204e54785b84146bc090ae85ecc051413c5a877f064dd4fe60d1fa6c2de17d951088a208540f991a4ce6ea0aacd8"; + + private const String PUB_KEY_E6 = "d9f19e4687f8217160a826eba3fab9eada1db912a7d426d95114b1617c7596bf220b391fd5bed10a46aa2d3c4a09842ebe409555e91940376675ed324e770449f8707bc318e7cef77110feac74d800d4ed6d1c731633109c3ab2ea6c62f4bdb8"; + + private const String PUB_KEY_R10 = "CF57E5E6C45412EDB447FEC92758764650288C1D3E88DF059DD5B51829BDDDB55ABFFAF6CEA3BEAF00214B625A5A3C012FC55803F689FF8E1143EBC1B5E01407968F6F1FD7E7BA8139097565B7C2AF185B372628E7A3F4072B6D1AFFAB58BC95AE40FFE9CB57C4B55B7F780D1861BC17E754C6BB4991CD6E18D18085EEA66536BC74EABC504CEAFC21F338169394BAB0D36B3806CD16127ACA5275C8AD76B2C29C5D98455C6F617BC62DEE3C13528601D957E6381CDF8DB51F92919AE74A1CCC45A87255F0B0E6A307ECFDA71B669E3F488B71847158C93AFAEF5EF25B442B3C74E78FB247C1076ACD9AB70D96F712812651540AEC61F6F7F5E2F28AC8950D8D0203010001"; + + private const String PUB_KEY_R11 = "BA87BC5C1B0039CBCA0ACDD46710F9013CA54EA561CB26CA52FB1501B7B928F5281EED27B324183967090C08ECE03AB03B770EBDF3E53954410C4EAE41D69974DE51DBEF7BFF58BDA8B713F6DE31D5F272C9726A0B8374959C4600641499F3B1D922D9CDA892AA1C267A3FFEEF58057B089581DB710F8EFBE33109BB09BE504D5F8F91763D5A9D9E83F2E9C466B3E106664348188065A037189A9B843297B1B2BDC4F815009D2788FBE26317966C9B27674BC4DB285E69C279F0495CE02450E1C4BCA105AC7B406D00B4C2413FA758B82FC55C9BA5BB099EF1FEEBB08539FDA80AEF45C478EB652AC2CF5F3CDEE35C4D1BF70B272BAA0B4277534F796A1D87D90203010001"; + + + + public static bool PinPublicKey(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors) + { + try + { + if (certificate == null || chain == null) + return false; + + bool chainContainsPk = false; + + foreach (var element in chain.ChainElements) + { + String pk = element.Certificate.GetPublicKeyString().ToLower(); + + if (pk.Contains(PUB_KEY_X3.ToLower()) || + pk.Contains(PUB_KEY_R3.ToLower()) || + pk.Contains(PUB_KEY_E1.ToLower()) || + pk.Contains(PUB_KEY_E5.ToLower()) || + pk.Contains(PUB_KEY_E6.ToLower()) || + pk.Contains(PUB_KEY_R10.ToLower()) || + pk.Contains(PUB_KEY_R11.ToLower())) + { + chainContainsPk = true; + } + } + + bool subjectAccepted = certificate.Subject.Trim().ToLower().EndsWith(".bewoplaner.de") || + certificate.Subject.Trim().ToLower().EndsWith(".ownchat.de"); + return chainContainsPk && subjectAccepted; + } + catch (Exception e) + { + return false; + } + + } + } +}