2

我想使用我的 OPENLDAP ldap 执行基于证书的身份验证。

我创建了一个 PKI,使用良好的密钥库、信任库/证书、密钥设置我的客户端和服务器。我还将 LDAP 配置为在 SSL 握手期间要求证书。

然后我尝试使用 UnboudID LDAP 进行身份验证,如下所示:

    //Create a unsecured connection

    LDAPConnection connection = new   LDAPConnection(hostname,port);

    //Secure the connection by the use of SSL (StartTLS operation)

    SSLUtil ssl = new SSLUtil(new KeyStoreKeyManager(keyStore, new String("somePasword").toCharArray()),
            new TrustStoreTrustManager(trustStore));
    SSLContext sslContext = ssl.createSSLContext();
    StartTLSExtendedRequest startTLSRequest = new StartTLSExtendedRequest(sslContext);
    ExtendedResult startTLSResult = connection.processExtendedOperation(startTLSRequest);

    //Bind request that should retrieve information from the client certificate and authenticate the client

    BindRequest bindRequest = new EXTERNALBindRequest("");
    BindResult bindResult = connection.bind(bindRequest);

    //The result is always SUCCESS...
    if (bindResult.getResultCode() != ResultCode.SUCCESS) {
        ...
    }

我要将连接绑定到的用户的 DN 对应于: cn=12345,ou=anOrganizationUnit,o=anOrganization,dc=com,dc=example. 由于来自证书的 DN 看起来像:cn=12345,ou=...,o=...,l=Berlin,st=some-state,c=de我还在 LDAP 中创建了一个匹配规则。

只要我有 CA 签署的证书,bindRequest 总是会成功。如果来自 LDAP 的 DN 与 LDAP 中的任何内容不对应,则无关紧要。我猜它被转换为匿名连接。但是当它对应于现有用户时,也没有关系。用户未通过身份验证,我无权访问用户的权限。我尝试执行 WhoAmI 请求,它返回: authzId=dn:cn=12345,ou=anorganizationunit,o=anorganization,dc=com,dc=example这似乎很好(大写字母转换为小写字母)。

我在 LDAP 配置中遗漏了什么吗?还是我的证书?

我会非常感谢任何帮助:)

编辑: 我不知道这是否有帮助,但在添加匹配规则之前,我执行了 WhoAmI 请求,结果类似于: dn:cn\3D12345\2C...,o=organization,dc=com,dc=example. 我在证书创建期间输入的通用名称似乎已被转义(\3D 是“=”,\2C 是“,”)。

4

1 回答 1

0

我会回答我自己的问题,尽管已经很长时间了,而且我无法访问代码。

我很确定问题对应于 CN 部分的转义。我记得我的匹配规则不正确,我认为这是根本原因。但老实说,我不记得可能还有其他错误。

于 2017-12-31T06:29:47.943 回答