默认
发表评论 18
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] MobileIMSDK服务端开启ssl后,微信小程序端websock连接不到
这边服务端使用springBoot集成了MobileIMSDK v6.3工程中的MobileIMSDKServer.jar。并使用工程中的server demo进行服务端的业务处理。现在有个问题,服务端不开启ssl,是可以通过ws://ip+port/websocket连接到并成功发送消息的(并于微信小程序本地不开启域名校验下已调通)。但是微信小程序要求使用wss://域名地址,所以要服务端开启ssl,但开启后出现连接不到问题(地址是通的wss://我们域名/websocket,服务端有打印建立日志,但是没有成功建立握手,被服务端close?)
服务端日志:
2024-03-19 10:08:50.331 [nioEventLoopGroup-7-1] INFO  - [IMCORE-websocket]与{uid:null}/192.168.111.201:40482的会话建立(channelActive)了...
2024-03-19 10:08:50.332 [nioEventLoopGroup-7-1] WARN  - [IMCORE-unknow]【注意】会话{uid:null}/192.168.111.201:40482被系统close了,但它里面没有存放user_id,它很可能是没有成功合法认证而被提前关闭,从而正常释放资源。。

刚开始怀疑是证书问题,但是分别使用过第三方机构颁发的SSL证书、按照《http://www.52im.net/forum.php?mo ... =4142&highlight=ssl》该篇文章中生成自签名证书、使用nettyy自带的签名证书。均出现上诉问题。

想咨询下群主大大各位老师们,有遇到过解决过这个问题吗?


即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:[已回复] 求教使用k8s部署MobileIMSDK后无法成功发送消息下一篇:[已解决] 用MobileIMSDK的Java TCP demo连接server自已给自己发消息异常
推荐方案
评论 18
你这内容格式从哪里复制来的,里面格式字符明文漏在外面,看的很难受
如果是证书的使用有问题,服务端的log4j日志中一定会有ssl方面的信息输出,比如证书有错会有异常信息,证书对的话,也会有相应的ssl握手信息输出,你仔细把日志看看,找找有价值的信息
引用:JackJiang 发表于 2024-03-19 11:13
你这内容格式从哪里复制来的,里面格式字符明文漏在外面,看的很难受

编辑框里面正常的,发出来就有字符了
引用:JackJiang 发表于 2024-03-19 11:17
如果是证书的使用有问题,服务端的log4j日志中一定会有ssl方面的信息输出,比如证书有错会有异常信息,证书 ...

我本地启动服务端,使用自签名的证书,访问wss://ip+port/websocket, debug级别日志出现以下异常。
2024-03-19 12:31:16.354 DEBUG - [IMCORE-websocket]此客户端的Channel抛出了exceptionCaught,原因是:javax.net.ssl.SSLException: Received fatal alert: certificate_unknown,可以提前close掉了哦!
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:471)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.lang.Thread.run(Thread.java:748)
Caused by: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
        at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1666)
        at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1634)
        at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1800)
        at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1083)
        at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:907)
        at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
        at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
        at io.netty.handler.ssl.SslHandler$SslEngineType$3.unwrap(SslHandler.java:282)
        at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1372)
        at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1267)
        at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1314)
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:501)
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:440)
        ... 17 common frames omitted
2024-03-19 12:31:16.356 WARN  - [IMCORE-unknow]【注意】会话{uid:null}/127.0.0.1:60191被系统close了,但它里面没有存放user_id,它很可能是没有成功合法认证而被提前关闭,从而正常释放资源。
log信息很明显: "io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown",问题应该还是出在证书上。

你的证书是哪里买的?可以搜一下证书提供者的demo,看看有没有可以用来测试的服务端java读取证明的demo代码,参考一下,至少先证明证明没问题。

开启ssl/tls加密最麻烦的就是证书的生成和制作,代码本身对于netty来说都是大差不差的标准代码,可以多找找网上的例子,对比一下看看有没有可以参考的地方。

你要是想验证netty的ssl实现情况,可以参考这个netty的官方demo代码:
1)服务端:http://docs.52im.net/extend/docs ... ackage-summary.html
2)客户端:http://docs.52im.net/extend/docs ... ackage-summary.html
引用:JackJiang 发表于 2024-03-19 15:43
log信息很明显: "io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal  ...

在我本地的这个自签名证书,是按照http://www.52im.net/forum.php?mo ... 2&highlight=ssl这篇文章参考生成的。
引用:ltt 发表于 2024-03-19 16:25
在我本地的这个自签名证书,是按照http://www.52im.net/forum.php?mod=viewthread&tid=4142&highlight=ss ...

测试自签名的证书的话,用主流浏览器端或别的客户端去测,排除微信客户端的问题
引用:JackJiang 发表于 2024-03-19 19:49
测试自签名的证书的话,用主流浏览器端或别的客户端去测,排除微信客户端的问题

有用主流浏览器测试,一样的问题。包括我用MobileIMSDK demo中的证书,也是报下面的错误
Caused by: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
        at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1666)
        at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1634)
        at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1800)
        at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1083)
        at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:907)
        at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
        at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
        at io.netty.handler.ssl.SslHandler$SslEngineType$3.unwrap(SslHandler.java:282)
        at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1372)
        at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1267)
        at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1314)
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:501)
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:440)
        ... 17 common frames omitted
