BouncyCastle .NET 自定义 TlsClient,适用于 Android 上运行的匿名 CipherSuite,但不适用于 Windows

2023-12-24

我可以访问一个使用 CipherSuite 的 java 应用程序TLS_ECDH_anon_WITH_AES_256_CBC_SHA用于通信(不可能使用另一个)。

前段时间,我不得不用 C# 编写一个 Xamarin 应用程序,它使用 Bouncy Castle PCL 成功连接到它。我不得不使用 Bouncy Castle,因为 Android(>=6.0)默认不允许使用前面提到的密码套件。

现在,我必须在 Windows 上编写一个 .NET 应用程序,它将连接到完全相同的 Java 应用程序,因此我只需复制用于建立连接的代码并从 NuGet 安装 Bouncy Castle。 TcpClient 能够建立连接,但调用protocol.Connect(new CustomTlsClient());下面的示例代码给出了异常“System.IO.IOException:内部 TLS 错误,这可能是一次攻击”。

压倒一切NotifyAlertRaised对于“CustomTlsClient”告诉我,Bouncy Castle 无法读取记录(AlertLevel:2,AlertDescription:80,消息:“无法读取记录”,异常:“Org.BouncyCastle.Crypto.Tls.TlsFatalAlert:internal_error(80) )”)。

缩短的示例代码:

...
TcpClient client = tryConnect(ip, port); // simply returns a TcpClient on success
NetworkStream targetStream = client.GetStream();
targetStream.ReadTimeout = Config.Network.TcpStreamReadTimeout;
targetStream.WriteTimeout = Config.Network.TcpStreamWriteTimeout;

TlsClientProtocol protocol = new TlsClientProtocol(targetStream, new Org.BouncyCastle.Security.SecureRandom()); 
protocol.Connect(new CustomTlsClient()); // <---- Here's the problem
...

自定义Tls客户端:

private class CustomTlsClient : DefaultTlsClient
{
    public override TlsAuthentication GetAuthentication() => new CustomTlsAuthentication();
    public override int[] GetCipherSuites() => new[] { CipherSuite.TLS_ECDH_anon_WITH_AES_256_CBC_SHA };

    public override void NotifyAlertRaised(byte alertLevel, byte alertDescription, string message, Exception cause)
    {
        // This gave me further information on the error
        base.NotifyAlertRaised(alertLevel, alertDescription, message, cause);
        Console.WriteLine("AlertLevel: " + alertLevel);
        Console.WriteLine("AlertDescription: " + alertDescription);
        Console.WriteLine("Message: " + message);
        Console.WriteLine("Exception: " + cause);
    }
}

private class CustomTlsAuthentication : TlsAuthentication
{
    public TlsCredentials GetClientCredentials(CertificateRequest certificateRequest) => null;
    public void NotifyServerCertificate(Certificate serverCertificate) { }
}

由于此代码在具有 PCL 版本 Bouncy Castle 的 Xamarin 应用程序中运行,我真的不知道我在这里做错了什么......有什么建议吗?任何帮助表示赞赏!先感谢您。


这个问题似乎是只出现在专用.NET NuGet包中的bug;卸载并安装便携式充气城堡 https://www.nuget.org/packages/Portable.BouncyCastle/相反,无需更改一行代码就解决了问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BouncyCastle .NET 自定义 TlsClient,适用于 Android 上运行的匿名 CipherSuite,但不适用于 Windows 的相关文章

  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col

