如何告诉 Ruby Net/Ldap 忽略服务器证书主机名不匹配?

Kok*_*oko 4 ruby openldap

我正在设置一个测试环境,其中包含我们生产服务器的 VM 克隆。我在单个 IP(在虚拟机管理程序上)后面拥有所有克隆,并执行 NAT (Linux) 以访问测试环境中的服务。

我的测试实例 IP 上有一个 DNS 记录,名为“test.internal.com”。当我想在“测试”中联系 LDAP 服务器时,我可以ldapsearch从命令行发出以检索信息(成功 OK)。

现在我想连接到测试实例来测试我的 Ruby 应用程序,但是当我连接时,Ruby 说:hostname "test.internal.com" does not match the server certificate (Net::LDAP::Error). 显然这是真的,因为我的 LDAP 服务器上的证书没有为test.internal.com.

我是否需要为我的 LDAP 服务器获取一个新证书,并为其提供替代名称,test.internal.com或者是否有某种方法可以告诉 Ruby 忽略该问题?我已经找到OpenSSL::SSL::VERIFY_NONE了,tls_options但似乎没有用。

#!/usr/bin/ruby

require 'net/ldap'
require 'io/console'
require 'highline/import'

ldapHost = 'test.internal.com'
ldapPort = '8389'
baseDn   = "dc=internal,dc=com"

user = gets
username = "uid=" + user + ',ou=users,dc=internal,dc=com'
password = ask("Password: ") { |q| q.echo = "*" }

ldap_con = Net::LDAP.new ({   :host => ldapHost,
                              :port => ldapPort,
                              :base => baseDn,
                              :encryption => :start_tls, tls_options: { verify_mode: OpenSSL::SSL::VERIFY_NONE },
                              :auth => { :method => :simple, :username => username, :password => password }
                           })

op_filter = Net::LDAP::Filter.eq( "objectClass", "posixGroup" )

ldap_con.search( :base => baseDn, :filter => op_filter, :attributes=> 'dn') do |entry|
  puts "DN: #{entry.dn}"
end
Run Code Online (Sandbox Code Playgroud)

小智 8

与文档相反, tls_options 不是连接对象的顶级参数,而是encryption键的参数:

ldap_con = Net::LDAP.new ({   :host => ldapHost,
                              :port => ldapPort,
                              :base => baseDn,
                              :encryption => {
                                  :method => :start_tls,
                                  :tls_options => { :verify_mode => OpenSSL::SSL::VERIFY_NONE }
                              },
                              :auth => { :method => :simple, :username => username, :password => password }
                       })
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案对我有用,应该是公认的答案 (2认同)