NiFi如何在SSL上下文服务中绕过主机名验证

6
我正在尝试通过NiFi 1.5.0中的GetHTTP处理器连接到REST端点。我面临的问题是SSL证书是针对域名颁发的,但我只能直接访问IP:Port地址(公司防火墙)。因此,我遇到的问题是主机名和证书所有者不匹配,IP未添加为主题备用名称。 当我尝试连接时,会出现以下错误消息: javax.net.ssl.SSLPeerUnverifiedException: Certificate for <[IP-ADDRESS]> doesn't match any of the subject alternative names: [] 是否有方法可以绕过主机名验证?我找到了这个NiFi Jira ticket,但似乎还没有解决。是否有我可以使用的解决方法?
2个回答

5
你可以尝试使用InvokeHttp,并使用“Trusted Hostname”属性。

我们应该将它设置为什么?它是一个真/假属性吗? - RisJi
它是受信任的主机名。 - Bryan Bende
1
我正在使用Nifi 1-14.0版本。在InvokeHttp处理器中,我找不到Trusted Hostname属性。我应该在其他地方寻找吗? - Jason D
我发现这个属性现在已经被移除了:https://www.mail-archive.com/issues@nifi.apache.org/msg102529.html。 我想知道如何解决这个问题。 - Jason D

0

由于“Trusted Hostname”属性在最近的NiFi版本中已被弃用,因此您可以使用带有Ruby的ExecuteScript处理器。以下是示例。 POST请求的正文必须在FlowFile内容中。响应正文将在处理器之后在FlowFile内容中。

require "uri"
require "net/http"
require "openssl"

java_import org.apache.commons.io.IOUtils
java_import java.nio.charset.StandardCharsets
java_import org.apache.nifi.processor.io.StreamCallback

# Define a subclass of StreamCallback for use in session.read()
class JRubyStreamCallback
  include StreamCallback
  def process(inputStream, outputStream)
    text = IOUtils.toString(inputStream, 'utf-8')

    url = URI("https://...")
    https = Net::HTTP.new(url.host, url.port)
    https.use_ssl = true
    https.verify_mode = OpenSSL::SSL::VERIFY_NONE
    request = Net::HTTP::Post.new(url)
    request["Authorization"] = "Basic ..."
    request["Content-Type"] = "application/json"
    request.body = text
    response = https.request(request)

    outputStream.write((response.read_body).to_java.getBytes(StandardCharsets::UTF_8))
  end
end

jrubyStreamCallback = JRubyStreamCallback.new
flowFile = session.get()
if flowFile != nil
  flowFile = session.write(flowFile, jrubyStreamCallback)
  session.transfer(flowFile, REL_SUCCESS)
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接