3

我正在使用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/连接到客户端的服务器 除非我在Security > Manage server certificate添加给我的证书文件,否则我会收到一条警告说未知安全证书

  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
    
4

2 回答 2

1

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

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

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

于 2014-04-02T11:31:04.620 回答
1

截至今天(2016 年底),ruby-net-ldap 支持上游!但是,tls_options需要verify_mode设置为 default 以外的值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
  }
)
于 2016-12-19T22:03:02.483 回答