这个erlang代码抛出一个异常,我不知道为什么

时间:2011-12-30 19:05:39

标签: ssl erlang rabbitmq flatten

我正在使用Windows证书颁发机构(AD CS)为RabbitMQ Windows服务和客户端之间的安全连接中的参与者颁发证书。

我的客户端证书的主题是我在LDAP中的专有名称(DN): “CN = John Ruiz,CN = Users,DC = devexample,DC = com”

当我尝试建立此连接时,服务器抛出异常并关闭连接,我在兔子日志中看到这个erlang堆栈跟踪:

=ERROR REPORT==== 30-Dec-2011::10:33:24 ===
exception on TCP connection <0.331.0> from 10.1.30.70:52269
{channel0_error,starting,
    {error,{case_clause,[{printableString,"Users"},
                         {printableString,"John Ruiz"}]},
                         'connection.start_ok',
                         [{rabbit_ssl,find_by_type,2,[]},
                         {rabbit_auth_mechanism_ssl,init,1,[]},
                         {rabbit_reader,handle_method0,2,[]},
                         {rabbit_reader,handle_method0,3,[]},
                         {rabbit_reader,handle_input,3,[]},
                         {rabbit_reader,recvloop,2,[]},
                         {rabbit_reader,start_connection,7,[]},
                         {proc_lib,init_p_do_apply,3,
                             [{file,"proc_lib.erl"},{line,227}]}]}}

查看堆栈跟踪中的最后两行,我发现涉及两个文件:

  1. rabbit_ssl.erl
  2. rabbit_auth_mechanism_ssl.erl
  3. 问题是我之前既没有读过也没有写过erlang,所以我不知道为什么find_by_type会抛出异常。我最好的猜测是,由于相对DN(RDN)列表中有两个CN = *元素,因此调用list:flatten的结果是一个数组,而预期的结果是一个标量。

    熟悉erlang的人可以确认或纠正我的假设吗?如果您看到一种方法可以改进此代码来处理我刚才描述的情况(而不是抛出异常),我真的很感激它,以便我可以在RabbitMQ邮件列表上建议它。

1 个答案:

答案 0 :(得分:1)

你的猜测是正确的。它崩溃了,因为有两个CN = *元素。看看代码似乎很多,这取决于只有一个CN。 CN本身被用作ssl会话的用户名,我认为有多个没有意义。