Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption 警报';不良记录mac';使用OpenSSL在Java应用程序和C应用程序之间进行了几分钟的正确通信之后_Encryption_Ssl_Openssl_Java_C - Fatal编程技术网

Encryption 警报';不良记录mac';使用OpenSSL在Java应用程序和C应用程序之间进行了几分钟的正确通信之后

Encryption 警报';不良记录mac';使用OpenSSL在Java应用程序和C应用程序之间进行了几分钟的正确通信之后,encryption,ssl,openssl,java,c,Encryption,Ssl,Openssl,Java,C,我们的Java应用程序在与基于C的OpenSSL端进行了几分钟的正确通信后,接收到一个可能带有坏记录的数据包,然后Java套接字关闭连接。完整的Java堆栈跟踪如下所示: javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLException: bad record MAC at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(Unknown

我们的Java应用程序在与基于C的OpenSSL端进行了几分钟的正确通信后,接收到一个可能带有坏记录的数据包,然后Java套接字关闭连接。完整的Java堆栈跟踪如下所示:

javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLException: bad record MAC
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkWrite(Unknown Source)
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source)
at java.nio.channels.Channels$WritableByteChannelImpl.write(Unknown Source)
...some internal code...
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.net.ssl.SSLException: bad record MAC
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(Unknown Source)
at java.nio.channels.Channels$ReadableByteChannelImpl.read(Unknown Source)
...some internal code...
我们从开发分支试用了Java6.0_21、6.0_25、Java7.0_79、OpenSSL 1.0.1h、1.0.1u、1.0.2j、1.1.0b和1.1.1。还尝试使用不同的密码-结果是相同的

应用程序消息大小约为20…200字节。数据包数据是正确的,问题只在于消息身份验证码


我们想确定哪一方(Java或OpenSSL)对错误负责。有人能帮我们调试通信跟踪吗?可以在此处下载带有证书的CAP文件:

数据包捕获对于调试此类问题毫无用处,因为通信是加密的,您需要提供协商密钥。您最好的办法是在两侧启动调试消息以跟踪问题


Java方面,javax.net.debug属性()是理解该问题的最佳工具。

Java日志()中也没有有用的信息。在17:14:53,由于MAC记录错误,SSL会话无效。OpenSSL日志显然告诉我们断开了连接——这是Java应用程序在遇到BRM时真正做的事情。问题是要确定是OpenSSL发送了坏的MAC还是Java应用程序错误地解码了它。通过将javax.net.debug设置为Alluntute,您可以获得更多详细的日志。将日志级别设置为所有开销(系统和观察者效应开始发挥作用)系统开始通信时速度非常慢且不稳定,因此不会出现坏的MAC在过去的周末拍摄的。在没有足够和太多之前有一个中间地带,调整调试级别可能是这里的方式。。。max debug的严重性能问题让我感到惊讶,也许机器本身有更多的错误。。。