I finally managed to setup multi-supplier replication with certificate-based authentication.
I now understand why people says it is a complicated stuff and they wish luck
to the guy trying to do it.
It is actually not that much complicated, once you know what to do.
Follow my instructions and see for yourself.
Start with reading the documentation (Red Hat Directory Server 11)
9. Configuring Secure Connections
15. Managing Replication
and in particular:
9.9.1. Setting up Certificate-based Authentication
15.4. Multi-Supplier Replication
15.6. Configuring Replication Partners to use Certificate-based Authentication
In the following examples I'll assume the two hosts are called
host1.example.com and host2.example.com
you have setup on each host a directory server instance called "ldaptest" with
self-signed CA certificate.
The root suffix stored in the database is: dc=example,dc=com
You have to execute the steps described in 15.6:
- create two accounts for both servers
- add to the accounts the user certificate
- create the replication group
- add both server accounts to such group
- create the replica entry (dsconf ... replication enable ... --bind-group-dn=<replication group>)
- initialize the server using a temporary replication agreement on host1
and a temporary replication manager on host2 (to be more precise on host2 you have to enable
replication for the suffix and create the temporary replication manager account [15.4.1 step 3])
- after initialization remove the temporary replication agreement on host1
and the temporary replication manager on host2
- create a replication agreement on both servers that use certificate-based authentication.
You do everything as described, but when you create the replication agreement on host1
(as showed in 15.6 step 5/a), things do not work.
The error log shows:
ERR - NSMMReplicationPlugin - bind_and_check_pwp - agmt="cn=agreement" (host2:636) - Replication bind with EXTERNAL auth failed: LDAP error 49 (Invalid credentials)
the cause is that host2 does not know from which account to retrieve the user certificate. To fix this problem
you have to set the parameter CmapLdapAttr in certmap.conf in the following way:
1) Set the parameter CmapLdapAttr to nsCertSubjectDN
nsCertSubjectDN is the attribute that will contain the subject DN required to locate the host account.
2) When you create the account for the server and add to such account the client certificate (15.6 step 2/a)
add also the attribute nsCertSubjectDN with the value I'm going to describe below.
Run the command:
certutil -L -d /etc/dirsrv/slapd-ldaptest -n "Server-Cert" | grep "Subject"
You will see the subject of the server certificate. Something similar to:
for such subject the value to assign to the attribute nsCertSubjectDN is:
That is: you have to flip the case of the attribute type (cn,o,ou,st,c, etc.)
Why it is like that and more important why it is not documented I don't know.
Once nsCertSubjectDN is set correctly and you create the replication agreement on host1
(as described in 15.6 step 5/a) you will now get this error message in the log:
ERR - NSMMReplicationPlugin - acquire_replica - agmt="cn=agreement" (host2:636): Unable to acquire replica: permission denied. The bind dn "" does not have permission to supply replication updates to the replica. Will retry later.
This error is due to the fact that on host2 the replication is still enabled
for bind-dn="cn=replication manager,cn=config"
you have to disable such replica entry and create a new replica entry
with --bind-group-dn=<replication group> similar to the one you did on host1.
After you do that the replication should work.
Unless it doesn't.
If you have created a self signed CA certificate and you are
in a timezone with negative offset (GMT-<n>) like in America,
then a bug will not make the replication work.
Here is what happens. Assume you are in the timezone GMT-4.
It's 10:00 and a self signed CA certificate is created while
running the command dscreate.
Check the validity of the certificate with:
certutil -L -d /etc/dirsrv/ssca -n Self-Signed-CA | grep Not
the output is something like:
Not Before: Tue Mar 08 14:00:00 2022
Not After : Fri Mar 08 14:00:00 2024
As you can see the certificate uses UTC time:
14:00 UTC corresponds to 10:00 GMT-4
Now somewhere in the directory server code the time stored
in the CA certificate is assumed to be in local time,
therefore since it is 10:00 and the certificate is not
valid before 14:00, the replication does not work.
In the error log you will see the message:
ERR - NSMMReplicationPlugin - acquire_replica - agmt="cn=agreement" (host2:636): Unable to acquire replica: permission denied. The bind dn "uid=host1.example.com,ou=people,dc=example,dc=com" does not have permission to supply replication updates to the replica. Will retry later.
You can either wait few hours until the certificate becomes valid,
or you can change the system clock just before you are running dscreate:
date -s "$(date +%:::z) hours" #move the clock backwards
date -s "$(( $(date +%:::z) * -1)) hours" #restore the correct time
Continuing with the previous example, the CA certificate
will be now valid since 10:00 GMT leaving the replication
process unaffected by the bug.
add the attribute nsCertSubjectDN with correct value to the host accounts,
update the replica entry on host2 after the temporary agreement has done its job,
consider changing the system clock when you use the command dscreate.
I wish to thank David and William for their help.
I have never used 389-ds before and what they said helped me
investigate the proper cause of my problems.
389-users mailing list -- firstname.lastname@example.org
To unsubscribe send an email to email@example.com
Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: https://firstname.lastname@example.org
Do not reply to spam on the list, report it: https://pagure.io/fedora-infrastructure