随机推荐

  • 混合模式程序集是针对运行时版本“v2.0.50727”构建的,无法在 4.0 运行时中加载

    在命令行执行中运行可执行文件后出现此异常 混合模式程序集是针对运行时版本 v2 0 50727 构建的 如果没有附加配置信息 则无法在 4 0 运行时中加载 在网上搜索这个问题后 我发现解决方法之一是配置App Config文件 这在 VS
  • 如何从 .t​​xt 文件读取表格到 C++

    我想从文件中读取矩阵并在我的程序中使用它 但是当我输出结果时 它表明它读取不正确 这是代码 define I 5 define J 5 define P 2 int i j k for loops int main ifstream inF
  • 如何在 Celery 中使用气流

    我是airflow和celery的新手 现在我已经完成了dag的绘制 但是我想在同一子网中的两台计算机上运行任务 我想知道如何修改airflow cfg 一些例子可能会更好 谢谢各位的解答orz The 气流文档 https airflow
  • 多个并发程序在同一哈希键上执行读/删除操作的 Redis 行为

    我有一个程序 program 1 基于 Jedis 写入 Redis HASH KEY 1 定期进行 我还有另一个程序 program 2 单独的 JVM 进程 定期执行 并在 Redis 事务中执行以下操作 Transaction tra
  • 指令执行过程中中断

    假设 CPU 正在运行一条汇编指令 例如 FOO将在几个时钟内执行 例如 10 个 执行过程中突然出现中断请求FOO并且处理器需要中断 它是否等到命令正确执行 或者FOO已中止并将重新启动 考虑到不同类型的中断优先级 它的行为是否有所不同
  • 如何在 IE9 删除样式属性值之前获取样式属性值

    我试图在 IE9 10 删除无效值之前获取 style 属性的值 到目前为止 我已经尝试了以下所有变体 0 attributes style 0 style 0 getAttribute style 但似乎如果我尝试设置一个无效值 我将无法
  • spring hibernate乐观锁问题

    这是我的存储库层 class RepositoryImpl implements Repository Override public Serializable saveOrUpdate Object obj return getSessi
  • Node.js 加密密钥和 iv 匹配 java SecretKeySpec / IvParameterSpec

    我正在尝试将 Java 简单 加密算法移植到 Node JS 我需要能够解密 加密从 Java 端加密 解密的内容 我被困在一开始 密码的初始化 在Java中 我得到了密钥SecretKeySpec 以及初始化向量IvParameterSp
  • 当 RabbitMQ 消费者崩溃时,获取的消息会发生什么情况?

    如果我有一个 RabbitMQ 消费者批量检索 100 条消息 但在将这些消息标记为已处理之前它就崩溃了 那么这些消息是否丢失了 我希望队列中的每条消息至少被处理一次 处理在确认消息之前崩溃的消费者的推荐方法是什么 RabbitMQ 是否以
  • 如何动态更改 clr-icon 自定义元素的形状?

    In the 清晰度图标文档 https vmware github io clarity icons how to use它们表明您可以使用 shape 属性来设置图标形状 如下所示
  • 自动添加和删除成员的聊天 API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在和一个使用 telegram 应用程序发送足球比赛投注提示的人合作 他希望该群组是私有的 现在他
  • Docker如何共享资源

    我一直在研究 Docker 我从中了解到这个帖子 https stackoverflow com questions 16047306 how is docker io different from a normal virtual mac
  • Python 请求响应解码

    我使用 python requests 发送请求 然后打印响应 令我困惑的是响应中的中文字符类似于 u6570 u636e u8fd4 u56de u6210 u529f这是代码 coding utf 8 import requests u
  • 如何更改flutter包的java版本?

    我正在我的 flutter 项目的包中编辑 java 文件 但它是使用源 1 7 构建的 我该如何更改它 Flutter Channel dev 1 27 0 8 0 pre on Microsoft Windows Version 10
  • 使用 React 中的函数打开外部链接

    我正在尝试在 React 中创建一个按钮 该按钮打开指向谷歌地图网址的外部链接 我有一个函数询问用户的地理位置 一旦提供 就会将位置输入到 url 链接中 该链接获取从其地理位置到设定目的地的方向 但是 我正在努力让按钮首先运行该函数并在n
  • 测试协议与相关类型的一致性

    我有一个使用关联类型的协议 如下所示 protocol Populatable typealias T func populateWith object T 以及实现该协议的类 class DateRowType Populatable f
  • 如果我使用提供程序,如何在应用程序启动时调用方法?

    我想完成get请求服务器在启动时获取我的应用程序的数据 我阅读了几个描述如何在构建小部件后运行方法的主题 但所有这些都描述了当provider没有使用 我不确定在小部件内执行此请求是否是个好主意 我尝试了几种方法但没有成功 这是我的代码 v
  • vim中的相对数

    我注意到 vim 中关于相对数字的奇怪行为 set nu 1 2 3 4 5 6 设置相对编号 2 1 3 1 2 3 设置诺努 2 1 0 1 2 3 我问自己为什么有时我看到绝对当前行号 有时我看到 0 这是非常无用的 这种行为正常吗
  • HTTP 标头值中允许使用哪些字符?

    学习后HTTP 1 1标准 https www ietf org rfc rfc2616 txt 特别是第 31 页和相关内容 我得出的结论是任何 8 位八位字节都可以出现在 HTTP 标头值中 IE 代码在 0 255 范围内的任何字符
  • BouncyCastle .NET 自定义 TlsClient,适用于 Android 上运行的匿名 CipherSuite,但不适用于 Windows

    我可以访问一个使用 CipherSuite 的 java 应用程序TLS ECDH anon WITH AES 256 CBC SHA用于通信 不可能使用另一个 前段时间 我不得不用 C 编写一个 Xamarin 应用程序 它使用 Boun