小编Ive*_*Ive的帖子

SslStream.AuthenticateAsClient() 使用未缓存的 CRL 非常慢

我连接的服务器最近更改了它的 SSL 证书。自更改以来,SSL 身份验证在下载证书吊销列表时需要超过 10 秒才能完成。

我正在使用RemoteCertificateChainCallback来验证证书,但是在调用回调之前会发生延迟,因此导致延迟的不是证书链的构建或任何其他操作

仅当 CRL 未缓存时才会出现此问题,即我需要删除 CRL 缓存(Documents&settings/[user]AppData/Microsoft/CertificateUrlCache或类似内容)以在一天内多次重现它。

如果我在 AuthenticateAsClient() 调用中禁用 CRL 检查,则身份验证很快。

使用网络嗅探器,我可以看到,最终请求 CRL,它几乎立即下载,因此延迟不是网络延迟(至少不是 CRL 服务器)。

我在网络嗅探器中看到的一件奇怪的事情是,在从服务器检索初始 SSL 证书后,在下载 CRL 之前有 5 秒的延迟。**

有没有人对这个阶段可能发生的事情有任何建议,延迟可能是由什么引起的?

谢谢!

更新:好的,我已经使用反射器和内存分析器进行了深入研究。身份验证为客户端。看起来大部分时间都花在构建证书链上,即:

if (!CAPISafe.CertGetCertificateChain(hChainEngine, pCertContext, ref pTime, invalidHandle, ref cert_chain_para, dwFlags, IntPtr.Zero, ref ppChainContext))
Run Code Online (Sandbox Code Playgroud)

如果我不请求 CRL 验证,那么它几乎立即返回,启用 CRL 检查,大约 4 秒。

我怀疑如果我手动尝试在我的 RemoteCertificateValidationCallback 中构建链,我会看到同样的延迟。

如果 CRL 被缓存,这不会真正成为问题,但是这种缓存似乎不适用于 Windows7 客户。为什么??好吧,我想这是下一个任务......

谁能解释一下是什么导致链构建需要这么长时间?

c# ssl .net-3.5

5
推荐指数
1
解决办法
2363
查看次数

通过SSLStream发送数据时的数据包碎片

当使用SSLStream到数据的"大"的块(1微克)发送到(已经认证)客户端,分组分段/ dissasembly我看到是FAR使用正常的NetworkStream当大于.

在客户端上使用异步读取(即BeginRead()),重复调用ReadCallback,使用完全相同大小的数据块直到最终数据包(数据的其余部分).对于我发送的数据(它是一个zip文件),段的长度恰好是16363个字节.注意:我的接收缓冲区比这大得多,改变它的大小没有任何影响

据我所知,SSL以不超过18Kb的块加密数据,但由于SSL位于TCP之上,我不认为SSL块的数量与TCP数据包碎片有任何关联吗?

从本质上讲,客户端完全读取数据的时间比使用标准NetworkStream要长20倍(都在localhost上!)

我错过了什么?


编辑:

我开始怀疑SSLStream的接收(或发送)缓冲区大小是有限的.即使我使用同步读取(即SSLStream.Read()),也不再有可用的数据,无论我在尝试读取之前等待多长时间.这与我将接收缓冲区限制为16363字节的行为相同.设置底层NetworkStream的SendBufferSize(在服务器上)和ReceiveBufferSize(在客户端上)无效.

.net sockets sslstream

5
推荐指数
1
解决办法
1620
查看次数

针对MONO运行时导致Xamarin构建失败

在Xamarin Studio中创建一个简单的.NET控制台应用程序后,如果默认的Target Runtime设置为"Microsoft .NET",我可以构建/调试.

如果我将运行时设置为MONO('Mono 4.0.1'),那么我的项目就不再构建了.

错误是:

错误:未知的MSBuild失败.请再次尝试构建项目

构建输出窗口显示直到最后一行的所有内容,显示 Build:1 error,0 warnings ":

以这种方式定位MONO Runtime无效吗?这里的一个相关问题表明它是......

我究竟做错了什么?

运行Windows7(64位),Xamarin Studio 5.9.Mono 4.0.1,.NET 4.5

构建输出如下:

清洁解决方案:XamarinTest(调试)

清洁:XamarinTest(调试)

