Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >MQTTnet :无法连接TLS : Interop+AppleCrypto+SslException:坏协议版本

MQTTnet :无法连接TLS : Interop+AppleCrypto+SslException:坏协议版本
EN

Stack Overflow用户
提问于 2020-10-02 09:35:48
回答 3查看 1.8K关注 0票数 1

我是一个新的.NET核心用户,试图学习如何使用MQTTnet将托管客户端与MacOS Catalina上的TLS连接起来。

我正在尝试连接从ASP.NET核心3后台服务到一个莫斯基托经纪人。使用MqttExplorer,我能够使用用户名、密码和服务器证书(CA)文件成功地通过TLS连接到服务器。所以,我知道莫斯基托经纪人配置正确。

但是,我无法用MQTTnet实现这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using (var fileStream = new FileStream(_Config.Tls.CACerts, FileMode.Open))
                using (var memoryStream = new MemoryStream((int)fileStream.Length))
                {
                    fileStream.CopyTo(memoryStream);

                    _Logger.LogInformation($"Read file stream with length {memoryStream.Length} bytes, trying to connect with options:");
                    _Logger.LogInformation($"mqtt://{_Config.UserName}:{_Config.Password}/{_Config.Host}:{_Config.Port}");

                    _MqttOptions = new ManagedMqttClientOptionsBuilder()
                        .WithAutoReconnectDelay(TimeSpan.FromSeconds(5))
                        .WithClientOptions(new MqttClientOptionsBuilder()
                            .WithClientId(Guid.NewGuid().ToString())
                            .WithCredentials(_Config.UserName, _Config.Password)
                            .WithTcpServer(_Config.Host, _Config.Port)
                            .WithTls(
                                o =>
                                {
                                    o.UseTls = true;
                                    o.AllowUntrustedCertificates = true;
                                    o.SslProtocol = SslProtocols.Tls12;
#if WINDOWS_UWP
                                    o.Certificates = new List<byte[]>
                                    {
                                        new X509Certificate(memoryStream.ToArray()).Export(X509ContentType.Cert)
                                    };
#else
                                    o.Certificates = new List<X509Certificate>
                                    {
                                        new X509Certificate(memoryStream.ToArray())
                                    };
#endif

                                    o.CertificateValidationHandler = (context) =>
                                    {
                                        _Logger.LogInformation($"SSL POLICY ERRORS {context.SslPolicyErrors.ToString()}");
                                        return true;
                                    };
                                }
                            )
                            .Build())
                        .Build();
                }

