Shadowsocks 4.1.5 (Windows client)
Windows 7 64 bit
.NET Framework 4.7.2
client 不再报"[E] decryption error"
能正常使用负载均衡功能
client 在多服务器自动切换模式中频繁报出"[E] decryption error"
只能手动切换服务器。负载均衡功能无法使用。
若选择自动切换,虽然仍可上网,但页面常常需要F5刷新才能加载完整
若手动选择服务器则无这个问题。
除频繁出现的[E] decryption error 外无其他信息。
你好,请问是否你的某个服务器有使用插件?
所有服务器均为shadowsocks-libev默认配置。没有使用混淆,没有任何插件。客户端的配置里也只有端口,服务器地址和密码,插件相关field均为空
有点奇怪,我招了三个不同IP的SS服务器,测试了一下,并没有出现这样的错误。
请问你的三个服务器使用的是相同的加密算法和密码,还是各有不同呢?

三个服务器均使用chacha20-ietf-poly1305,但密码各不相同。
我这儿三个都是chacha20-ietf,但是密码一样。
这种情况有可能和你的某个服务器有关?能否排除法,ABC三个服务器,AC一组,AB一组,BC一组分开测试,看看哪一组会出问题?
测试结果如下:
(测试方法:播放youtube视频,刷新youtube.com界面)
相信不是我的服务器的问题。
请问你有其他的计算机可以测试一下吗?
如果其他的服务器也有插件需求,那么可能在“负载均衡”的情况下,其他非活跃服务器都没有相应的插件被启动,导致连接异常。
换了一台windows 10,症状相同。配置里放了两个服务器。分别选中没有问题;开启负载均衡就出现decryption error. 重申:我用的所有的服务器都没有配置插件,加密算法均为chacha20-ietf-poly1305,但密码各不相同。估计把服务器密码全部改成一样的就能解决问题--但this is an ugly fix.
由于测试环境限制(我只用有自己的一台服务器和某机场的一组服务器),目前我进行的测试情况如下:
两台端口、密码、加密方式相同(chacha20-ietf),但IP不同的服务器;以及一台IP、端口、密码、加密方式(aes-256-gcm)不同,且外加GoQuite插件混淆的服务器。
在这种情况下,总计三台服务器可以很平滑的工作在负载均衡模式,没有问题。

测试环境受限,请谅解。
bug可能只限于chacha20-ietf密码不同的情况?
我想问一下,你的操作系统具体版本是什么?可以执行winver命令进行查看。
Windows 7 企业版;Microsoft Windows 版本6.1 (内部版本7601:Service Pack 1)
我在Win7上也测试了一下,基于上面的服务器情况,未遇到任何问题……
补丁都打齐了把?
当然……我在两台不同的电脑上(win7;win10)都试过了,完全一样的症状。
闲着无事,装上了visual studio,debug试试。通过vs build出的客户端状况还是相同;选中单一服务器日志(shadowsocks.log)中无"[E] decryption error", 选择高可用/负载均衡则会出现“[E] decryption error"
试着进入TCPRelay.cs 进行以下修改以获取更多信息:(第826行)
原代码:
try
{
_encryptor.Decrypt(_remoteRecvBuffer, bytesRead, _remoteSendBuffer, out bytesToSend);
}
catch (CryptoErrorException)
{
Logging.Error("decryption error");
Close();
return;
}
新代码:
try
{
_encryptor.Decrypt(_remoteRecvBuffer, bytesRead, _remoteSendBuffer, out bytesToSend);
}
catch (CryptoErrorException e)
{
Logging.Error("decryption error: " + e.Message);
Close();
return;
}
}
如此,再运行进行测试后,log中出现的错误信息为:
[2019-03-27 16:06:29] [D] get salt len 32
[2019-03-27 16:06:29] [E] decryption error: ret is 0
[2019-03-27 16:06:29] [D] _addrBufLength=18
[2019-03-27 16:06:29] [D] _addrBufLength=18
[2019-03-27 16:06:30] [D] _addrBufLength=18
[2019-03-27 16:06:30] [D] _firstPacketLength = 594
[2019-03-27 16:06:30] [D] ---Start Encryption
[2019-03-27 16:06:30] [D]
Salt:...
[2019-03-27 16:06:30] [D] get salt len 32
[2019-03-27 16:06:30] [E] decryption error: ret is 0
[2019-03-27 16:06:30] [D] _addrBufLength=18
[2019-03-27 16:06:30] [D] _firstPacketLength = 223
[2019-03-27 16:06:30] [D] ---Start Encryption
[2019-03-27 16:06:30] [D]
Salt:....
发现所有的[E] decryption error 都以" [E] decryption error: ret is 0 "的形式出现。
我打算加几个breakpoint获取更多信息。
没写过C#,随便折腾……请见谅

在Exception的Constructor上添了断点。只要选中了某个服务器,程序断点就不会被触发。一旦选择高可用/负载均衡就开始丢exception了……
查看了断点被触发时的callstack。每一次都是从AEADOpenSSLEncryptor.cs的第136行丢出的。即此处:
// For AEAD cipher, it should not output anything
ret = OpenSSL.EVP_CipherFinal_ex(_decryptCtx, plaintext, ref tmpLen);
if (ret <= 0)
{
// If this is not successful authenticated
throw new CryptoErrorException(String.Format("ret is {0}", ret));
}
if (tmpLen > 0)
{
throw new System.Exception("openssl: fail to finish AEAD");
}
也就是说EVP_CipherFinal_ex的返回值为0。
我差不多也只能做到这种程度了,望大神解惑。
在上述位置设了断点,被触发时callstack如下

@celeron533
我把所有服务器密码改成同一个之后就没有任何报错了。(confirming my previous guess that this would be a fix, albeit ugly)
Will this bug be fixed?
@wongsyrone I'm using High Avaibility Strategy and it seems that it does happen when switching between servers is there is a fix for that?
Strategy settings have been removed.