diff --git a/Src/SwqlStudio/ProductSpecific/CertificateValidatorWithCache.cs b/Src/SwqlStudio/ProductSpecific/CertificateValidatorWithCache.cs new file mode 100644 index 000000000..0829481e7 --- /dev/null +++ b/Src/SwqlStudio/ProductSpecific/CertificateValidatorWithCache.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Windows.Forms; + +namespace SwqlStudio +{ + internal static class CertificateValidatorWithCache + { + // cache positive answers for thumbprints (otherwise, each request fires msgbox) + private static readonly Dictionary _certificateAccepted = new Dictionary(); + + + public static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors) + { + var thumbprint = (certificate as X509Certificate2)?.Thumbprint; + lock (_certificateAccepted) + { + if (thumbprint != null && + _certificateAccepted.TryGetValue(thumbprint, out var accepted) && + accepted) + { + return true; + } + } + + var ret = (DialogResult.Yes == + MessageBox.Show("Server certificate has problem " + sslpolicyerrors + ". Connect anyway?", + "SSL Certificate Issue", MessageBoxButtons.YesNo)); + + lock (_certificateAccepted) + { + if (thumbprint != null && ret) + { + _certificateAccepted[thumbprint] = true; + } + } + + return ret; + } + + } +} \ No newline at end of file diff --git a/Src/SwqlStudio/ProductSpecific/JavaHttpInfoService.cs b/Src/SwqlStudio/ProductSpecific/JavaHttpInfoService.cs index e035a9338..3b27efbfd 100644 --- a/Src/SwqlStudio/ProductSpecific/JavaHttpInfoService.cs +++ b/Src/SwqlStudio/ProductSpecific/JavaHttpInfoService.cs @@ -1,9 +1,6 @@ using System; using System.Net; -using System.Net.Security; -using System.Security.Cryptography.X509Certificates; using System.ServiceModel; -using System.Windows.Forms; using SolarWinds.InformationService.Contract2; using SwqlStudio.Properties; @@ -20,7 +17,8 @@ public JavaHttpInfoService(string username, string password) _protocolName = "https"; _credentials = new UsernameCredentials(username, password); - ServicePointManager.ServerCertificateValidationCallback = ValidateRemoteCertificate; + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; + ServicePointManager.ServerCertificateValidationCallback = CertificateValidatorWithCache.ValidateRemoteCertificate; } public override string ServiceType @@ -28,13 +26,6 @@ public override string ServiceType get { return "Java over HTTP"; } } - private static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors) - { - return (DialogResult.Yes == - MessageBox.Show("Server certificate has problem " + sslpolicyerrors + ". Connect anyway?", - "SSL Certificate Issue", MessageBoxButtons.YesNo)); - } - public override Uri Uri(string serverAddress) { Uri resultUri; diff --git a/Src/SwqlStudio/ProductSpecific/OrionHttpsInfoService.cs b/Src/SwqlStudio/ProductSpecific/OrionHttpsInfoService.cs index 0396fd74f..4a67a5730 100644 --- a/Src/SwqlStudio/ProductSpecific/OrionHttpsInfoService.cs +++ b/Src/SwqlStudio/ProductSpecific/OrionHttpsInfoService.cs @@ -12,7 +12,8 @@ class OrionHttpsInfoService : InfoServiceBase { static OrionHttpsInfoService() { - ServicePointManager.ServerCertificateValidationCallback = ValidateRemoteCertificate; + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; + ServicePointManager.ServerCertificateValidationCallback = CertificateValidatorWithCache.ValidateRemoteCertificate; } private static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors) diff --git a/Src/SwqlStudio/Properties/Settings.Designer.cs b/Src/SwqlStudio/Properties/Settings.Designer.cs index 7b2867011..a1948c04b 100644 --- a/Src/SwqlStudio/Properties/Settings.Designer.cs +++ b/Src/SwqlStudio/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace SwqlStudio.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.6.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.8.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/Src/SwqlStudio/SwqlStudio.csproj b/Src/SwqlStudio/SwqlStudio.csproj index 083b0bb42..813b94d14 100644 --- a/Src/SwqlStudio/SwqlStudio.csproj +++ b/Src/SwqlStudio/SwqlStudio.csproj @@ -10,7 +10,7 @@ Properties SwqlStudio SwqlStudio - v4.0 + v4.5 512 Main.ico @@ -54,6 +54,7 @@ 4 x86 AllRules.ruleset + false pdbonly @@ -64,6 +65,7 @@ 4 x86 AllRules.ruleset + false @@ -173,6 +175,7 @@ Component + True True diff --git a/Src/SwqlStudio/XmlRender/XmlRender.Designer.cs b/Src/SwqlStudio/XmlRender/XmlRender.Designer.cs index 2ddf9b770..7e55f40c7 100644 --- a/Src/SwqlStudio/XmlRender/XmlRender.Designer.cs +++ b/Src/SwqlStudio/XmlRender/XmlRender.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.0 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -19,7 +19,7 @@ namespace SwqlStudio.XmlRender { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class XmlRender { diff --git a/Src/SwqlStudio/app.config b/Src/SwqlStudio/app.config index 7e5f1fc52..c3668c4a3 100644 --- a/Src/SwqlStudio/app.config +++ b/Src/SwqlStudio/app.config @@ -12,13 +12,13 @@ - + - + - + True @@ -271,4 +271,4 @@ - +