当前位置: 首页 > 知识库问答 >
问题:

c#->TLS上的Kafka:“收到的消息意外或格式错误”

郤立果
2023-03-14

我试图连接到Kafka,从C#client启用TLS,在调用sslStream时出现异常“收到的消息意外或格式错误”。authenticatesClient()。不幸的是,到目前为止,互联网上的帖子都没有帮助我解决这个问题。你知道会出什么问题吗?

下面是我用来启动连接的最小样本C#代码

namespace test_tls {
    class Program {
        static string clientCertificateFile = "C:\\Temp\\<CLIENT_CERTIFICATE_FILE>.crt";
        static X509Certificate2 clientCertificate = new X509Certificate2(clientCertificateFile);

        static void Main(string[] args) {
            var clientCertificateCollection = new X509Certificate2Collection(new X509Certificate2[] { clientCertificate });

            try {
                using( var client = new TcpClient("<IP_ADDRESS>", 9093) )
                using( var sslStream = new SslStream(client.GetStream(), false, CertificateValidator) ) {

                    sslStream.AuthenticateAsClient("<TARGET_HOST_NAME_AS_IN_THE_CERTIFICATE>",
                        clientCertificateCollection, SslProtocols.Tls, false);

                    //send/receive from the sslStream
                }
            }
            catch( Exception e ) {
                Console.Out.WriteLine(e);
                Console.Out.WriteLine("\n\n\nPress ENTER to exit");
                Console.In.ReadLine();
            }
        }

        static bool CertificateValidator(Object sender, 
                X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) {
            if( sslPolicyErrors == SslPolicyErrors.None ) {
                return true;
            }
            if( sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors ) {
                //we don't have a proper certificate tree
                return true;
            } 
            return false;
        }
    }
}

共有1个答案

尉迟正平
2023-03-14

经过一番挖掘,似乎错误信息绝对具有误导性,问题的根本原因是连接过程中丢失了“客户端证书私钥”。

X509证书2应该使用这种方式加载

string clientCertificateFile = "C:\\path\\to\\my.certificate.pfx";
X509Certificate2 clientCertificate = new X509Certificate2(clientCertificateFile, "<password>");

或者从本地证书存储(应该使用私钥导入)

X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = store.Certificates.Find(X509FindType.FindBySubjectName, "<Certificate 'Issued To' name>", false)[0];

注意:如果您的证书和私钥位于不同的文件中,则可以使用此命令将它们合并到PFX文件中

openssl pkcs12 -export -in my.cer -inkey my.key -out mycert.pfx
 类似资料:
  • 我使用的是PushSharp的2.1.2版本。该应用程序是。NET 4.5.1(虽然我也尝试过定位。NET 4.5和.网4) 我正在尝试通过沙箱Apple APNS发送推送消息,但没有成功。 我正在使用Ray Wenderlich的演练中提供的PHP脚本成功地发送消息,该脚本使用与我的PushSharp应用程序相同的证书并发送到相同的设备ID。 我已经通过从钥匙链导出完整的证书作为p12进行了测试

  • 我正在尝试连接到需要配置双向SSL的API。我有我在postman中配置的证书和私钥,如下图所示。 这在Postman中工作得很好,但当我尝试使用HttpClient在C#中实现它时,SSL失败了。我得到的错误是“收到的消息是意外的或格式不正确的。”。我相信这与不正确的配置有关。 我引用了这篇StackOverflow文章来实现我的代码:将私钥与中的X509Certificate2类相关联。网 以

  • 我试图解决这个问题已经有一段时间了,但我所尝试的一切都是无用的。我尝试了HttpClientHandler,但仍然得到了错误! 错误消息: 无法建立SSL连接,请参阅内部异常 身份验证失败,请参阅内部异常 收到的消息意外或格式不正确 我从零开始学习c#,而且我对c#语言非常熟悉,所以请解释一下问题所在。

  • 我使用Windows 10, Python 3.7.6.使用以下软件包: 我使用的MySQL数据库具有以下设置。该数据库是使用我公司内的IT云数据服务创建的。我下载了SSL证书并将它们放在我的django项目中。 现在,当我键入,我可以连接到数据库,一切正常。我可以看到DB支持SSL。 但是,当我键入python manage时。py runserver要启动服务器,我会遇到以下异常,我不知道如何

  • 我有一个。NET Core 3.1 C#应用程序,该应用程序通过HTTPS调用API(并将其公钥作为获取令牌的一部分,因为该证书稍后将用于解密单独发送回的信息)。在我们几乎所有的机器上,它都在工作,但是在一台Windows 8.1机器上,当我们尝试初始连接身份验证令牌时,我们会遇到以下一系列异常: 异常是从,因此我怀疑这是在HTTPS级别发生的,我们的证书内容在这里并不真正相关。 我们获取令牌的代

  • 我想使用spring-Kafka库使用spring boot配置的消费者来使用来自Kafka代理的消息,源是一个JDBC连接器,它负责从MySQL数据库提取消息,这些消息需要被使用 下面是我的application.yml文件