此erlang代码会引发异常,我不知道为什么

问题描述:

我正在使用Windows证书颁发机构(AD CS)为RabbitMQ Windows服务和客户端之间的安全连接中的参与者颁发证书。此erlang代码会引发异常,我不知道为什么

我的客户证书的主题是LDAP我的专有名称(DN): “CN =约翰·鲁伊兹,CN =用户,DC = devexample,DC = COM”

当我尝试建立这种连接,服务器抛出一个异常,并关闭连接,我看到兔子日志本二郎堆栈跟踪:

=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

的问题是,我已经不会读也不会写之前二郎,所以我不知道为什么find_by_type被抛出异常。我最好的猜测是,因为在相对DN(RDN)列表中有两个CN = *元素,所以调用列表的结果是:flatten是一个数组,而预期的结果是一个标量。

有人可以熟悉erlang请确认或纠正我的假设吗?如果您看到可以改进代码以处理我刚才描述的情况(而不是抛出异常)的方式,那么我会非常感激,以便我可以在RabbitMQ邮件列表中对其进行建议。

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

+0

虽然我同意有两个CN没什么意义,但这是它在Windows上的工作方式。域用户在CN = Users,DC = domain,DC = tld中创建,这意味着用户将拥有包含两个CN元素的DN。 – 2011-12-30 19:42:00

+0

嗯,奇怪。如果您只想忽略第一个CN,则可以将find_by_type中的[_,CN]添加到案例中,而不是[CN]。但更多的是临时性的解决方案,而不是你想在生产中想要的任何东西。 – Lukas 2011-12-30 20:13:35

+0

我不想完全忽略它。基于openssl的证书只能有一个CN元素。作为临时修复,我宁愿首先检查数组是否有多个元素,如果是这样,只需使用第一个元素。代码是什么样的? – 2011-12-30 21:04:58