[Pkg-erlang-devel] Bug#933040: ejabberd: certificates created with GnuTLS no longer compatible with ejabberd

Gerald Turner gturner at unzane.com
Fri Jul 26 19:17:06 BST 2019


On Fri, Jul 26 2019, Philipp Huebner wrote:
> Hi,
>
> thank you very much for this detailed bugreport!
>
> I have contacted upstream, and they requested sample certificates
> (PEMs) for ejabberd (cert+key) and CA (without key).

Great!  Did they really want the host key PEM file?  Otherwise I'd send
the real-world certificates I'm using.  Instead I've attached all of the
fictitious certificates and keys generated with the script from the
previous mail (four files: root CA cert, intermediate CA cert, and host
cert and key).

On a random machine running Debian buster that hadn't been running
ejabberd before, I've been able to reproduce this bug with the following
steps:

  1. apt install ejabberd (debconf questions won't matter).

  2. Copy the four attached certs/keys to /etc/ejabberd.

  3. Edit ejabberd.yml with:

       hosts:
         - "jabber.example.com"

       certfiles:
          - "/etc/ejabberd/ejabberd-cert.pem"
          - "/etc/ejabberd/ejabberd-key.pem"
          - "/etc/ejabberd/private-int-cert.pem"
          - "/etc/ejabberd/private-ca-cert.pem"

   4. systemctl restart ejabberd

   5. Examine output of the following commands:

        gnutls-cli -V \
          --x509cafile=/etc/ejabberd/private-ca-cert.pem \
          --verify-hostname=jabber.example.com \
          -p 5223 \
          localhost:5223 < /dev/null

       certtool --certificate-info \
         --load-certificate /etc/ejabberd/ejabberd-cert.pem

The gnutls-cli command reports:

  Status: The certificate is NOT trusted. The signature in the
  certificate is invalid.

Earlier in the gnutls-cli output is the signature received on the wire:

  sha1:647fe53a3b279f605d2ec7a572c54724f0765285

The certtool command shows a different signature:

  sha1:9789b39f3b5bde6a8c5b7dd2c11c25c901199edf

So somehow ejabberd is recomputing the signature when it should match
what's in the PEM file verbatim.

> I tried running your script on Buster, but it fails:
> $ ./gen
> Password: test
> Generating private-int-key.pem...
> Assuming PKCS #8 format...
> ** Note: You may use '--sec-param High' instead of '--bits 4096'
> Generating a 4096 bit RSA private key...
> Generating private-int-req.pem...
> Generating a PKCS #10 certificate request...
> Generating private-int-cert.pem
> Generating a signed certificate...
> error importing CA certificate: public/private-ca-cert.pem: Base64
> unexpected header error.

Oops!  I see, I tried this again on buster too.  The newer version of
certtool seems to require that serial numbers are not zero (change
"serial = 1" in private-ca.template, and change "crl_number = 1" in
private-ca-crl.template).  Another problem with the script is that if a
certtool command fails, it still touches a file with zero bytes, so the
next run doesn't retry generation (i.e. just "rm -rf private public", or
rm the specific zero byte PEM file, and try again).

> With sample PEMs I'll forward this to an issue at
> https://github.com/processone/pkix, you're welcome to do it yourself
> if you like.

Thanks.  I do not have a GH account and would appreciate this very much.

> FWIW, upstream also suspects this to be a bug in Erlang itself rather
> than ejabberd, hence I'm CCing the Erlang maintainer(s).

Interesting.

The following is a bit of an anecdote (TL;DR I'm willing to rebuild
newer versions and test if that'll help): while chasing down another
problem (Debian BTS #933042, after having resorted to using a temporary
OpenSSL signed cert, bypassing this bug, and then could not get ejabberd
to accept TLSv1.0 client connections), I happened to notice that the
erlang-p1-tls repository on salsa had already been prepared for the
latest release (which has some commits mentioning more OpenSSL wrapper
code has moved into the C binding).  I built erlang-p1-tls 1.1.1 but
didn't have any luck with the issue at hand, so I reverted to the buster
released versions.  Perhaps it's worth another try with the newer
erlang-p1-tls package and looking at this certificate issue?

-- 
Gerald Turner <gturner at unzane.com>        Encrypted mail preferred!
OpenPGP: 4096R / CA89 B27A 30FA 66C5 1B80  3858 EC94 2276 FDB8 716D
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: private-ca-cert.pem
URL: <http://alioth-lists.debian.net/pipermail/pkg-erlang-devel/attachments/20190726/6624aaa6/attachment-0004.ksh>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: private-int-cert.pem
URL: <http://alioth-lists.debian.net/pipermail/pkg-erlang-devel/attachments/20190726/6624aaa6/attachment-0005.ksh>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: ejabberd-cert.pem
URL: <http://alioth-lists.debian.net/pipermail/pkg-erlang-devel/attachments/20190726/6624aaa6/attachment-0006.ksh>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: ejabberd-key.pem
URL: <http://alioth-lists.debian.net/pipermail/pkg-erlang-devel/attachments/20190726/6624aaa6/attachment-0007.ksh>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 962 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/pkg-erlang-devel/attachments/20190726/6624aaa6/attachment-0001.sig>


More information about the Pkg-erlang-devel mailing list