我需要帮助为安全 LDAP 构建正向代理。
客户端连接到 TCP 代理,并且请求必须重定向到 TCP 636 处的安全 LDAP。
[client]------->[localhost:636 Nginx-proxy]----TLS---->[db.debian.org:636 secure LDAP]
我尝试使用 Nginx 来构建它。
但是 TLS 连接无法正常工作。
看起来 上的证书有点乱localhost
。 上的 TLS 代理应该使用什么证书localhost
?
如果 Nginx 在 Kubernetes 的容器中运行会怎么样?如果它在 上作为服务公开会怎么样*.svc.custer.local
?
ldapsearch
工作代理的访问日志位于ldaps://localhost
ldapsearch -x -b "dc=org" -H ldaps://localhost -v -d8
ldap_initialize( ldaps://localhost:636/??base )
TLS: hostname (LAPTOP-I14D4GNQ.) does not match common name in certificate (db.debian.org).
TLS: can't connect: (unknown error code).
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
LDAPS 请求可以忽略服务器上的证书:
LDAPTLS_REQCERT=never ldapsearch -x -b "dc=org" -H ldaps://localhost -v -d8
ldap_initialize( ldaps://localhost:636/??base )
filter: (objectclass=*)
requesting: All userApplication attributes
# extended LDIF
#
# LDAPv3
这是我的 Nginx 配置
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /tmp/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
listen 8080;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
stream {
server {
listen 636;
proxy_pass db.debian.org:636;
}
}
答案1
对于 nginx,您必须配置一个stream
块来终止来自客户端的 SSL/TLS 连接 - 使用客户端信任的证书作为客户端使用的主机名,见下文 - 并与上游服务器建立新的 SSL/TLS 连接,类似于:
stream {
server {
listen 0.0.0.0:636 ssl;
listen [::]:636 ssl; # not actually needed since I ended up using IPv4 addressing, see below
ssl_certificate /home/dthomps/certs/loc3bcert3.pem;
ssl_certificate_key /home/dthomps/certs/srvx.pem; # or appended to above
proxy_pass db.debian.org:636;
proxy_ssl on;
#proxy_ssl_name if necessary
proxy_ssl_verify on;
proxy_ssl_verify_depth 9; # should be plenty
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
}
}
在我的 (Ubuntu) 系统上,/etc/ssl/certs/ca-certificates.crt
是“标准” CA 的默认 PEM 格式信任库,其中包括 db.debian.org 使用的 CA(当前?),即 LetsEncrypt 又名 ISRG。它还可以包括使用 进行的本地修改update-ca-certificates
;见下文。
让客户端 (ldapsearch) 信任 nginx 使用的证书是另一回事。您无法localhost
像从任何标准 CA 那样获得名称或私有/保留地址的证书127.0.0.1
。如果您所在的组织为其内部网运行自己的 (内部) CA,并将其系统设置为信任该 CA,则他们可能能够发出此类。否则你必须创建你的自己的“DIY” CA,向 nginx 颁发证书,并让客户端信任该 CA;在我的情况下,由于之前的工作,我已经设置并信任了这样的 CA(见update-ca-certificates
上文)。即便如此,使用ldapsearch
我拥有的版本 ( ldap-utils 2.4.45+dfsg-1ubuntu1.11
),我无法让它信任 (有效) 证书localhost
(它没有像您那样给我一个详细的错误,只有“无法联系 LDAP 服务器 (-1)”),但它在证书和 URL 中使用 127.0.0.1 可以工作:
$ ldapsearch -v -x -H ldaps://127.0.0.1:636/ -b dc=org
ldap_initialize( ldaps://127.0.0.1:636/??base )
filter: (objectclass=*)
requesting: All userApplication attributes
# extended LDIF
#
# LDAPv3
# base <dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# search result
search: 2
result: 32 No such object
# numResponses: 1
haproxy 类似;您必须设置mode tcp
并创建一个listen
块(或匹配的frontend
和backend
块),以终止来自客户端的 SSL/TLS 并将其发起到服务器。一个细微的差别是 haproxy需要证书和密钥放在一个文件中(nginx 和 apache httpd 将其作为选项)。我使用的 Ubuntu 上的打包配置option httplog
对 tcp 模式无效,因此我也对其进行了更改。
listen x
bind :636 ssl crt /home/dthomps/certs-loc3-combined-temp.pem
server y db.debian.org:636 ssl verify required ca-file ca-certificates.crt verifyhost db.debian.org
# the Ubuntu package has ca-base configured so that ca-file expands to the correct one