建立于05/08/2015 16:57:03开始.__________________________________________________项目"C:\ Development\Test\XamarinTest\XamarinTest\XamarinTest.csproj"(清除目标):目标CoreClean:删除文件'C:\ Development\Test\XamarinTest\XamarinTest\obj\Debug.NETFramework,Version = v4.5.AssemblyAttribute.cs'删除文件'C:\ Development\Test\XamarinTest\XamarinTest\bin\Debug\XamarinTest.dll.mdb'删除文件'C:\ Development\Test\XamarinTest\XamarinTest\bin\Debug\XamarinTest.dll'删除文件'C:\ Development\Test\XamarinTest\XamarinTest\obj\Debug\XamarinTest.dll'删除文件'C:\ Development\Test\XamarinTest\XamarinTest\obj\Debug\XamarinTest.dll.mdb '删除文件'C:\ Development\Test\XamarinTest\XamarinTest\obj\Debug\XamarinTest.csproj.FilesWrittenAbsolute.txt'完成构建项目"C:\ Development\Test\XamarinTest\XamarinTest\XamarinTest.csproj".

构建成功.0错误0警告

时间流逝00:00:00.1350135

清理:XamConsole(调试)

建立于05/08/2015 16:57:04开始.__________________________________________________项目"C:\ Development\Test\XamarinTest\XamConsole\XamConsole.csproj"(清除目标):目标CoreClean:删除文件'C:\ Development\Test\XamarinTest\XamConsole\obj\Debug\XamConsole.exe '完成构建项目"C:\ Development\Test\XamarinTest\XamConsole\XamConsole.csproj".

构建成功.0警告0错误

时间流逝00:00:00.0170017

构建解决方案:XamarinTest(调试)

构建:XamarinTest(调试)

建立于05/08/2015 16:57:04开始.__________________________________________________项目"C:\ Development\Test\XamarinTest\XamarinTest\XamarinTest.csproj"(构建目标):目标PrepareForBuild:配置:调试平台:AnyCPU目标GenerateSatelliteAssemblies:没有为目标GenerateSatelliteAssemblies指定输入文件,跳过.目标CoreCompile:工具C:\ Program Files(x86)\ Mono\lib\mono\4.5\mcs.exe执行以参数开头:/ noconfig/debug:full/debug +/optimize- /out:obj\Debug\XamarinTest.dll MyClass.cs Properties\AssemblyInfo.cs obj\Debug.NETFramework,Version = v4.5.AssemblyAttribute.cs/target:library/define:DEBUG/nostdlib/reference:"C:\ Program Files(x86)\ Mono\lib\mono\4.5 ..\xbuild-frameworks.NETFramework\v4.5\RedistList ........\4.5\System.dll"/ reference:"C:\ Program Files(x86)\ Mono\lib\mono\4.5 ..\xbuild-frameworks.NETFramework\v4.5\RedistList ........\4.5\System.Core.dll"/ reference:"C:\ Program Files(x86)\ …

windows mono xamarin

5
推荐指数
1
解决办法
3121
查看次数

能够通过反射分配无效的枚举值

我通过反射设置枚举值时遇到了一些奇怪的行为.好像我能够为枚举设置一个无效的值:

class EnumReflector
{
    public enum MyEnum
    {
        Option1 = 0,
        Option2,
        Option3
    }

    public MyEnum TheEnum { get; set; }

    public void Test()
    {
        PropertyInfo pi = this.GetType().GetProperty("TheEnum");
        string badValue = "1234";
        object propertyValue = Enum.Parse(pi.PropertyType, badValue, true);

        pi.SetValue(this, propertyValue, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样称呼:

        EnumReflector e = new EnumReflector();
        e.Test();
        if (e.TheEnum == EnumReflector.MyEnum.Option1 ||
            e.TheEnum == EnumReflector.MyEnum.Option2 ||
            e.TheEnum == EnumReflector.MyEnum.Option3)
        {
            Console.WriteLine("Value is valid");
        }
        else
        {
            Console.WriteLine("Value is invalid: {0} ({1})", e.TheEnum.ToString(), (int)e.TheEnum);
        }
Run Code Online (Sandbox Code Playgroud)

输出是:

价值无效:1234(1234) …

c# reflection enums

1
推荐指数
1
解决办法
701
查看次数

标签 统计

c# ×2

.net ×1

.net-3.5 ×1

enums ×1

mono ×1

reflection ×1

sockets ×1

ssl ×1

sslstream ×1

windows ×1

xamarin ×1