Ruby on rails Ruby验证安全ldap服务器的证书

Ruby on rails Ruby验证安全ldap服务器的证书,ruby-on-rails,ruby,openssl,ldap,netldap,Ruby On Rails,Ruby,Openssl,Ldap,Netldap,我正在使用(NETLDAP)gem验证rails应用程序中用户的真实性。但在将数据传递到ldap服务器之前,我需要验证我正在与同一个安全服务器进行通信。 是否有一种变通方法允许我用ruby验证证书 其他细节:(我尝试过的事情) 传递给我的证书与我运行时看到的证书相同 openssl s_client -showcerts -connect "<host>:<port>" </dev/null 2>/dev/null|openssl x509 -outform

我正在使用(NETLDAP)gem验证rails应用程序中用户的真实性。但在将数据传递到ldap服务器之前,我需要验证我正在与同一个安全服务器进行通信。 是否有一种变通方法允许我用ruby验证证书

其他细节:(我尝试过的事情)

  • 传递给我的证书与我运行时看到的证书相同

    openssl s_client -showcerts -connect "<host>:<port>" </dev/null 2>/dev/null|openssl x509 -outform PEM
    
    代码:


  • 为了完整起见,我在这里发布我的解决方案

    net ldap gem覆盖以支持证书验证

    理想溶液:
    在服务器上维护受信任的根CA列表 (如果您像我一样懒惰,请使用cron作业,该作业将从下载(每周由curl维护)副本)
    重写Net::HTTP以始终使用此受信任证书列表

    从今天(2016年底)起,ruby Net ldap支持此上游!但是,
    tls\u选项
    需要在
    verify\u模式
    设置为默认值以外的值时传递

    # optional: create/pass your own cert_store
    cert_store = OpenSSL::X509::Store.new
    cert_store.set_default_paths # or add your own CAdir, &c.
    
    # attributes documented for OpenSSL::SSL::SSLContext are valid here
    tls_options = {
      verify_mode: OpenSSL::SSL::VERIFY_PEER
      cert_store: cert_store
    }
    
    ldap = Net::LDAP.new(
      :host => host,
      :port => port,
      :encryption => {
        :method => :simple_tls, # could also be :start_tls
        :tls_options => tls_options
      }
    )
    

    我和你遇到了同样的问题,我已经在这里发布了对我有效的解决方法。如果您仍然需要,请发布它
    cert_store = OpenSSL::X509::Store.new
    cert_store.add_file "server-wildcard.crt"
    io = TCPSocket.new("SECURELDAP.MYSITE.EDU","636")
    ctx = OpenSSL::SSL::SSLContext.new
    #ctx.cert = OpenSSL::X509::Certificate.new(File.read("server-wildcard.crt"))
    #ctx.client_ca = OpenSSL::X509::Certificate.new(File.read("server-wildcard.crt"))
    #ctx.ca_file = "server-wildcard.crt"
    #ctx.ca_path = "./"
    ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
    ctx.cert_store = cert_store
    conn = OpenSSL::SSL::SSLSocket.new(io, ctx)
    conn.connect
    
    # optional: create/pass your own cert_store
    cert_store = OpenSSL::X509::Store.new
    cert_store.set_default_paths # or add your own CAdir, &c.
    
    # attributes documented for OpenSSL::SSL::SSLContext are valid here
    tls_options = {
      verify_mode: OpenSSL::SSL::VERIFY_PEER
      cert_store: cert_store
    }
    
    ldap = Net::LDAP.new(
      :host => host,
      :port => port,
      :encryption => {
        :method => :simple_tls, # could also be :start_tls
        :tls_options => tls_options
      }
    )