Skip to content

Crash in Erlang/OTP 28: {function_clause, [{public_key,get_asn1_module, ['ExtensionRequest'] #4

@badlop

Description

@badlop

In ejabberd compiled with Erlang/OTP 28.0, requesting a certificate using ACME crashes with this message:

2025-06-04 10:17:37.549313+02:00 [error] ** Generic server ejabberd_acme terminating 
** Last message in was {request,[<<"example.myserver.com">>]}
** When Server state == {state}
** Reason for termination ==
** {function_clause,
       [{public_key,get_asn1_module,
            ['SubjectAltName'],
            [{file,"public_key.erl"},{line,576}]},
        {public_key,der_encode,2,[{file,"public_key.erl"},{line,804}]},
        {p1_acme,generate_csr,2,
            [{file,
                 "/home/admin/ejabberd/_build/default/lib/p1_acme/src/p1_acme.erl"},
             {line,770}]},
2025-06-04 10:17:37.549313+02:00 [error] ** Generic server ejabberd_acme terminating 
** Last message in was {request,[<<"example.myserver.com">>]}
** When Server state == {state}
** Reason for termination ==
** {function_clause,
       [{public_key,get_asn1_module,
            ['SubjectAltName'],
            [{file,"public_key.erl"},{line,576}]},
        {public_key,der_encode,2,[{file,"public_key.erl"},{line,804}]},
        {p1_acme,generate_csr,2,
            [{file,
                 "/home/admin/ejabberd/_build/default/lib/p1_acme/src/p1_acme.erl"},
             {line,770}]},
        {p1_acme,generate_csr,1,
            [{file,
                 "/home/admin/ejabberd/_build/default/lib/p1_acme/src/p1_acme.erl"},
             {line,807}]},
        {p1_acme,request_certificate,2,
            [{file,
                 "/home/admin/ejabberd/_build/default/lib/p1_acme/src/p1_acme.erl"},
             {line,392}]},
        {ejabberd_acme,issue_request,7,
            [{file,"/home/admin/ejabberd/src/ejabberd_acme.erl"},{line,230}]},
        {ejabberd_acme,handle_call,3,
            [{file,"/home/admin/ejabberd/src/ejabberd_acme.erl"},{line,125}]},
        {gen_server,try_handle_call,4,[{file,"gen_server.erl"},{line,2470}]}]}
** Client <0.3201.0> stacktrace
** [{gen,do_call,4,[{file,"gen.erl"},{line,262}]},
    {gen_server,call,3,[{file,"gen_server.erl"},{line,1297}]},
    {ejabberd_acme,request_certificate,1,
                   [{file,"/home/admin/ejabberd/src/ejabberd_acme.erl"},
                    {line,492}]},
    {ejabberd_ctl,call_command,4,
                  [{file,"/home/admin/ejabberd/src/ejabberd_ctl.erl"},
                   {line,358}]},
    {ejabberd_ctl,try_call_command,4,
                  [{file,"/home/admin/ejabberd/src/ejabberd_ctl.erl"},
                   {line,319}]},
    {ejabberd_ctl,process2,4,
                  [{file,"/home/admin/ejabberd/src/ejabberd_ctl.erl"},
                   {line,259}]},
    {ejabberd_ctl,process,2,
                  [{file,"/home/admin/ejabberd/src/ejabberd_ctl.erl"},
                   {line,237}]},
    {erpc,execute_call,4,[{file,"erpc.erl"},{line,1262}]}]

2025-06-04 10:17:37.550900+02:00 [error] CRASH REPORT:
  crasher:
    initial call: ejabberd_acme:init/1
    pid: <0.1693.0>
    registered_name: ejabberd_acme
    exception error: no function clause matching 
                     public_key:get_asn1_module('SubjectAltName') (public_key.erl:576)
      in function  public_key:der_encode/2 (public_key.erl:804)
      in call from p1_acme:generate_csr/2 (/home/admin/ejabberd/_build/default/lib/p1_acme/src/p1_acme.erl:770)
      in call from p1_acme:generate_csr/1 (/home/admin/ejabberd/_build/default/lib/p1_acme/src/p1_acme.erl:807)
      in call from p1_acme:request_certificate/2 (/home/admin/ejabberd/_build/default/lib/p1_acme/src/p1_acme.erl:392)
      in call from ejabberd_acme:issue_request/7 (/home/admin/ejabberd/src/ejabberd_acme.erl:230)
      in call from ejabberd_acme:handle_call/3 (/home/admin/ejabberd/src/ejabberd_acme.erl:125)
      in call from gen_server:try_handle_call/4 (gen_server.erl:2470)
    ancestors: [ejabberd_sup,<0.1332.0>]
    message_queue_len: 0
    messages: []
    links: [<0.1561.0>]
    dictionary: [{yconf_ctx,[]}]
    trap_exit: true
    status: running
    heap_size: 4185
    stack_size: 29
    reductions: 2969654
  neighbours:

2025-06-04 10:17:37.568383+02:00 [error] SUPERVISOR REPORT:
    supervisor: {local,ejabberd_sup}
    errorContext: child_terminated
    reason: {function_clause,
                [{public_key,get_asn1_module,
                     ['SubjectAltName'],
                     [{file,"public_key.erl"},{line,576}]},
                 {public_key,der_encode,2,
                     [{file,"public_key.erl"},{line,804}]},
                 {p1_acme,generate_csr,2,
                     [{file,
                          "/home/admin/ejabberd/_build/default/lib/p1_acme/src/p1_acme.erl"},
                      {line,770}]},
                 {p1_acme,generate_csr,1,
                     [{file,
                          "/home/admin/ejabberd/_build/default/lib/p1_acme/src/p1_acme.erl"},
                      {line,807}]},
                 {p1_acme,request_certificate,2,
                     [{file,
                          "/home/admin/ejabberd/_build/default/lib/p1_acme/src/p1_acme.erl"},
                      {line,392}]},
                 {ejabberd_acme,issue_request,7,
                     [{file,"/home/admin/ejabberd/src/ejabberd_acme.erl"},
                      {line,230}]},
                 {ejabberd_acme,handle_call,3,
                     [{file,"/home/admin/ejabberd/src/ejabberd_acme.erl"},
                      {line,125}]},
                 {gen_server,try_handle_call,4,
                     [{file,"gen_server.erl"},{line,2470}]}]}
    offender: [{pid,<0.1693.0>},
               {id,ejabberd_acme},
               {mfargs,{ejabberd_acme,start_link,[]}},
               {restart_type,permanent},
               {significant,false},
               {shutdown,60000},
               {child_type,worker}]

When using Erlang/OTP 28.0.1, the error moves to another line:

2025-07-04 12:45:06.121116+02:00 [error] ** Generic server ejabberd_acme terminating 
** Last message in was {request,[<<"temp-acme.process-one.net">>]}
** When Server state == {state}
** Reason for termination ==
** {function_clause,
       [{public_key,get_asn1_module,
            ['ExtensionRequest'],
            [{file,"public_key.erl"},{line,590}]},
        {public_key,der_encode,2,[{file,"public_key.erl"},{line,833}]},
        {p1_acme,generate_csr,2,
            [{file,
                 "/home/admin/ejabberd2801/_build/default/lib/p1_acme/src/p1_acme.erl"},
             {line,776}]},

This works perfectly when compiled Erlang/OTP 27.3.


This comment points to this source code discussion that seems relevant. An Elixir library apparently bypassed that problem in voltone/x509#90

In any case, a specific bugreport is filled in Erlang/OTP tracker: erlang/otp#10028

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions