带有证书的 Nifi 和 Postgresql:如何设置客户端证书和密钥?
Nifi and Postgresql with certificate: how to set client certificate and key?
我在 openshift 中有一个 NIFI 映像 运行,在云中有一个 postgres "owned" 由另一个部门提供。
他们向我们发送了一个证书(".crt") 和一个密钥(".key"),因为登录是通过客户端证书进行的,而不是用户名和密码。我已成功登录pgAdmin 4,但无法使用证书和密钥将NIFI连接到Postgres。
我已经将证书和密钥上传到图像(使用秘密并安装它)所以如果我去 pod 终端我可以访问它。
但是,当我将下面的连接字符串传递给 DBCPConnectionPoll 服务并激活 ExecuteSQL 处理器时,我收到证书无效的异常,如下所示:
ERROR
ExecuteSQL[id=...] Unable to execute SQL query <...>;
due to java.sql.SQLException: Cannot create a PoolableConnectionFactory (FATAL: connection requires a valid client certificate).
No FlowFile to route to failure: org.apache.nifi.processor.exception.ProcessException: java.sql.SQLException: Cannot create a PoolableConnectionFactory (FATAL: connection requires a valid client certificate)
我已经尝试通过两种方式将证书传递给 DBCPConnectionPoll 服务:
1) 作为连接字符串中的参数 ("database connection url" 属性:
jdbc:postgresql://<ip>:<port>/<username>?user=<username>&sslTrue&sslcert=/etc/.../mycerts/mycert.der&sslkey=/etc/.../mycerts/mykey.key.pk8
2) 在服务中添加属性(+ 按钮和参数名称以及路径作为值)并将其作为 url:
传递
jdbc:postgresql://<ip>:<port>/<username>
一般来说,两者似乎都可以工作,因为我可以连接到另一个不需要 ssl 认证的 postgres。
一些注意事项:
1) 我的假设这里是NIFI中的连接字符串不知道正确读取证书和密钥的文件路径。
2) 我已经将证书多次转换为 java 可以接收的不同类型,以便查看是否是问题所在,但我仍然收到相同的异常。所以看起来连接池根本就没有 "achieve" 文件。不过,如果有人对这个话题有发言权,在主要问题解决后,它会派上用场。所以也感谢这里的一些提示。
3) 我也阅读了 NIFI 源代码,NIFI 似乎通常使用 JDBC 类 来创建连接池,所以我传递的连接字符串在 java 代码,但不知何故在 NIFI 中不起作用(写在 java)。
4) jdbc 驱动程序和其他所有配置都正确,因为我可以在 NIFI 中使用非安全的 postgres。
非常感谢。
一位同事找到了 'simple solution' 我提出的问题,我想分享它以帮助其他人。
缺少的是 属性 sslmode = require。包括在内之后,该服务运行良好。实际上,我不确定为什么它不能与 sslmode = prefer 一起使用,因为它是我的 pgadmin 用于同一个数据库的,并且它在那里工作得很好。在这种情况下,似乎我们必须 'force' nifi 才能使用 ssl - 请参阅此处的文档:https://jdbc.postgresql.org/documentation/head/ssl-client.html.
此外,一些见解:
它使用“.der”格式的证书和“.pk8”格式的密钥(不必在其他服务中使用信任库和密钥库)。
可以在 'plus' 按钮中添加属性并为它们指定正确的名称,就像我们在 java 代码中所做的那样,而不是连接每个 属性在连接字符串中(参见上面问题中的第二个选项)。
让它也能帮助到其他人。
我在 openshift 中有一个 NIFI 映像 运行,在云中有一个 postgres "owned" 由另一个部门提供。
他们向我们发送了一个证书(".crt") 和一个密钥(".key"),因为登录是通过客户端证书进行的,而不是用户名和密码。我已成功登录pgAdmin 4,但无法使用证书和密钥将NIFI连接到Postgres。
我已经将证书和密钥上传到图像(使用秘密并安装它)所以如果我去 pod 终端我可以访问它。
但是,当我将下面的连接字符串传递给 DBCPConnectionPoll 服务并激活 ExecuteSQL 处理器时,我收到证书无效的异常,如下所示:
ERROR
ExecuteSQL[id=...] Unable to execute SQL query <...>;
due to java.sql.SQLException: Cannot create a PoolableConnectionFactory (FATAL: connection requires a valid client certificate).
No FlowFile to route to failure: org.apache.nifi.processor.exception.ProcessException: java.sql.SQLException: Cannot create a PoolableConnectionFactory (FATAL: connection requires a valid client certificate)
我已经尝试通过两种方式将证书传递给 DBCPConnectionPoll 服务:
1) 作为连接字符串中的参数 ("database connection url" 属性:
jdbc:postgresql://<ip>:<port>/<username>?user=<username>&sslTrue&sslcert=/etc/.../mycerts/mycert.der&sslkey=/etc/.../mycerts/mykey.key.pk8
2) 在服务中添加属性(+ 按钮和参数名称以及路径作为值)并将其作为 url:
传递jdbc:postgresql://<ip>:<port>/<username>
一般来说,两者似乎都可以工作,因为我可以连接到另一个不需要 ssl 认证的 postgres。
一些注意事项:
1) 我的假设这里是NIFI中的连接字符串不知道正确读取证书和密钥的文件路径。
2) 我已经将证书多次转换为 java 可以接收的不同类型,以便查看是否是问题所在,但我仍然收到相同的异常。所以看起来连接池根本就没有 "achieve" 文件。不过,如果有人对这个话题有发言权,在主要问题解决后,它会派上用场。所以也感谢这里的一些提示。
3) 我也阅读了 NIFI 源代码,NIFI 似乎通常使用 JDBC 类 来创建连接池,所以我传递的连接字符串在 java 代码,但不知何故在 NIFI 中不起作用(写在 java)。
4) jdbc 驱动程序和其他所有配置都正确,因为我可以在 NIFI 中使用非安全的 postgres。
非常感谢。
一位同事找到了 'simple solution' 我提出的问题,我想分享它以帮助其他人。
缺少的是 属性 sslmode = require。包括在内之后,该服务运行良好。实际上,我不确定为什么它不能与 sslmode = prefer 一起使用,因为它是我的 pgadmin 用于同一个数据库的,并且它在那里工作得很好。在这种情况下,似乎我们必须 'force' nifi 才能使用 ssl - 请参阅此处的文档:https://jdbc.postgresql.org/documentation/head/ssl-client.html.
此外,一些见解:
它使用“.der”格式的证书和“.pk8”格式的密钥(不必在其他服务中使用信任库和密钥库)。
可以在 'plus' 按钮中添加属性并为它们指定正确的名称,就像我们在 java 代码中所做的那样,而不是连接每个 属性在连接字符串中(参见上面问题中的第二个选项)。
让它也能帮助到其他人。