身份验证或解密失败

时间:2019-01-04 21:41:58

标签: c# mono certificate raspbian

首先是历史...

前一段时间,我使用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中的证书处理不太熟悉,因此我不知道在哪里寻找解决方案。

0 个答案:

没有答案