【问题标题】:This erlang code throws an exception and I don't know why这个erlang代码抛出异常,我不知道为什么
【发布时间】:2012-01-30 18:22:18
【问题描述】:

我正在使用 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}]}]}}

查看堆栈跟踪的最后两行,我找到了涉及的两个文件:

  1. rabbit_ssl.erl
  2. rabbit_auth_mechanism_ssl.erl

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

能否请熟悉 erlang 的人确认或更正我的假设?如果您发现可以改进此代码以处理我刚刚描述的情况(而不是引发异常),我将非常感激,以便我可以在 RabbitMQ 邮件列表中提出建议。

【问题讨论】:

    标签: ssl erlang rabbitmq flatten


    【解决方案1】:

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

    【讨论】:

    • 虽然我同意拥有两个 CN 意义不大,但这就是它适用于 Windows 的方式。域用户在 CN=Users,DC=domain,DC=tld 中创建,这意味着用户将拥有一个包含两个 CN 元素的 DN。
    • 嗯,奇怪。如果您只想忽略第一个 CN,您可以将 [_,CN] 添加到 case 而不是 find_by_type 中的 [CN]。但更多的是临时修复,而不是您希望在生产中拥有的任何东西。
    • 我不想完全忽略它。基于 openssl 的证书只有一个 CN 元素。作为临时修复,我宁愿先检查数组是否有多个元素,如果有,只需使用第一个元素。这段代码会是什么样子?
    • [CN|_] 会给你第一个 CN,如果存在则忽略其余的 CN。对于您给出的示例,这将使 CN 成为“用户”。
    猜你喜欢
    • 2021-10-07
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多