热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:忽略控制台应用程序中的Web浏览器SSL安全警报分享

忽略控制台应用程序中的Web浏览器SSL安全警报我正在创建一个能够远程捕获网站截图的控制台应用程序。一切都在工作,除了我无法避免证书错误。每次我收到弹出消息,我都无法通过。我试过用

忽略控制台应用程序中的Web浏览器SSL安全警报

我正在创建一个能够远程捕获网站截图的控制台应用程序。 一切都在工作,除了我无法避免证书错误。 每次我收到弹出消息,我都无法通过。

我试过用:

ServicePointManager.ServerCertificateValidatiOnCallback= new RemoteCertificateValidationCallback(ValidateServerCertificate);

但它不起作用。 还尝试了这里找到的解决方案: http : //www.codeproject.com/Articles/31163/Suppressing-Hosted-WebBrowser-Control-Dialogs但是它似乎不适用于从控制台应用程序调用的webbrowser。

有任何想法吗?

webbrowser控件使用WinInet作为其网络堆栈。 设置ServerCertificateValidationCallback对WinInet没有影响。

要处理证书错误,您需要实现IHttpSecurity服务并根据请求传递给webbrowser。 webbrowser通过ActiveX主机上实现的IServiceProvider查询主机服务。 假设您使用的是Windows窗体,则需要执行以下操作:

示例代码:

public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.ToString() == "about:blank") { //create a certificate mismatch webBrowser1.Navigate("https://74.125.225.229"); } } } [Guid("6D5140C1-7436-11CE-8034-00AA006009FA")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [ComImport] public interface UCOMIServiceProvider { [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int QueryService( [In] ref Guid guidService, [In] ref Guid riid, [Out] out IntPtr ppvObject); } [ComImport()] [ComVisible(true)] [Guid("79eac9d5-bafa-11ce-8c82-00aa004ba90b")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IWindowForBindingUI { [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int GetWindow( [In] ref Guid rguidReason, [In, Out] ref IntPtr phwnd); } [ComImport()] [ComVisible(true)] [Guid("79eac9d7-bafa-11ce-8c82-00aa004ba90b")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IHttpSecurity { //derived from IWindowForBindingUI [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int GetWindow( [In] ref Guid rguidReason, [In, Out] ref IntPtr phwnd); [PreserveSig] int OnSecurityProblem( [In, MarshalAs(UnmanagedType.U4)] uint dwProblem); } public class MyWebBrowser : WebBrowser { public static Guid IID_IHttpSecurity = new Guid("79eac9d7-bafa-11ce-8c82-00aa004ba90b"); public static Guid IID_IWindowForBindingUI = new Guid("79eac9d5-bafa-11ce-8c82-00aa004ba90b"); public const int S_OK = 0; public const int S_FALSE = 1; public const int E_NOINTERFACE = unchecked((int)0x80004002); public const int RPC_E_RETRY = unchecked((int)0x80010109); protected override WebBrowserSiteBase CreateWebBrowserSiteBase() { return new MyWebBrowserSite(this); } class MyWebBrowserSite : WebBrowserSite, UCOMIServiceProvider, IHttpSecurity, IWindowForBindingUI { private MyWebBrowser myWebBrowser; public MyWebBrowserSite(MyWebBrowser myWebBrowser) :base(myWebBrowser) { this.myWebBrowser = myWebBrowser; } public int QueryService(ref Guid guidService , ref Guid riid , out IntPtr ppvObject) { if (riid ==IID_IHttpSecurity) { ppvObject= Marshal.GetComInterfaceForObject(this , typeof(IHttpSecurity)); return S_OK; } if (riid == IID_IWindowForBindingUI) { ppvObject = Marshal.GetComInterfaceForObject(this , typeof(IWindowForBindingUI)); return S_OK; } ppvObject = IntPtr.Zero; return E_NOINTERFACE; } public int GetWindow(ref Guid rguidReason , ref IntPtr phwnd) { if (rguidReason == IID_IHttpSecurity || rguidReason == IID_IWindowForBindingUI) { phwnd = myWebBrowser.Handle; return S_OK; } else { phwnd = IntPtr.Zero; return S_FALSE; } } public int OnSecurityProblem(uint dwProblem) { //ignore errors //undocumented return code, does not work on IE6 return S_OK; } } } 

终于搞清楚了。

我一直试图绕过作为控制台应用运行的无头IE浏览器的SSL证书错误( http://triflejs.org

ShengJiang提供了大部分答案,但我仍然无法使用Application.Run()因为它锁定主线程上的执行,我需要在循环中执行其他事件,同样,用消息泵实例化ApplicationContext似乎也是复杂。

一旦我得到它,答案非常简单。 只需创建一个循环并运行Application.DoEvents()

这是一些工作代码。 我简化它以适应这里发布的问题。

请确保:

  1. 您正在作为控制台应用程序项目运行。
  2. 您添加项目引用System.Windows.Forms

希望能帮助到你!

上述就是C#学习教程:忽略控制台应用程序中的Web浏览器SSL安全警报分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记

 using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace IgnoreSSLErrorBrowserConsoleApp { public class Program { [STAThread] public static void Main(string[] args) { MyWebBrowser browser = new MyWebBrowser(); browser.Navigate("about:blank"); browser.DocumentCompleted += delegate (object obj, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.ToString() == "about:blank") { // This is the SSL path where certificate error occurs browser.Navigate("https://localhost"); } }; while (browser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); // RunOtherEvents(); } } } [Guid("6D5140C1-7436-11CE-8034-00AA006009FA")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [ComImport] public interface UCOMIServiceProvider { [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int QueryService( [In] ref Guid guidService, [In] ref Guid riid, [Out] out IntPtr ppvObject); } [ComImport()] [ComVisible(true)] [Guid("79eac9d5-bafa-11ce-8c82-00aa004ba90b")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IWindowForBindingUI { [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int GetWindow( [In] ref Guid rguidReason, [In, Out] ref IntPtr phwnd); } [ComImport()] [ComVisible(true)] [Guid("79eac9d7-bafa-11ce-8c82-00aa004ba90b")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IHttpSecurity { //derived from IWindowForBindingUI [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int GetWindow( [In] ref Guid rguidReason, [In, Out] ref IntPtr phwnd); [PreserveSig] int OnSecurityProblem( [In, MarshalAs(UnmanagedType.U4)] uint dwProblem); } public class MyWebBrowser : WebBrowser { public static Guid IID_IHttpSecurity = new Guid("79eac9d7-bafa-11ce-8c82-00aa004ba90b"); public static Guid IID_IWindowForBindingUI = new Guid("79eac9d5-bafa-11ce-8c82-00aa004ba90b"); public const int S_OK = 0; public const int S_FALSE = 1; public const int E_NOINTERFACE = unchecked((int)0x80004002); public const int RPC_E_RETRY = unchecked((int)0x80010109); protected override WebBrowserSiteBase CreateWebBrowserSiteBase() { return new MyWebBrowserSite(this); } class MyWebBrowserSite : WebBrowserSite, UCOMIServiceProvider, IHttpSecurity, IWindowForBindingUI { private MyWebBrowser myWebBrowser; public MyWebBrowserSite(MyWebBrowser myWebBrowser) : base(myWebBrowser) { this.myWebBrowser = myWebBrowser; } public int QueryService(ref Guid guidService , ref Guid riid , out IntPtr ppvObject) { if (riid == IID_IHttpSecurity) { ppvObject = Marshal.GetComInterfaceForObject(this , typeof(IHttpSecurity)); return S_OK; } if (riid == IID_IWindowForBindingUI) { ppvObject = Marshal.GetComInterfaceForObject(this , typeof(IWindowForBindingUI)); return S_OK; } ppvObject = IntPtr.Zero; return E_NOINTERFACE; } public int GetWindow(ref Guid rguidReason , ref IntPtr phwnd) { if (rguidReason == IID_IHttpSecurity || rguidReason == IID_IWindowForBindingUI) { phwnd = myWebBrowser.Handle; return S_OK; } else { phwnd = IntPtr.Zero; return S_FALSE; } } public int OnSecurityProblem(uint dwProblem) { //ignore errors //undocumented return code, does not work on IE6 return S_OK; } } } } 


推荐阅读
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 本文总结了Java初学者需要掌握的六大核心知识点,帮助你更好地理解和应用Java编程。无论你是刚刚入门还是希望巩固基础,这些知识点都是必不可少的。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 本文通过基准测试(Benchmark)对.NET Core环境下Thrift和HTTP客户端的微服务通信性能进行对比分析。基准测试是一种评估系统或组件性能的方法,通过运行一系列标准化的测试来衡量其表现。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 本文介绍了Go语言中正则表达式的基本使用方法,并提供了一些实用的示例代码。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文将深入探讨 iOS 中的 Grand Central Dispatch (GCD),并介绍如何利用 GCD 进行高效多线程编程。如果你对线程的基本概念还不熟悉,建议先阅读相关基础资料。 ... [详细]
  • python模块之正则
    re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ... [详细]
  • 介绍如何使用 `document.createElementNS` 方法创建带有特定命名空间 URI 和限定名称的元素。 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • Spring 切面配置中的切点表达式详解
    本文介绍了如何在Spring框架中使用AspectJ风格的切面配置,详细解释了切点表达式的语法和常见示例,帮助开发者更好地理解和应用Spring AOP。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
author-avatar
mobiledu2502861137
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有