首先是历史...
前一段时间,我使用AVM(使用Fritz!Box路由器)使用C#和家庭自动化API进行了一些实验。 这意味着我对C#和/或所应用的安全机制不是很熟悉。
可以通过从路由器的URL读取XML和JSON文档来访问API。
为此,我尝试从Fritz!Box读取XML文档:
try
{
doc = XDocument.Load(uri);
}
catch (Exception e)
{
...
}
uri
包含“ https://”和IP地址或主机名(“ fritz.box”)或外部myfritz地址。
不幸的是,路由器提供的证书是自签名证书。 Firefox仅在为该证书添加例外之后才喜欢它们。
单声道也不喜欢它。 我设法用这些额外的代码行解决了这个问题:
static int Main(string[] args)
{
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
System.Security.Cryptography.X509Certificates.X509Chain chain,
System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
return true; // ****Always accept
};
...
由于该程序将使用的唯一URL是Fritz!Box的内部IP地址或外部***。myfritz.net URL,我认为我可以接受所有证书。
该程序是使用Visual Studio 2015在Windows 7和10计算机上开发的。 之后,它在Raspberry上为Mono编译:
dmcs /r:System.Xml.Linq /r:System.Web.Extensions Fritz_AHA_JSON.cs
它使用以下命令行由cronjob每隔几分钟运行一次:
mono Fritz_AHA_JSON.exe
此解决方案在几年内效果很好。
现在已交换路由器。安装了Fritz!Box 7590型号,而不是Fritz!Box 7390。
如果我使用Firefox从Windows 10访问新路由器,则在添加证书例外之后一切都很好。
如果我从Windows 10上的Visual Studio 15中使用相同的C#代码访问路由器,一切将再次正常运行。
如果我在Raspberry Pi上使用Mono运行C#程序,证书将被拒绝。
Fehlerbeschreibung: System.Net.WebException: Error getting response stream (Write: The authentication or decryption has failed.): SendFailure ---> System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: The authentication or decryption has failed.
at Mono.Security.Protocol.Tls.RecordProtocol.ProcessAlert (AlertLevel alertLevel, AlertDescription alertDesc) [0x00000] in <filename unknown>:0
at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0
at System.Net.HttpWebRequest.GetResponse () [0x00000] in <filename unknown>:0
at System.Xml.XmlUrlResolver.GetEntity (System.Uri absoluteUri, System.String role, System.Type ofObjectToReturn) [0x00000] in <filename unknown>:0
at Mono.Xml2.XmlTextReader.GetStreamFromUrl (System.String url, System.String& absoluteUriString) [0x00000] in <filename unknown>:0
at Mono.Xml2.XmlTextReader..ctor (Boolean dummy, System.Xml.XmlResolver resolver, System.String url, XmlNodeType fragType, System.Xml.XmlParserContext context) [0x00000] in <filename unknown>:0
at System.Xml.XmlTextReader..ctor (Boolean dummy, System.Xml.XmlResolver resolver, System.String url, XmlNodeType fragType, System.Xml.XmlParserContext context) [0x00000] in <filename unknown>:0
at System.Xml.XmlReader.Create (System.String inputUri, System.Xml.XmlReaderSettings settings, System.Xml.XmlParserContext inputContext) [0x00000] in <filename unknown>:0
at System.Xml.XmlReader.Create (System.String inputUri, System.Xml.XmlReaderSettings settings) [0x00000] in <filename unknown>:0
at System.Xml.Linq.XDocument.Load (System.String uri, LoadOptions options) [0x00000] in <filename unknown>:0
at System.Xml.Linq.XDocument.Load (System.String uri) [0x00000] in <filename unknown>:0
at AVM_AHA.Program.GetSessionId (System.String URL, System.String benutzername, System.String kennwort) [0x00000] in <filename unknown>:0
在搜索解决方案时,我发现提示安装与我相同的验证回调。 我发现的另一个解决方案是
mozroots --import --ask-remove
效果不是很好:
Mozilla Roots Importer-版本3.2.8.0下载并导入受信任 Mozilla MXR的根证书。版权所有2002、2003 Motus 技术。版权所有2004-2008 Novell。 BSD许可。
从下载 'http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1'... 使用提供的信息无法检索文件。
在Raspi上安装的Mono版本是
Mono JIT编译器版本3.2.8(Debian 3.2.8 + dfsg-4 + rpi1)
问题始于更换路由器。 Raspberry Pi上没有更新。
奇怪的是,似乎没有调用我的验证回调。
我在返回Console.Writeln()
之前添加了一些true
,但在控制台上看不到任何内容。
在Windows中,我可以看到多余的行。
对我来说,这意味着问题将在验证证书之前发生。 由于我对Mono中的证书处理不太熟悉,因此我不知道在哪里寻找解决方案。