.NET中如何为启用TLS的容器化OpenLDAP配置LdapConnection
容器化OpenLDAP的TLS/SSL连接配置问题
我部署了容器化的OpenLDAP服务器,当设置TLS/SSL为false运行容器时,C# 7.0代码可以正常连接:
无TLS的容器启动命令
sudo docker run \ --name openldap-server \ --rm \ --publish 389:389 \ --hostname my.ldap.server.org \ --env LDAP_ORGANISATION="My LDAP organization" \ --env LDAP_DOMAIN="my.ldap.server.org" \ --env LDAP_BASE_DN="dc=my,dc=ldap,dc=server,dc=org" \ --env LDAP_ADMIN_PASSWORD="test" \ --volume /data/slapd/database:/var/lib/ldap \ --volume /data/slapd/config:/etc/ldap/slapd.d \ --env LDAP_TLS=false \ --detach osixia/openldap:latest
正常连接的C#代码
var ldapConnection = new LdapConnection(new LdapDirectoryIdentifier(serverIp, 389)) { AuthType = AuthType.Basic }; ldapConnection.SessionOptions.ProtocolVersion = 3; string username = "uid=test,ou=person,dc=my,dc=ldap,dc=server,dc=org", password = "test"; ldapConnection.Bind(new NetworkCredential(username, password));
但启用TLS/SSL重启容器后,我无法通过C#代码正常连接:
启用TLS的容器启动命令
sudo docker run \ --name openldap-server \ --rm \ --publish 636:636 \ --hostname my.ldap.server.org \ --env LDAP_ORGANISATION="My LDAP organization" \ --env LDAP_DOMAIN="my.ldap.server.org" \ --env LDAP_BASE_DN="dc=my,dc=ldap,dc=server,dc=org" \ --env LDAP_ADMIN_PASSWORD="test" \ --volume /data/slapd/database:/var/lib/ldap \ --volume /data/slapd/config:/etc/ldap/slapd.d \ --volume /data/certificates:/container/service/slapd/assets/certs \ --env LDAP_TLS_CRT_FILENAME=server.crt \ --env LDAP_TLS_KEY_FILENAME=server.key \ --env LDAP_TLS_CA_CRT_FILENAME=ca.crt \ --detach osixia/openldap:latest
当前尝试的C#代码(未成功)
var ldapConnection = new LdapConnection(new LdapDirectoryIdentifier(serverIp, 636)) { AuthType = AuthType.Basic // AuthType = AuthType.Negotiate }; ldapConnection.SessionOptions.SecureSocketLayer = true; // var serverCrt = File.ReadAllText("<my certificate directory>/server.crt"); // var serverKey = File.ReadAllText($"<my certificate directory>/server.key"); // var serverCertificate = X509Certificate2.CreateFromPem(serverCrt, serverKey); // var serverCertificate = X509Certificate.CreateFromCertFile("<my certificate directory>/server.crt"); // var caCertificate = new X509Certificate("<my certificate directory>/ca.crt"); // connection.SessionOptions.VerifyServerCertificate = new VerifyServerCertificateCallback((connection, serverCertificate ) => true); // connection.SessionOptions.VerifyServerCertificate = delegate { return true; }; ldapConnection.SessionOptions.ProtocolVersion = 3; ldapConnection.Bind(new NetworkCredential("uid=test,ou=person,dc=my,dc=ldap,dc=server,dc=org", "test"));
我需要解决两个问题:
- 当OpenLDAP服务器需要服务器证书和CA证书时,如何配置C#代码中的LdapConnection以通过TLS/SSL连接?我不想将证书安装在主机上,因为代码会运行在容器中,证书是运行时挂载的。
- 我怀疑证书生成有误:服务器证书的*Common Name(CN)*为
my.ldap.server.org,但CA的CN是OpenLDAP容器宿主机的用户名(容器内用户名不同),这是否会导致连接失败?
内容的提问来源于stack exchange,提问作者HasQuestionsAndAnswers
相关产品推荐
相关产品推荐

