{"id":379631,"date":"2024-06-25T03:16:32","date_gmt":"2024-06-25T03:16:32","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=379631"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=379631","title":{"rendered":"<span>\u041e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 Apache Kafka \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c SASL\/Kerberos \u0438 Avro Schema Registry<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0441\u0432\u043e\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 Apache Kafka \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spring Boot, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 SASL\/Kerberos \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c Avro Schema Registry \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0440\u044f\u0434\u043e\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u0443\u0441\u0438\u043b\u0438\u0439 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u043e\u0439 \u043e\u043f\u044b\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.  <\/p>\n<h3>\u0412\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041f\u043e \u0442\u0435\u0445\u0437\u0430\u0434\u0430\u043d\u0438\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 <abbr class=\"habraabbr\" title=\"\u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0432\u043d\u0435\" data-title=\"&lt;p>\u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0432\u043d\u0435&lt;\/p>&lt;p>&lt;\/p>&#187; data-abbr=&#187;\u0442\u043e\u043f\u0438\u043a\u0430&#187;>\u0442\u043e\u043f\u0438\u043a\u0430<\/abbr> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u043d\u0441\u0442\u0430\u043d\u0441 Kafka (\u0441\u0442\u0440\u043e\u043a\u0443, \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SSL), \u0438\u043b\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439, \u043d\u043e \u0443\u0436\u0435 \u0441 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438  \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 Kerberos.<\/p>\n<p>\u041e\u0431\u043c\u0435\u043d \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u043e\u0431\u043e\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 Kafka \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e  \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Kerberos.<\/p>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u0422\u043e\u043c\u043a\u0430\u0442.<\/p>\n<h4>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h4>\n<p><strong>Apache Kafka<\/strong> \u2014 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 SASL\/Kerberos. <a href=\"https:\/\/habr.com\/ru\/companies\/alfastrah\/articles\/547092\/\" rel=\"noopener noreferrer nofollow\">Avro Schema Registry<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445\\\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d2d\/a37\/1db\/d2da371db09cdda9957ceb0e9b2b680d.png\" width=\"654\" height=\"345\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d2d\/a37\/1db\/d2da371db09cdda9957ceb0e9b2b680d.png\"\/><\/figure>\n<p><strong>Kerberos<\/strong> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/803163\/\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0442\u0438<\/a>. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043a\u0435\u0442\u043e\u0432, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (KDC \u2014 Key Distribution Center).  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/175\/d4f\/04b\/175d4f04b75c72d3b02fcdc0282d5954.png\" width=\"767\" height=\"437\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/175\/d4f\/04b\/175d4f04b75c72d3b02fcdc0282d5954.png\"\/><\/figure>\n<p><strong>SSL (Secure Sockets Layer)<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\/\u0438\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c SSL \u0434\u043b\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 Kafka \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JKS (Java KeyStore), \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c <code>truststore<\/code> \u0438 <code>keystore<\/code> \u0444\u0430\u0439\u043b\u044b. <code>Truststore<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0445 \u0446\u0435\u043d\u0442\u0440\u043e\u0432 (CA), \u0430 <code>keystore<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0412 Kafka \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0438\u0445 \u043f\u0430\u0440\u043e\u043b\u0438. <\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Spring Boot \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 <code>pom.xml<\/code>:<\/p>\n<pre><code class=\"yaml\">&lt;dependencies>     &lt;dependency>         &lt;groupId>org.springframework.boot&lt;\/groupId>         &lt;artifactId>spring-boot-starter&lt;\/artifactId>     &lt;\/dependency>     &lt;dependency>         &lt;groupId>org.springframework.kafka&lt;\/groupId>         &lt;artifactId>spring-kafka&lt;\/artifactId>     &lt;\/dependency>     &lt;dependency>         &lt;groupId>io.confluent&lt;\/groupId>         &lt;artifactId>kafka-avro-serializer&lt;\/artifactId>         &lt;version>6.2.0&lt;\/version>     &lt;\/dependency>     &lt;dependency>         &lt;groupId>org.apache.kafka&lt;\/groupId>         &lt;artifactId>kafka-clients&lt;\/artifactId>         &lt;version>2.8.0&lt;\/version>     &lt;\/dependency> &lt;\/dependencies><\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 SSL<\/h3>\n<p>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a <code>jks<\/code> \u0444\u0430\u0439\u043b\u0443 \u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u043a \u043d\u0435\u043c\u0443. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u044d\u0442\u043e <code>producerRetailFactory<\/code>.<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Kerberos<\/h3>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Kerberos \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 <code>krb5.conf<\/code> \u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u0443\u0442\u0438 \u043a <code>keytab<\/code>. \u0424\u0430\u0439\u043b <code>krb5.conf<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e KDC (Key Distribution Center). \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u044d\u0442\u043e <code>producerMainFactory<\/code>.<\/p>\n<pre><code class=\"powershell\">[libdefaults] default_realm = TEST_DOMAIN.TRUS.TCOMPANY [realms] TEST_DOMAIN.TRUS.TCOMPANY = {   kdc  = DC00.TEST_DOMAIN.trus.tCOMPANY   admin_server = S000.TEST_DOMAIN.trus.tCOMPANY   kdc  = DC01.TEST_DOMAIN.TRUS.TCOMPANY } [domain_realm] .TEST_DOMAIN.trus.tCOMPANY = TEST_DOMAIN.TRUS.TCOMPANY TEST_DOMAIN.trus.tCOMPANY = TEST_DOMAIN.TRUS.TCOMPANY<\/code><\/pre>\n<p><code>keytab<\/code> \u044d\u0442\u043e\u00a0\u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 <strong>\u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043f\u0430\u0440\u044b Kerberos \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043b\u043e\u0432 \u0438 \u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439<\/strong>\u00a0(\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Kerberos \u043f\u0430\u0440\u043e\u043b\u044f). \u042d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0431\u0435\u0437 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f. <\/p>\n<p><em>\u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/em>  <\/p>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 Kafka<\/h3>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 Kafka, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u0438\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SSL \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 SSL, SASL\/Kerberos.<\/p>\n<blockquote>\n<p><strong>\u0412\u0430\u0436\u043d\u043e<\/strong>, \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043f\u0443\u0442\u044c \u043a <code>krb5.conf<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d (<a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/security\/kerberos-requirements.html#GUID-9D76C533-8EF4-4417-884A-37C60FA233FC\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0430\u0447\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439<\/a>) \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 props (\u043a\u0430\u043a \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b), \u0430 \u0447\u0435\u0440\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 <abbr class=\"habraabbr\" title=\"\u0421\u0442\u043e\u0438\u0442\u044c \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\" data-title=\"&lt;p>\u0421\u0442\u043e\u0438\u0442\u044c \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&lt;\/p>&lt;p>&lt;\/p>&#187; data-abbr=&#187;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f&#187;>\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/abbr>.<\/p>\n<\/blockquote>\n<pre><code class=\"java\">System.setProperty(\"java.security.krb5.conf\", krb5ConfFile);<\/code><\/pre>\n<pre><code class=\"java\">@Configuration @EnableKafka @Slf4j public class KafkaConfig {      private final Environment environment;     private final JMServiceDao jmServiceDao;      public KafkaConfig(Environment environment, JMServiceDao jmServiceDao) {         this.environment = environment;         this.jmServiceDao = jmServiceDao;     }      @Bean     public ProducerFactory&lt;String, Object> producerRetailFactory() {         Map&lt;String, Object> props = new HashMap&lt;>();          String hostname = Optional.ofNullable(System.getenv(\"HOSTNAME\")).filter(Predicate.not(String::isBlank)).orElse(environment.getProperty(\"COMPUTERNAME\", \"Localhost\"));         props.put(CLIENT_ID_CONFIG, hostname + \"_\" + environment.getProperty(\"spring.application.name\"));         props.put(BOOTSTRAP_SERVERS_CONFIG, environment.getProperty(\"KafkaRetailBrokerHost\", jmServiceDao.getKafkaRetailBrokerHost()));          props.put(KEY_SERIALIZER_CLASS_CONFIG, \"org.apache.kafka.common.serialization.StringSerializer\");         props.put(VALUE_SERIALIZER_CLASS_CONFIG, \"org.apache.kafka.common.serialization.StringSerializer\");          props.put(\"security.protocol\", \"SSL\");         props.put(\"ssl.enabled.protocols\", \"TLSv1.2\");         props.put(\"ssl.truststore.location\", environment.getProperty(\"KafkaRetailSSLKeyStoreLocation\" + \"kafka.retail.truststore.jks\",                 environment.getProperty(\"catalina.base\") +                         jmServiceDao.getKafkaRetailSSLKeyStoreLocation()));          props.put(\"ssl.truststore.password\", environment.getProperty(\"KafkaRetailSSLKeyStorePwd\", jmServiceDao.getKafkaRetailSSLKeyStorePassword()));          return new DefaultKafkaProducerFactory&lt;>(props);     }      @Bean     public ProducerFactory&lt;String, Object> producerMainFactory() {         \/\/ \u0432\u0430\u0436\u043d\u043e! \u043f\u0443\u0442\u044c \u043a keyTab \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u044d\u043a\u0440\u0430\u043d\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0434\u043b\u044f windows path         String keyTabFile = Paths.get(environment.getProperty(\"catalina.base\") + jmServiceDao.getKafkaMainKeytabLocation()).toAbsolutePath().normalize().toString().replace(\"\\\\\", \"\/\");         String krb5ConfFile = Paths.get(environment.getProperty(\"catalina.base\") + jmServiceDao.getKafkaMainKrb5ConfLocation()).toAbsolutePath().normalize().toString().replace(\"\\\\\", \"\/\");         String jksFile = Paths.get(environment.getProperty(\"KafkaMainSSLKeyStoreLocation\" + \"kafka.retail.truststore.jks\",                 environment.getProperty(\"catalina.base\") + jmServiceDao.getKafkaMainSSLKeyStoreLocation())).toAbsolutePath().normalize().toString().replace(\"\\\\\", \"\/\");           Map&lt;String, Object> props = new HashMap&lt;>();         String hostname = Optional.ofNullable(environment.getProperty(\"HOSTNAME\")).filter(Predicate.not(String::isBlank)).orElse(environment.getProperty(\"COMPUTERNAME\", \"Localhost\"));         props.put(CLIENT_ID_CONFIG, hostname + \"_\" + environment.getProperty(\"spring.application.name\"));         props.put(BOOTSTRAP_SERVERS_CONFIG, environment.getProperty(\"KafkaMainBrokerHost\", jmServiceDao.getKafkaMainBrokerHost()));          props.put(KEY_SERIALIZER_CLASS_CONFIG, \"org.apache.kafka.common.serialization.StringSerializer\");         props.put(VALUE_SERIALIZER_CLASS_CONFIG, \"io.confluent.kafka.serializers.KafkaAvroSerializer\");         props.put(\"key.deserializer\", \"org.apache.kafka.common.serialization.StringDeserializer\");         props.put(\"value.deserializer\", \"io.confluent.kafka.serializers.KafkaAvroDeserializer\");         props.put(\"specific.avro.reader\", \"true\");          props.put(\"sasl.mechanism\", \"GSSAPI\");         props.put(\"sasl.jaas.config\", \"\"\"                 com.sun.security.auth.module.Krb5LoginModule required serviceName=\"kafka\"                 useKeyTab=true storeKey=true keyTab=\"%s\" principal=\"%s\";                 \"\"\".formatted(keyTabFile, jmServiceDao.getKafkaMainPrincipal()));         props.put(\"session.timeout.ms\", \"45000\");         props.put(\"schema.registry.url\", jmServiceDao.getKafkaMainSchemaRegistryUrl());         \/\/ \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 props         System.setProperty(\"java.security.krb5.conf\", krb5ConfFile);          props.put(\"security.protocol\", \"SASL_SSL\");         props.put(\"ssl.enabled.protocols\", \"TLSv1.2,TLSv1.1,TLSv1\");         props.put(\"ssl.truststore.location\", environment.getProperty(\"KafkaMainSSLKeyStoreLocation\" + \"kafka.main.truststore.jks\", jksFile));          props.put(\"ssl.truststore.password\", environment.getProperty(\"KafkaMainSSLKeyStorePwd\", jmServiceDao.getKafkaMainSSLKeyStorePassword()));         \/\/log.debug(\"kafka props {}\", props);         \/\/log.debug(\"system env {}\", System.getProperties());         return new DefaultKafkaProducerFactory&lt;>(props);     }      @Bean     public KafkaTemplate&lt;String, Object> kafkaTemplateForRetail() {         return new KafkaTemplate&lt;>(producerRetailFactory());     }      @Bean     public KafkaTemplate&lt;String, Object> kafkaTemplateForMain() {         return new KafkaTemplate&lt;>(producerMainFactory());     } } <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 (\u043a\u0440\u043e\u043c\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432), \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>sasl.jaas.config<\/code> \u0438 \u0437\u0434\u0435\u0441\u044c \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439, \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e <strong>\u043d\u0438\u0433\u0434\u0435 \u043d\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438<\/strong> \u043a <code>keyTab<\/code> \u0444\u0430\u0439\u043b\u0443. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u043b\u0430\u0441\u044c \u0432 \u041e\u0421 Windows, \u0438 <em>windows<\/em> \u043f\u0443\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>C:\\ra_projects\\Java\\apache-tomcat-10.1.10\\conf\\keystore\\tkafka.keytab<\/code>  \u0438\u0437-\u0437\u0430 <strong>\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043b\u0435\u0448\u0435\u0439 <\/strong>(\u043f\u0443\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0411\u0414), \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0432 <code>C:a_projectsJava\ufffdpache-tomcat-10.1.10confkeystorekafka.keytab<\/code>, \u0432 Exception \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c: <\/p>\n<p><code>Caused by: org.apache.kafka.common.KafkaException: javax.security.auth.login.LoginException: Could not login: the client is being asked for a password, but the Kafka client code does not currently support obtaining a password from the user. not available to garner  authentication information from the user<\/code>  <\/p>\n<blockquote>\n<p>\u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Debug \u044f \u0443\u0432\u0438\u0434\u0435\u043b \u043a\u0440\u0438\u0432\u043e\u0439 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 <code>keyTab<\/code>. \u0414\u043e\u0431\u0430\u0432\u0438\u043b \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0422\u0430\u043a \u0436\u0435 <a href=\"https:\/\/github.com\/spring-projects\/spring-kafka\/issues\/3274\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u0432\u0435\u043b issue<\/a>.<\/p>\n<\/blockquote>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u044f \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043e\u0448\u0438\u0431\u043a\u0443: <\/p>\n<p><code>javax.security.sasl.SaslException: An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - LOOKING_UP_SERVER)]) occurred when evaluating SASL token received from the Kafka Broker. Kafka Client will retry.<\/code><\/p>\n<blockquote>\n<p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>krb5.conf<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u043a KDC \u0434\u043e\u043c\u0435\u043d\u0430\u043c. \u0410 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438, \u0447\u0442\u043e <strong>\u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b<\/strong> <code>krb5.conf<\/code><strong>\u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c<\/strong>, \u0438 \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c, \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u043d \u0434\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 Tomcat \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043f\u043b\u043e\u0438\u043b\u043e\u0441\u044c \u043c\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<\/blockquote>\n<h4>\u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<p>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 <code>KafkaConfig<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043e\u043c\u0435\u043d \u043a <a href=\"https:\/\/habr.com\/ru\/companies\/alfastrah\/articles\/547092\/\" rel=\"noopener noreferrer nofollow\">\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u0445\u0435\u043c<\/a>:<\/p>\n<pre><code class=\"java\">props.put(\"schema.registry.url\", jmServiceDao.getKafkaMainSchemaRegistryUrl());<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Kafka \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0432\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438:<\/p>\n<pre><code class=\"java\">@Service @Slf4j public class JMServiceImpl implements JMService {     private enum KafkaType {         KAFKA_RETAIL,         KAFKA_MAIN     }      private final JMServiceDao jmServiceDao;     \/\/ \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 SSL, \u0442\u0443\u0442 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \"\u0441\u044b\u0440\u044b\u0445\" \u0434\u0430\u043d\u043d\u044b\u0445     private final KafkaTemplate&lt;String, Object> kafkaTemplateForRetail;     \/\/ \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 SSL,Kerberos, \u0442\u0443\u0442 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445     private final KafkaTemplate&lt;String, Object> kafkaTemplateForMain;      @Autowired     public JMServiceImpl(JMServiceDao plcPackageDao,                          @Qualifier(\"kafkaTemplateForRetail\") KafkaTemplate&lt;String, Object> kafkaTemplateForRetail,                          @Qualifier(\"kafkaTemplateForMain\") KafkaTemplate&lt;String, Object> kafkaTemplateForMain) {         this.jmServiceDao = plcPackageDao;         this.kafkaTemplateForRetail = kafkaTemplateForRetail;         this.kafkaTemplateForMain = kafkaTemplateForMain;     }       @Override     public Mono&lt;KafkaSendOKResponse> sendMessage(QueueMessageId queueMessageId) throws IOException {         log.info(\"\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 queueMessageId = {}\", queueMessageId.getQueueMessageId());         QueueMessage message = jmServiceDao.getQueueMessage(queueMessageId.getQueueMessageId());         if (message == null) {             throw new ResponseStatusException(NOT_FOUND, \"\u0412 \u0442\u0435\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\");         } else {             KafkaType messagingSystem = KafkaType.valueOf(message.getMessagingSystemCode());             Object messageForSend;             KafkaTemplate&lt;String, Object> kafkaTemplate = switch (messagingSystem) {                 case KAFKA_MAIN -> {                     ObjectMapper objectMapper = new ObjectMapper();                     \/\/\u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 JSON                     JsonNode rootNode = objectMapper.readTree(message.getMessageData());                     \/\/\u043d\u0443\u0436\u043d\u0430 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f                     SendPTI ptiMessage = new SendPTI();                     ptiMessage.setSiebelId(rootNode.get(\"siebel_id\").asText());                     ptiMessage.setPti(ByteBuffer.wrap(rootNode.get(\"pti\").asText().getBytes(StandardCharsets.US_ASCII)));                     ptiMessage.setPtiDate(Instant.parse(rootNode.get(\"pti_date\").asText()));                     messageForSend = ptiMessage;                     yield kafkaTemplateForMain;                 }                 case KAFKA_RETAIL -> {                     \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0443                     messageForSend = message.getMessageData();                     yield kafkaTemplateForRetail;                 }                 default -> throw new IllegalArgumentException(\"\u041d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430: \" + messagingSystem);             };              log.debug(\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0442\u043e\u043f\u0438\u043a {} \u0434\u0430\u043d\u043d\u044b\u0435 {}\", message.getTopic(), messageForSend);             return Mono.fromFuture(kafkaTemplate.send(message.getTopic(), messageForSend))                     .map(result -> {                         log.debug(\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 {} \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f {}\", result, queueMessageId.getQueueMessageId());                         LocalDateTime localDateTime = result.getRecordMetadata().hasTimestamp()                                 ? LocalDateTime.ofInstant(Instant.ofEpochMilli(result.getRecordMetadata().timestamp()), ZoneId.systemDefault())                                 : null;                         return new KafkaSendOKResponse()                                 .setQueueMessageId(queueMessageId.getQueueMessageId())                                 .setSendStatus(1)                                 .setRecordMetadata(result.getRecordMetadata().toString())                                 .setSentDate(localDateTime);                     })                     .doOnError(ex -> {                         log.error(\"\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 {} \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f {}\", ex, queueMessageId.getQueueMessageId());                     });         }     } } <\/code><\/pre>\n<p>\u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u043d\u0443\u0436\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (\u0431\u0438\u043d\u0430) \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <a href=\"https:\/\/www.baeldung.com\/spring-qualifier-annotation\" rel=\"noopener noreferrer nofollow\">@Qualifier<\/a>. \u0414\u043b\u044f <strong>KAFKA_MAIN<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <strong>Avro<\/strong> \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, \u0434\u043b\u044f <strong>KAFKA_RETAIL<\/strong> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <code>SendPTI<\/code> \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445\\\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/avro.apache.org\/docs\/1.11.1\/getting-started-java\/\" rel=\"noopener noreferrer nofollow\">Maven \u043f\u043b\u0430\u0433\u0438\u043d<\/a>:<\/p>\n<pre><code class=\"xml\">&lt;plugin> &lt;groupId>org.apache.avro&lt;\/groupId> &lt;artifactId>avro-maven-plugin&lt;\/artifactId> &lt;version>1.11.3&lt;\/version> &lt;executions> &lt;execution> &lt;phase>generate-sources&lt;\/phase> &lt;goals> &lt;goal>schema&lt;\/goal> &lt;\/goals> &lt;configuration> &lt;sourceDirectory>${project.basedir}\/src\/main\/avro\/&lt;\/sourceDirectory> &lt;outputDirectory>${project.basedir}\/src\/main\/java\/&lt;\/outputDirectory> &lt;\/configuration> &lt;\/execution> &lt;\/executions> &lt;\/plugin><\/code><\/pre>\n<p>\u0412 \u043d\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a <code>*.avcs<\/code> \u0444\u0430\u0439\u043b\u0443, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u043c\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443, \u043c\u043d\u0435 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"json\">{   \"type\": \"record\",   \"name\": \"SendPTI\",   \"namespace\": \"com.technology.kafkaproducer.jmessageservice.SendPTI\",   \"fields\": [     {       \"name\": \"siebel_id\",       \"type\": \"string\"     },     {       \"name\": \"pti\",       \"type\": {         \"type\": \"bytes\",         \"scale\": 5,         \"precision\": 7,         \"connect.version\": 1,         \"connect.parameters\": {           \"scale\": \"5\",           \"connect.decimal.precision\": \"7\"         },         \"connect.name\": \"org.apache.kafka.connect.data.Decimal\",         \"logicalType\": \"decimal\"       }     },     {       \"name\": \"pti_date\",       \"type\": {         \"type\": \"long\",         \"connect.version\": 1,         \"connect.name\": \"org.apache.kafka.connect.data.Timestamp\",         \"logicalType\": \"timestamp-millis\"       }     }   ],   \"connect.name\": \"ru.COMPANY.schema.SCORF.SendPTI\" }<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d POJO \u043a\u043b\u0430\u0441\u0441, \u0432 \u043c\u043e\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 <strong>SendPTI<\/strong>.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0433\u043e\u0442\u043e\u0432\u043e, \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439; \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0441\u0435\u0442\u044c \u0443 \u043c\u0435\u043d\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u043a\u0441\u0438, \u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 Kafka, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u0431\u0435\u0437\u0443\u0441\u043f\u0435\u0448\u043d\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Schema Registry \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u0434\u0430\u043b\u043e \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439:<\/p>\n<p><code>2024-05-29 11:09:15.754 [http-nio-8081-exec-2] ERROR i.c.k.s.client.rest.RestService - Failed to send HTTP request to endpoint: https:\/\/schema-kafka-test\/subjects\/SCORF.SendPTI-value\/versions\/latest\/ java.io.IOException: Unable to tunnel through proxy. Proxy returns \"HTTP\/1.1 407 Proxy Authentication Required\"<\/code><\/p>\n<blockquote>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043c\u043e\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e (\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0435\u0441\u043a\u043e\u0433\u043e) \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0422\u043e\u043c\u043a\u0430\u0442:<\/p>\n<\/blockquote>\n<pre><code class=\"bash\">-Dhttps.proxyHost=proxy.host -Dhttps.proxyPort=8080 -Dhttps.proxyUser=user -Dhttps.proxyPassword=superSecretPassword<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u044f \u0441\u043c\u043e\u0433 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0430 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Kafka \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u0431\u0435\u0437.<\/p>\n<p>\u041c\u0438\u0440\u0430!<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/819289\/\"> https:\/\/habr.com\/ru\/articles\/819289\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0441\u0432\u043e\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 Apache Kafka \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spring Boot, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 SASL\/Kerberos \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c Avro Schema Registry \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0440\u044f\u0434\u043e\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u0443\u0441\u0438\u043b\u0438\u0439 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u043e\u0439 \u043e\u043f\u044b\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.  <\/p>\n<h3>\u0412\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041f\u043e \u0442\u0435\u0445\u0437\u0430\u0434\u0430\u043d\u0438\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 <abbr class=\"habraabbr\" title=\"\u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0432\u043d\u0435\" data-title=\"&lt;p>\u0435\u0442\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0432\u043d\u0435&#187; data-title=&#187;&lt;p>\u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0432\u043d\u0435&lt;\/p>&lt;p>&lt;\/p>&#187; data-abbr=&#187;\u0442\u043e\u043f\u0438\u043a\u0430&#187;>\u0442\u043e\u043f\u0438\u043a\u0430<\/abbr> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u043d\u0441\u0442\u0430\u043d\u0441 Kafka (\u0441\u0442\u0440\u043e\u043a\u0443, \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SSL), \u0438\u043b\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439, \u043d\u043e \u0443\u0436\u0435 \u0441 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438  \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 Kerberos.<\/p>\n<p>\u041e\u0431\u043c\u0435\u043d \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u043e\u0431\u043e\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 Kafka \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e  \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Kerberos.<\/p>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u0422\u043e\u043c\u043a\u0430\u0442.<\/p>\n<h4>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h4>\n<p><strong>Apache Kafka<\/strong> \u2014 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 SASL\/Kerberos. <a href=\"https:\/\/habr.com\/ru\/companies\/alfastrah\/articles\/547092\/\" rel=\"noopener noreferrer nofollow\">Avro Schema Registry<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445\\\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p><strong>Kerberos<\/strong> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/803163\/\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0442\u0438<\/a>. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043a\u0435\u0442\u043e\u0432, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (KDC \u2014 Key Distribution Center).  <\/p>\n<figure class=\"full-width\"><\/figure>\n<p><strong>SSL (Secure Sockets Layer)<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\/\u0438\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c SSL \u0434\u043b\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 Kafka \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JKS (Java KeyStore), \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c <code>truststore<\/code> \u0438 <code>keystore<\/code> \u0444\u0430\u0439\u043b\u044b. <code>Truststore<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0445 \u0446\u0435\u043d\u0442\u0440\u043e\u0432 (CA), \u0430 <code>keystore<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0412 Kafka \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0438\u0445 \u043f\u0430\u0440\u043e\u043b\u0438. <\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Spring Boot \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 <code>pom.xml<\/code>:<\/p>\n<pre><code class=\"yaml\">&lt;dependencies>     &lt;dependency>         &lt;groupId>org.springframework.boot&lt;\/groupId>         &lt;artifactId>spring-boot-starter&lt;\/artifactId>     &lt;\/dependency>     &lt;dependency>         &lt;groupId>org.springframework.kafka&lt;\/groupId>         &lt;artifactId>spring-kafka&lt;\/artifactId>     &lt;\/dependency>     &lt;dependency>         &lt;groupId>io.confluent&lt;\/groupId>         &lt;artifactId>kafka-avro-serializer&lt;\/artifactId>         &lt;version>6.2.0&lt;\/version>     &lt;\/dependency>     &lt;dependency>         &lt;groupId>org.apache.kafka&lt;\/groupId>         &lt;artifactId>kafka-clients&lt;\/artifactId>         &lt;version>2.8.0&lt;\/version>     &lt;\/dependency> &lt;\/dependencies><\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 SSL<\/h3>\n<p>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a <code>jks<\/code> \u0444\u0430\u0439\u043b\u0443 \u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u043a \u043d\u0435\u043c\u0443. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u044d\u0442\u043e <code>producerRetailFactory<\/code>.<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Kerberos<\/h3>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Kerberos \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 <code>krb5.conf<\/code> \u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u0443\u0442\u0438 \u043a <code>keytab<\/code>. \u0424\u0430\u0439\u043b <code>krb5.conf<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e KDC (Key Distribution Center). \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u044d\u0442\u043e <code>producerMainFactory<\/code>.<\/p>\n<pre><code class=\"powershell\">[libdefaults] default_realm = TEST_DOMAIN.TRUS.TCOMPANY [realms] TEST_DOMAIN.TRUS.TCOMPANY = {   kdc  = DC00.TEST_DOMAIN.trus.tCOMPANY   admin_server = S000.TEST_DOMAIN.trus.tCOMPANY   kdc  = DC01.TEST_DOMAIN.TRUS.TCOMPANY } [domain_realm] .TEST_DOMAIN.trus.tCOMPANY = TEST_DOMAIN.TRUS.TCOMPANY TEST_DOMAIN.trus.tCOMPANY = TEST_DOMAIN.TRUS.TCOMPANY<\/code><\/pre>\n<p><code>keytab<\/code> \u044d\u0442\u043e\u00a0\u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 <strong>\u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043f\u0430\u0440\u044b Kerberos \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043b\u043e\u0432 \u0438 \u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439<\/strong>\u00a0(\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Kerberos \u043f\u0430\u0440\u043e\u043b\u044f). \u042d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0431\u0435\u0437 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f. <\/p>\n<p><em>\u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/em>  <\/p>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 Kafka<\/h3>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 Kafka, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u0438\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SSL \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 SSL, SASL\/Kerberos.<\/p>\n<blockquote>\n<p><strong>\u0412\u0430\u0436\u043d\u043e<\/strong>, \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043f\u0443\u0442\u044c \u043a <code>krb5.conf<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d (<a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/security\/kerberos-requirements.html#GUID-9D76C533-8EF4-4417-884A-37C60FA233FC\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0430\u0447\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439<\/a>) \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 props (\u043a\u0430\u043a \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b), \u0430 \u0447\u0435\u0440\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 <abbr class=\"habraabbr\" title=\"\u0421\u0442\u043e\u0438\u0442\u044c \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\" data-title=\"&lt;p>\u0440\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&#187; data-title=&lt;p>\u0421\u0442\u043e\u0438\u0442\u044c \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&lt;\/p>&lt;p>&lt;\/p>&#187; data-abbr=&#187;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f&#187;>\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/abbr>.<\/p>\n<\/blockquote>\n<pre><code class=\"java\">System.setProperty(\"java.security.krb5.conf\", krb5ConfFile);<\/code><\/pre>\n<pre><code class=\"java\">@Configuration @EnableKafka @Slf4j public class KafkaConfig {      private final Environment environment;     private final JMServiceDao jmServiceDao;      public KafkaConfig(Environment environment, JMServiceDao jmServiceDao) {         this.environment = environment;         this.jmServiceDao = jmServiceDao;     }      @Bean     public ProducerFactory&lt;String, Object> producerRetailFactory() {         Map&lt;String, Object> props = new HashMap&lt;>();          String hostname = Optional.ofNullable(System.getenv(\"HOSTNAME\")).filter(Predicate.not(String::isBlank)).orElse(environment.getProperty(\"COMPUTERNAME\", \"Localhost\"));         props.put(CLIENT_ID_CONFIG, hostname + \"_\" + environment.getProperty(\"spring.application.name\"));         props.put(BOOTSTRAP_SERVERS_CONFIG, environment.getProperty(\"KafkaRetailBrokerHost\", jmServiceDao.getKafkaRetailBrokerHost()));          props.put(KEY_SERIALIZER_CLASS_CONFIG, \"org.apache.kafka.common.serialization.StringSerializer\");         props.put(VALUE_SERIALIZER_CLASS_CONFIG, \"org.apache.kafka.common.serialization.StringSerializer\");          props.put(\"security.protocol\", \"SSL\");         props.put(\"ssl.enabled.protocols\", \"TLSv1.2\");         props.put(\"ssl.truststore.location\", environment.getProperty(\"KafkaRetailSSLKeyStoreLocation\" + \"kafka.retail.truststore.jks\",                 environment.getProperty(\"catalina.base\") +                         jmServiceDao.getKafkaRetailSSLKeyStoreLocation()));          props.put(\"ssl.truststore.password\", environment.getProperty(\"KafkaRetailSSLKeyStorePwd\", jmServiceDao.getKafkaRetailSSLKeyStorePassword()));          return new DefaultKafkaProducerFactory&lt;>(props);     }      @Bean     public ProducerFactory&lt;String, Object> producerMainFactory() {         \/\/ \u0432\u0430\u0436\u043d\u043e! \u043f\u0443\u0442\u044c \u043a keyTab \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u044d\u043a\u0440\u0430\u043d\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0434\u043b\u044f windows path         String keyTabFile = Paths.get(environment.getProperty(\"catalina.base\") + jmServiceDao.getKafkaMainKeytabLocation()).toAbsolutePath().normalize().toString().replace(\"\\\\\", \"\/\");         String krb5ConfFile = Paths.get(environment.getProperty(\"catalina.base\") + jmServiceDao.getKafkaMainKrb5ConfLocation()).toAbsolutePath().normalize().toString().replace(\"\\\\\", \"\/\");         String jksFile = Paths.get(environment.getProperty(\"KafkaMainSSLKeyStoreLocation\" + \"kafka.retail.truststore.jks\",                 environment.getProperty(\"catalina.base\") + jmServiceDao.getKafkaMainSSLKeyStoreLocation())).toAbsolutePath().normalize().toString().replace(\"\\\\\", \"\/\");           Map&lt;String, Object> props = new HashMap&lt;>();         String hostname = Optional.ofNullable(environment.getProperty(\"HOSTNAME\")).filter(Predicate.not(String::isBlank)).orElse(environment.getProperty(\"COMPUTERNAME\", \"Localhost\"));         props.put(CLIENT_ID_CONFIG, hostname + \"_\" + environment.getProperty(\"spring.application.name\"));         props.put(BOOTSTRAP_SERVERS_CONFIG, environment.getProperty(\"KafkaMainBrokerHost\", jmServiceDao.getKafkaMainBrokerHost()));          props.put(KEY_SERIALIZER_CLASS_CONFIG, \"org.apache.kafka.common.serialization.StringSerializer\");         props.put(VALUE_SERIALIZER_CLASS_CONFIG, \"io.confluent.kafka.serializers.KafkaAvroSerializer\");         props.put(\"key.deserializer\", \"org.apache.kafka.common.serialization.StringDeserializer\");         props.put(\"value.deserializer\", \"io.confluent.kafka.serializers.KafkaAvroDeserializer\");         props.put(\"specific.avro.reader\", \"true\");          props.put(\"sasl.mechanism\", \"GSSAPI\");         props.put(\"sasl.jaas.config\", \"\"\"                 com.sun.security.auth.module.Krb5LoginModule required serviceName=\"kafka\"                 useKeyTab=true storeKey=true keyTab=\"%s\" principal=\"%s\";                 \"\"\".formatted(keyTabFile, jmServiceDao.getKafkaMainPrincipal()));         props.put(\"session.timeout.ms\", \"45000\");         props.put(\"schema.registry.url\", jmServiceDao.getKafkaMainSchemaRegistryUrl());         \/\/ \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 props         System.setProperty(\"java.security.krb5.conf\", krb5ConfFile);          props.put(\"security.protocol\", \"SASL_SSL\");         props.put(\"ssl.enabled.protocols\", \"TLSv1.2,TLSv1.1,TLSv1\");         props.put(\"ssl.truststore.location\", environment.getProperty(\"KafkaMainSSLKeyStoreLocation\" + \"kafka.main.truststore.jks\", jksFile));          props.put(\"ssl.truststore.password\", environment.getProperty(\"KafkaMainSSLKeyStorePwd\", jmServiceDao.getKafkaMainSSLKeyStorePassword()));         \/\/log.debug(\"kafka props {}\", props);         \/\/log.debug(\"system env {}\", System.getProperties());         return new DefaultKafkaProducerFactory&lt;>(props);     }      @Bean     public KafkaTemplate&lt;String, Object> kafkaTemplateForRetail() {         return new KafkaTemplate&lt;>(producerRetailFactory());     }      @Bean     public KafkaTemplate&lt;String, Object> kafkaTemplateForMain() {         return new KafkaTemplate&lt;>(producerMainFactory());     } } <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 (\u043a\u0440\u043e\u043c\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432), \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>sasl.jaas.config<\/code> \u0438 \u0437\u0434\u0435\u0441\u044c \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439, \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e <strong>\u043d\u0438\u0433\u0434\u0435 \u043d\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438<\/strong> \u043a <code>keyTab<\/code> \u0444\u0430\u0439\u043b\u0443. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u043b\u0430\u0441\u044c \u0432 \u041e\u0421 Windows, \u0438 <em>windows<\/em> \u043f\u0443\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>C:\\ra_projects\\Java\\apache-tomcat-10.1.10\\conf\\keystore\\tkafka.keytab<\/code>  \u0438\u0437-\u0437\u0430 <strong>\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043b\u0435\u0448\u0435\u0439 <\/strong>(\u043f\u0443\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0411\u0414), \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0432 <code>C:a_projectsJava\ufffdpache-tomcat-10.1.10confkeystorekafka.keytab<\/code>, \u0432 Exception \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c: <\/p>\n<p><code>Caused by:<\/code><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-379631","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/379631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=379631"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/379631\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=379631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=379631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=379631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}