【问题标题】:Ruby verify the certificate of secure ldap serverRuby 验证安全 ldap 服务器的证书
【发布时间】:2013-09-12 08:42:44
【问题描述】:

我正在使用 https://github.com/ruby-ldap/ruby-net-ldap (net-ldap) gem 在我的 rails 应用程序中验证用户的真实性。但在将数据传递给 ldap 服务器之前,我需要验证我正在与同一个安全服务器通信。 是否有一种解决方法可以让我在 ruby​​ 中验证证书

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

  1. 传给我的证书和我跑步时看到的一样

    openssl s_client -showcerts -connect "<host>:<port>" </dev/null 2>/dev/null|openssl x509 -outform PEM
    
  2. 我使用http://www.ldapsoft.com/ 连接到客户端的服务器 除非我在 安全 > 管理服务器证书 中添加给我的证书文件,否则我会收到一条警告说未知安全证书

  3. 我尝试先用纯红宝石手动完成(没有宝石) 但我得到以下错误

    test-ssl.rb:23:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
    

    代码:

    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
    

【问题讨论】:

标签: ruby-on-rails ruby openssl ldap netldap


【解决方案1】:

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

net-ldap gem 覆盖以支持证书验证 https://gist.github.com/mintuhouse/9931865

理想的解决方案:
在您的服务器上维护受信任的根 CA 列表 (如果你像我一样懒惰,有一个 cron 作业,它将从 http://curl.haxx.se/ca/cacert.pem 下载(每周由 curl 维护)副本)
覆盖 Net::HTTP 以始终使用此受信任的证书列表

【讨论】:

    【解决方案2】:

    截至今天(2016 年底),ruby-net-ldap 支持上游!但是,tls_options 需要在 verify_mode 设置为默认 VERIFY_NONE 以外的值的情况下传递。

    # 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
      }
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 2015-05-13
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      相关资源
      最近更新 更多