前几天在做一个使用URL通过WebRequest请求HTML页面的功能的时候遇到了点坑,程序在开发环境没有任何的问题,部署到linux mono上之后就跪了。代码如下:
1 | public static string GetHTML(string url) |
开发环境在Windows10 + VS2013,整个代码跑起来没什么问题。
无论是HTTP还是HTTPS协议,网页HTML一样能获取得到。
网站部署到linux Jexus之后HTTP协议的网站同样可以获取到HTML,遇到HTTPS协议的网站的时候就跪了。
抓到的异常信息如下:
1 | System.Net.WebException: Error: TrustFailure (The authentication or decryption has failed.) |
有空的信息基本就是:
- Invalid certificate received from server
- The authentication or decryption has failed
一开始百思不得其解,为嘛好好的程序在开发环境跑得都好的,到了mono上就挂了,多疑的我还以为是mono的bug。
今天静下心来去找了一下资料,发现Mono的文档有这个问题的描述,认真读了一遍,又去请教了一番宇内流云大大,终于弄懂了是什么回事。
先贴一下相关资料:
这个问题是出现的原因是Windows自带了HTPPS的根证书,linux默认则是没有带有根证书的。我们的mono在调用WebRequest去请求HTTPS协议的网站的时候,抛出上上面的异常了。
解决方案也很简单,为linux导入一下HTTPS根证书就好。
在linux服务器上面执行下面这条命令。1
mozroots --import --ask-remove --machine
然后在网站的Application_Start()里面添加下面代码:
1 | System.Net.ServicePointManager.ServerCertificateValidationCallback += |
完事。
这个故事告诉我们,linux干活都是要亲力亲为呀。