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

Ssl 此erlang代码引发异常,我不知道';我不知道为什么,ssl,erlang,rabbitmq,flatten,Ssl,Erlang,Rabbitmq,Flatten,我正在使用Windows证书颁发机构(AD CS)为RabbitMQ Windows服务和客户端之间的安全连接中的参与者颁发证书 我的客户端证书的主题是LDAP中的我的可分辨名称(DN): CN=John Ruiz,CN=Users,DC=devexample,DC=com 当我尝试建立此连接时,服务器抛出异常并关闭连接,我在rabbit日志中看到此erlang堆栈跟踪: =ERROR REPORT==== 30-Dec-2011::10:33:24 === exception on TCP c

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

我的客户端证书的主题是LDAP中的我的可分辨名称(DN): CN=John Ruiz,CN=Users,DC=devexample,DC=com

当我尝试建立此连接时,服务器抛出异常并关闭连接,我在rabbit日志中看到此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}]}]}}
=错误报告===2011年12月30日::10:33:24===
10.1.30.70:52269中的TCP连接异常
{channel0_错误,正在启动,
{error,{case_子句,[{printableString,“Users”},
{printableString,“John Ruiz”}]},
'连接。启动\u正常',
[{rabbit\u ssl,按类型查找,2,[]},
{rabbit\u auth\u机制\u ssl,init,1,[]},
{rabbit_reader,handle_method0,2,[]},
{rabbit_reader,handle_method0,3,[]},
{rabbit_读取器,句柄_输入,3,[]},
{rabbit_reader,recvloop,2,[]},
{rabbit_读取器,启动_连接,7,[]},
{proc_lib,init_p_do_apply,3,
[{file,“proc_lib.erl”},{line,227}]}
通过查看堆栈跟踪中的最后两行,我找到了涉及的两个文件:

  • 问题是我以前既没有读过erlang,也没有写过erlang,所以我不知道为什么find_by_type会抛出异常。我最好的猜测是,因为在相对DNs(RDN)列表中有两个CN=*元素,所以调用list:flatte的结果是一个数组,而预期的结果是一个标量


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

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

    虽然我同意有两个CNs没有什么意义,但这就是Windows的工作方式。域用户是在CN=Users,DC=Domain,DC=tld中创建的,这意味着用户将拥有一个包含两个CN元素的DN.hmm,奇怪。如果您只想忽略第一个CN,您可以在案例中添加[\u,CN],而不是按类型查找[u]中的[CN]。但这更像是一个临时的解决方案,而不是你想在生产中得到的任何东西。我不想完全忽视它。基于openssl的证书将只有一个CN元素。作为一个临时修复,我希望首先检查数组是否有多个元素,如果有,只需使用第一个元素。这段代码是什么样子的?[CN | uu]会给出第一个CN,而忽略其余的CN(如果它们存在的话)。这将是给CN一个“用户”的例子。