引用:ltt 发表于 2024-03-20 11:33
有用主流浏览器测试,一样的问题。包括我用MobileIMSDK demo中的证书,也是报下面的错误
Caused by: jav ...

你把你服务端的证书都截图出来,我看看你放置的目录位置,以及代码中的配置,看看是否是文件路径不对。

另外,你这log前后的信息都可以贴出来,异常信息通常可能不只有这一个
引用:JackJiang 发表于 2024-03-20 12:09
你把你服务端的证书都截图出来,我看看你放置的目录位置,以及代码中的配置,看看是否是文件路径不对。
...

完整的日志:
2024-03-20 12:25:16.972 INFO  - [IMCORE-websocket]与{uid:null}/127.0.0.1:57726的会话建立(channelActive)了...
2024-03-20 12:25:17.013 DEBUG - [IMCORE-websocket]此客户端的Channel抛出了exceptionCaught,原因是:javax.net.ssl.SSLException: Received fatal alert: certificate_unknown,可以提前close掉了哦!
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:471)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.lang.Thread.run(Thread.java:748)
Caused by: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
        at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1666)
        at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1634)
        at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1800)
        at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1083)
        at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:907)
        at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
        at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
        at io.netty.handler.ssl.SslHandler$SslEngineType$3.unwrap(SslHandler.java:282)
        at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1372)
        at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1267)
        at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1314)
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:501)
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:440)
        ... 17 common frames omitted
2024-03-20 12:25:17.014 WARN  - [IMCORE-unknow]【注意】会话{uid:null}/127.0.0.1:57726被系统close了,但它里面没有存放user_id,它很可能是没有成功合法认证而被提前关闭,从而正常释放资源。
引用:JackJiang 发表于 2024-03-20 12:09
你把你服务端的证书都截图出来,我看看你放置的目录位置,以及代码中的配置,看看是否是文件路径不对。
...

这是使用demo里的证书路径。 [已回复] MobileIMSDK服务端开启ssl后,微信小程序端websock连接不到_微信图片_20240320123202.png 这是自签名的证书路径。 [已回复] MobileIMSDK服务端开启ssl后,微信小程序端websock连接不到_微信截图_202403201234251.png
另外我使用netty自带证书也是同样的问题,都是提示Received fatal alert: certificate_unknown [已回复] MobileIMSDK服务端开启ssl后,微信小程序端websock连接不到_微信截图_20240320123546.png
引用:ltt 发表于 2024-03-20 12:37
这是使用demo里的证书路径。这是自签名的证书路径。。
另外我使用netty自带证书也是同样的问题,都是提 ...

看你的这些信息,这太诡异了,包括netty官方的这个demo在内,我测过不下几十遍,都没问题。
所以,你还有没有办法搞到别人的一些证书使用例子代码,看看你这客户端和服务端的环境下,到底能不能玩。
我已经想不出来你这到底是什么问题了。。。

今天有个RainbowChat的客户反馈说,他买的正规证书,里面带的私钥.key证书直接用(不需要生成.pk8格式)也行了。你看看你的证书会不会也有类似的情况
引用:JackJiang 发表于 2024-03-20 15:30
看你的这些信息,这太诡异了,包括netty官方的这个demo在内,我测过不下几十遍,都没问题。
所以,你还 ...

是的,太诡异了。开始怀疑是集成问题,但我本地直接用MobileIMSDK server demo src 项目,开启ssl后,也是同样问题
也拿正规的证书进行过验证,也是这个错误,很崩溃
我再试试看看
引用:ltt 发表于 2024-03-20 15:44
是的,太诡异了。开始怀疑是集成问题,但我本地直接用MobileIMSDK server demo src 项目,开启ssl后,也 ...

嗯,搞证书搞加密本身是比较折腾的,多找找别人的demo验证验证,找找线索
引用:JackJiang 发表于 2024-03-20 15:30
看你的这些信息,这太诡异了,包括netty官方的这个demo在内,我测过不下几十遍,都没问题。
所以,你还 ...

我是服务端使用websock,客户端使用h5。我理解很简单的模式,只需要服务端配置证书就行,客户端是不要配置的,使用h5 websock进行验证的,就很奇怪
引用:ltt 发表于 2024-03-20 15:52
我是服务端使用websock,客户端使用h5。我理解很简单的模式,只需要服务端配置证书就行,客户端是不要配 ...

是的,客户端就https、wss协议头就行。主要是,现在的主流浏览器在你的证书不合规的情况下,可能会对wss进行一些限制,这个就要具体分析了
引用:JackJiang 发表于 2024-03-20 20:01
是的,客户端就https、wss协议头就行。主要是,现在的主流浏览器在你的证书不合规的情况下,可能会对wss ...

功能时间有限,暂先不解决这个问题。我是否可以通过配置nginx来处理sll证书,然后转发服务端不带ssl来解决这个问题呢
引用:ltt 发表于 2024-03-21 13:15
功能时间有限,暂先不解决这个问题。我是否可以通过配置nginx来处理sll证书,然后转发服务端不带ssl来解 ...

用nginx可以,有人就是这么玩的
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部