Ruby on rails Ruby验证安全ldap服务器的证书
我正在使用(NETLDAP)gem验证rails应用程序中用户的真实性。但在将数据传递到ldap服务器之前,我需要验证我正在与同一个安全服务器进行通信。 是否有一种变通方法允许我用ruby验证证书 其他细节:(我尝试过的事情)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
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
}
)