.Net 中的 Kafka Producer - SSL 握手失败

问题描述 投票:0回答:1

这是我第一次尝试使用 Asp.Net 控制台应用程序连接到 Kafka 服务器,遇到了很多问题。我解决了大部分问题,但无法摆脱这个问题。

我正在测试生产者部分并不断收到“SSL 握手失败”错误。我在这里遵循了一些建议,包括将 SslEndpointIdentificationAlgorithm 设置为空白。

这是我的生产者配置部分:

_producerConfig = new ProducerConfig
{
    BootstrapServers = bootstrapServer,
    EnableDeliveryReports = true,
    ClientId = Dns.GetHostAddresses(),

    //SecurityProtocol = SecurityProtocol.SaslSsl,
    SecurityProtocol = SecurityProtocol.Ssl,
    SslCaLocation = @"D:\Something\Certificate\myCert.pem",
    SslKeyPassword = "blahblah",
    SslEndpointIdentificationAlgorithm=SslEndpointIdentificationAlgorithm.None
};

...

public async Task StartSendingMessages(string topicName)
{
    using (var producer = new ProducerBuilder<long, string>(_producerConfig)
        .SetKeySerializer(Serializers.Int64)
        .SetValueSerializer(Serializers.Utf8)
        .SetLogHandler((_, message) => Console.WriteLine($"Facility: {message.Facility}-{message.Level} Message: {message.Message}"))
        .SetErrorHandler((_, e) => Console.WriteLine($"Error: {e.Reason}. Is Fatal: {e.IsFatal}"))
        .Build())
    try
    {
        Console.WriteLine("\nProducer loop started...\n\n");
        for (var character = 'A'; character <= 'C'; character++)
        {
            var message = $"Character #{character} sent at {DateTime.Now:yyyy-MM-dd_HH:mm:ss}";

            var deliveryReport = await producer.ProduceAsync(topicName,
                new Message<long, string>
                {
                    Key = DateTime.UtcNow.Ticks,
                    Value = message
                });

当我运行应用程序时,我得到:

Facility: FAIL-Error Message: [thrd:ssl://1.2.3.4:9093/bootstrap]: ssl://1.2.3.4:9093/bootstrap: SSL handshake failed: ssl\statem\statem_clnt.c:1890:tls_post_process_server_certificate error:0A000086:SSL routines::certificate verify failed: broker certificate could not be verified, verify that ssl.ca.location is correctly configured or root CA certificates are installed (add broker's CA certificate to the Windows Root certificate store) (after 46ms in state SSL_HANDSHAKE)
Error: ssl://1.2.3.4:9093/bootstrap: SSL handshake failed: ssl\statem\statem_clnt.c:1890:tls_post_process_server_certificate error:0A000086:SSL routines::certificate verify failed: broker certificate could not be verified, verify that ssl.ca.location is correctly configured or root CA certificates are installed (add broker's CA certificate to the Windows Root certificate store) (after 46ms in state SSL_HANDSHAKE). Is Fatal: False

我做错了什么,或者遗漏了什么?

c# ssl apache-kafka handshake confluent-kafka-dotnet
1个回答
1
投票

正如我所提到的,我通过将中间件团队提供给我们的 .pem 文件分解为 3 个证书/密钥文件来解决该问题。我概述了我采取的步骤,也许会对面临同样问题的人有所帮助。

  • 请求 .PEM 版本的 .JKS 证书和密钥。证书受密码保护,因此他们也需要提供密码。

  • 在这些步骤的其余部分中,我们假设收到的 PEM 证书称为 mykafka.pem。

  • 在文本编辑器(例如 Notepad++)中打开 mykafka.pem。该文件包含整个证书链,需要将其分解为不同的证书文档。

  • 找到以“-----BEGIN ENCRYPTED PRIVATE KEY-----”开头的行

  • 复制“-----BEGIN ENCRYPTED PRIVATE KEY-----”和“-----END ENCRYPTED PRIVATE KEY-----”之间的文本(含)。

  • 将复制文本的内容粘贴到新文件中,并命名为“mykafka.key”

  • 找到文本“friendName:mykafka”

  • 复制“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”行之间的内容(含)。

  • 将复制的文本内容粘贴到新文件中,并命名为“mykafka.cer”

  • 在证书部分的友好名称中找到文本 sha2ca.cer(例如“friendName:blah2021sha2ca.cer”)

  • 复制“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”行之间的内容(含)。

  • 将复制文本的内容粘贴到新文件中,并将其命名为证书部分中列出的友好名称(例如 blah2021sha2ca.cer)

  • 您现在应该有 3 个证书/密钥文件:mykafka.key、mykafka.cer、blah2021sha2ca.cer。

  • 在您的生产者类中,声明一个客户端配置变量并设置其 SSL 设置,如下所示:

    公开课制作人 { 私有只读 ProducerConfig _ ProducerConfig ;

     public Producer(string bootstrapServer)
     {
         _producerConfig = new ProducerConfig
         {
             BootstrapServers = bootstrapServer,
             ....
             SecurityProtocol = SecurityProtocol.Ssl,
             SslCaLocation = "<path_to_certificate_folder>\blah2021sha2ca.cer",
             SslCertificateLocation = "<path_to_certificate_folder>mykafka.cer",
             SslKeyLocation = "<path_to_certificate_folder>mykafka.key",
             SslKeyPassword = "<password_received_from_whoever_provided_pem_file>",
             ....
             EnableSslCertificateVerification = false,
         }
     }
    

    }

我添加了最后一个条目,EnableSslCertificateVerification,因为没有它我就会握手失败。

© www.soinside.com 2019 - 2024. All rights reserved.