如何在 Camel Debezium SQL 服务器连接器中为 JDBC 连接设置加密 false

Fly*_*eaf 4 java sql-server apache-camel apache-kafka spring-boot

我在尝试使用 Camel Debezium SQL 服务器连接器时遇到问题。我正在尝试使用camel Debezium SQL Server 连接器捕获SQL Server 数据库表中的数据更改,并将它们接收到消息代理。我知道 JDBC SQL 服务器连接可以选择将加密设置为 false 以防止出现此问题。但我在 Camel Debezium SQL 服务器连接器中找不到类似的方法。

要使用 Camel Debezium SQL 服务器连接器,我遵循了此文档:

https://camel.apache.org/components/3.18.x/debezium-sqlserver-component.html#_samples

当我运行该应用程序时,它显示以下错误:

错误 io.debezium.embedded.EmbeddedEngine - 尝试运行连接器类“io.debezium.connector.sqlserver.SqlServerConnector”时出错

原因:com.microsoft.sqlserver.jdbc.SQLServerException:驱动程序无法使用安全套接字层 (SSL) 加密与 SQL Server 建立安全连接。错误:“PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径”。

我的POM如下:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-parent</artifactId>
      <version>3.18.1-SNAPSHOT</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
  </dependencies>
</dependencyManagement>
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-core</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-main</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-debezium-sqlserver</artifactId>
  </dependency>
  <dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>11.2.0.jre11</version>
  </dependency>
  <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jackson</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-kafka</artifactId>
  </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

我正在使用:
spring-boot:2.7.2
SQL Server:docker 图像:mcr.microsoft.com/mssql/server:2022-latest
Kafka 图像:confluenceinc/cp-zookeeper:latest

谁能帮我解决这个问题?

Alw*_*ing 7

在处理 Debezium 连接器时,要注册新的 SQL Server 连接器,我们通常可能会 POST 如下所示的 JSON 配置:

curl -H "Content-Type: application/json" -XPOST http://127.0.0.1:8083/connectors --data @- << EOF
{
    "name": "local-hub-connector",
    "config": {
        "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector",
        "database.hostname": "mssql-2019",
        "database.port": 1433,
        "database.user": "Debezium",
        "database.password": "StrongPassw0rd",
        "database.dbname": "DebeziumTest",
        "database.server.name": "DebeziumTestServer",
        "table.include.list": "dbo.tb_CDCTab1",
        "database.history.kafka.bootstrap.servers": "broker:29092",
        "database.history.kafka.topic": "dbhistory.DebeziumTestServer"
    }
}
EOF
Run Code Online (Sandbox Code Playgroud)

当连接器使用 10.2 之前的 JDBC 版本时,此功能可以正常工作,但JDBC Driver 10.2 for SQL Server引入了重大更改,特别是:

重大更改 - 默认加密为 true

这通常是有问题的,因为默认情况下,SQL Server 是使用自签名 X.509 证书安装的,因此它不会出现在任何信任存储中。

如果您使用的是安装了 JDBC Driver 10.2 for SQL Server(或更高版本)的新连接器容器,则需要修改连接器配置:

  • 不需要加密吗?encrypt=false使用连接字符串选项将其关闭。
  • 您需要加密吗?添加trustServerCertificate=true到连接字符串选项。

我们可以通过传递配置属性来做到这一点,即:Debezium SQL Server 连接器传递数据库驱动程序配置属性

Debezium 连接器提供数据库驱动程序的直通配置。传递数据库属性以前缀database.* 开头。例如,连接器将诸如database.foobar=false 之类的属性传递给 JDBC URL。

要关闭加密,我们将发布以下 JSON 配置:

curl -H "Content-Type: application/json" -XPOST http://127.0.0.1:8083/connectors --data @- << EOF
{
    "name": "local-hub-connector",
    "config": {
        "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector",
        "database.hostname": "mssql-2019",
        "database.port": 1433,
        "database.user": "Debezium",
        "database.password": "StrongPassw0rd",
        "database.dbname": "DebeziumTest",
        "database.server.name": "DebeziumTestServer",
        "table.include.list": "dbo.tb_CDCTab1",
        "database.history.kafka.bootstrap.servers": "broker:29092",
        "database.history.kafka.topic": "dbhistory.DebeziumTestServer",
        "database.encrypt": false
    }
}
EOF
Run Code Online (Sandbox Code Playgroud)

为了保持加密并信任 SQL Server 的自签名证书,我们将发布以下 JSON 配置:

curl -H "Content-Type: application/json" -XPOST http://127.0.0.1:8083/connectors --data @- << EOF
{
    "name": "local-hub-connector",
    "config": {
        "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector",
        "database.hostname": "mssql-2019",
        "database.port": 1433,
        "database.user": "Debezium",
        "database.password": "StrongPassw0rd",
        "database.dbname": "DebeziumTest",
        "database.server.name": "DebeziumTestServer",
        "table.include.list": "dbo.tb_CDCTab1",
        "database.history.kafka.bootstrap.servers": "broker:29092",
        "database.history.kafka.topic": "dbhistory.DebeziumTestServer",
        "database.encrypt": true,
        "database.trustServerCertificate": true
    }
}
EOF
Run Code Online (Sandbox Code Playgroud)

如果您无法发布配置更改,那么camel.component.debezium-sqlserver.additional-properties可能可以提供类似的功能。