我收到以下例外情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MQTTnet.Exceptions.MqttCommunicationException: Authentication failed, see inner exception.
 ---> System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception.
 ---> Interop+AppleCrypto+SslException: bad protocol version
   --- End of inner exception stack trace ---
   at System.Net.Security.SslStream.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, ExceptionDispatchInfo exception)
   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.PartialFrameCallback(AsyncProtocolRequest asyncRequest)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Security.SslStream.ThrowIfExceptional()
   at System.Net.Security.SslStream.InternalEndProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.Security.SslStream.EndProcessAuthentication(IAsyncResult result)
   at System.Net.Security.SslStream.EndAuthenticateAsClient(IAsyncResult asyncResult)
   at System.Net.Security.SslStream.<>c.<AuthenticateAsClientAsync>b__64_2(IAsyncResult iar)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
   at MQTTnet.Implementations.MqttTcpChannel.ConnectAsync(CancellationToken cancellationToken)
   at MQTTnet.Implementations.MqttTcpChannel.ConnectAsync(CancellationToken cancellationToken)
   at MQTTnet.Internal.MqttTaskTimeout.WaitAsync(Func`2 action, TimeSpan timeout, CancellationToken cancellationToken)
   at MQTTnet.Adapter.MqttChannelAdapter.ConnectAsync(TimeSpan timeout, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at MQTTnet.Adapter.MqttChannelAdapter.WrapException(Exception exception)
   at MQTTnet.Adapter.MqttChannelAdapter.ConnectAsync(TimeSpan timeout, CancellationToken cancellationToken)
   at MQTTnet.Client.MqttClient.ConnectAsync(IMqttClientOptions options, CancellationToken cancellationToken)
>> [2020-10-02T16:07:03.9254330Z] [4] [MqttClient] [Verbose]: Disconnecting [Timeout=00:00:10]
>> [2020-10-02T16:07:03.9255750Z] [4] [MqttClient] [Verbose]: Disconnected from adapter.
>> [2020-10-02T16:07:03.9256240Z] [4] [MqttClient] [Info]: Disconnected.

此外,还明确地尝试将WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311)添加到客户端选项生成器中。

有人能帮忙吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-10-05 07:06:13

设法让它起作用了!

问题是蚊子经纪人被配置成只使用Tls v1.3。但是,对于dotnet核心3.1tls1.3,macOS环境似乎不支持吗?如果OpenSSL1.1.1可用,它就可以在Linux环境中使用。

我已经降级了蚊帐代理配置,使用tls版本1.2,上面的代码现在连接。

如果有人已经设法获得一个dotnet核心3.1客户端连接到蚊帐经纪人使用tlsv1.3,那么任何细节将不胜感激。

票数 1
EN

Stack Overflow用户

发布于 2020-10-03 14:13:02

github上也有类似的问题。

作为解决办法,一个用户建议如下cli命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet dev-certs https
dotnet dev-certs https --trust

关于他们的一些文档。

信任Windows和macOS上的macOS核心HTTPS开发证书

安装.NET Core会将ASP.NET Core开发证书安装到本地用户证书存储区。证书已安装,但不受信任。若要信任证书,请执行一次性步骤以运行dotnet dev-certs工具:

票数 0
EN

Stack Overflow用户

发布于 2022-05-24 00:31:31

通过Google登陆这里,因为我在本地调试时出现了以下错误(Rangeand.NET 6webapi)

System.IO.IOException:解密操作失败,请参阅内部异常。-> Interop+AppleCrypto+SslException: misc.不良证书

我试过了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet dev-certs https
dotnet dev-certs https --trust

但没有运气。

最终帮助我找到浏览器中本地运行api的URL时,我收到了一条“警告:潜在的安全风险”消息。在单击“高级->接受风险并继续”之后,我的呼叫成功了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64175979

复制
相关文章
TLS协议分析 (三) record协议
record协议做应用数据的对称加密传输,占据一个TLS连接的绝大多数流量,因此,先看看record协议 图片来自网络:
用户8964349
2021/09/06
1.4K0
TLS握手协议详解
握手协议是TLS握手协议的一部分,负载生成共享密钥以及交换证书。其中,生成共享密钥是为了进行密码通信,交换证书是为了通信双方相互进行认证。
用户9407507
2022/02/16
1.3K0
TLS协议学习笔记
说起TLS(Transport Layer Security 传输层安全协议),可能有点陌生,但是说起HTTPS,大家应该都知道,我们现在浏览网页基本上都是HTTPS的。HTTPS就是加密的HTTP,HTTP基于明文传播,直接使用HTTP的话内容很容易被窃取。HTTPS则对内容进行了一层加密,避免了内容被窃取和篡改的可能性,如下图所示。
roper
2018/07/02
2.4K1
TLS协议学习笔记
mqttnet 详解_mqttnet3.0用法
1 ///开源库地址:https://github.com/chkr1011/MQTTnet
全栈程序员站长
2022/09/12
1K0
图解TLS握手连接
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
半月弧
2020/03/03
5.4K0
图解TLS握手连接
TLS协议分析 (四) handshake协议概览
TLS 1.3对握手做了大修改,下面先讲TLS 1.2,讲完再介绍一下分析TLS 1.3.
用户8964349
2021/09/07
1.5K0
TLS协议分析 (六) handshake协议扩展
在 ChangeCipherSpec 消息之后,应该立即发送 Finished 消息,来确认密钥交换和认证过程已经成功了。ChangeCipherSpec 必须在其它握手消息和 Finished 消息之间。
用户8964349
2021/09/07
1.3K0
DTLS协议介绍,Udp协议基于TLS
UDP协议是不面向连接的不可靠协议,且没有对传输的报文段进行加密,不能保证通信双方的身份认证、消息传输过程中的按序接收、不丢失和加密传送。
Kunkka Wu
2022/01/13
3.1K0
DTLS协议介绍,Udp协议基于TLS
mqttnet 详解_mqttnet 简记
1.mqttnet开源库,https://github.com/chkr1011/MQTTnet
全栈程序员站长
2022/09/12
3K0
MQTTnet[通俗易懂]
近期学习了一下物联网中应用较广的MQTT协议,同时使用MQTTnet开源类库做了简单实现,因此做下笔记。 环境:.NET Framework 4.6.1 MQTTnet 2.8.2.0 遵循MQTT 3.1.0协议规范 源码 >>> GitHub 注意:在实现订阅者离线再连接时,一直接受不到离线信息,需要做一下配置
全栈程序员站长
2022/09/12
7970
mqttnet 详解_MQTT MQTTnet 实现
│ │ ├── MQTTServer.runtimeconfig.dev.json
全栈程序员站长
2022/09/12
9210
检查网站的TLS版本
有时候需要知道某个网站支持的TLS的版本。现在SSL 2.0和SSL 3.0都已经被淘汰了。其中TLS 1.0,TLS 1.1,TLS 1.2是目前的的主流,相对也是安全的。主要看加密的算法。TLS 1.3是目前最新的协议版本,也是相对最安全的版本了。
宋天伦
2023/10/21
4.4K0
检查网站的TLS版本
轻量通讯协议 --- MQTT
「MQTT(Message Queuing Telemetry Transport)」 是一种轻量级的消息传输协议,通常用于在物联网(IoT)和传感器网络中进行通信。它设计用于在低带宽、不稳定或高延迟的网络环境下传输数据,因此非常适用于连接设备之间的通信,尤其是在资源有限的环境中。
Niuery Diary
2023/10/22
4.1K0
轻量通讯协议 --- MQTT
TLS加密远程连接Docker
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
程序员欣宸
2019/09/18
2.1K0
TLS加密远程连接Docker
如何建立TLS连接?TLS握手失败可能这个原因!
签前面三个案例里的HTTP都没加密,使排查工作省去不少麻烦,抓包文件里直接就看清应用层信息。
JavaEdge
2023/07/25
1.4K0
如何建立TLS连接?TLS握手失败可能这个原因!
mqttnet 详解_MQTTnet 3.0.5学习笔记
段时间在使用MQTTnet,都说这个东西比较好,可是翻了翻网上没有例子给参考一下。
全栈程序员站长
2022/09/12
1.1K0
golang简单tls协议用法完整示例
本文实例讲述了golang简单tls协议用法。分享给大家供大家参考,具体如下: 生成私钥: openssl genrsa -out key.pem 2048 生成证书: openssl req -new -x509 -key key.pem -out cert.pem -days 3650 https: package main import ( "io" "net/http" "log" ) func HelloServer(w http.ResponseWrite
李海彬
2018/03/27
3.8K0
golang简单tls协议用法完整示例
本文实例讲述了golang简单tls协议用法。分享给大家供大家参考,具体如下: 生成私钥: openssl genrsa -out key.pem 2048 生成证书: openssl req -new -x509 -key key.pem -out cert.pem -days 3650 https: package main import ( "io" "net/http" "log" ) func HelloServer(w http.ResponseWriter, req *
李海彬
2018/03/26
3.3K0
SSL / TLS 协议运行机制详解
本文简要介绍SSL/TLS协议的运行机制。文章的重点是设计思想和运行过程,不涉及具体的实现细节。如果想了解这方面的内容,请参阅RFC文档。
Java技术栈
2018/07/30
8130
SSL / TLS 协议运行机制详解
点击加载更多

相似问题

MQTTNET连接

169

MQTTnet TLS 1.2加密服务器

114

Java弹跳城堡TLS协议版本顺序?

212

TLS 1.2 -警报级别-致命-描述协议版本

11

SSL/TLS协议版本回退机制

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文