我们最近开始使用RabbitMQ,现在我们正在尝试使用.NET应用程序中的TLS。我们正在使用Erlang OTP 19.0。我们遵循this guide使用OpenSSL生成CA,客户端和服务器证书,我们相应地在RabbitMQ上配置。唯一的区别是我们使用以下openssl命令生成了CA请求:
openssl req -x509 -config openssl.cnf -newkey rsa:2048 -days 365 -out cacert.pem -outform PEM -subj /CN=$(hostname)/ -nodes
不同之处在于文档说CN=MyTestCA
,而我们使用的是CN=$(hostname)
。但是,这并不会改变我们所遇到的错误。
由于我们使用.NET,我们还使用以下命令加入证书和密钥:
openssl pkcs12 -export -out keycert.p12 -in cert.pem -inkey key.pem -passout pass:somePassword
在我们的.NET应用程序中测试证书之前,我们尝试使用s_client
连接RabbitMQ,然后我们发送8个随机字节,这会导致服务器回复" AMQP" ,然后连接关闭。记录此行为here。到现在为止还挺好。是时候做一些真正的测试了。
我们正在使用RabbitMQ(RabbitMQ.Client)的官方.NET客户端,但我们能够使用此代码重现该问题:
TcpClient client = new TcpClient("server_ip", server_port);
var cert = new X509Certificate2("keycert.p12", "somePassword");
SslStream ssl = new SslStream(client.GetStream(), false, ValidateServerCertificate);
//fails here with "The message received was unexpected or badly formatted"
ssl.AuthenticateAsClient("servername", new X509CertificateCollection { cert },
System.Security.Authentication.SslProtocols.Tls, true);
这段代码和RabbitMQ.Client都失败了"收到的消息是意外的或格式错误的#34;。我们检查了RabbitMQ上的日志,但它只是说" handshake_failure"。
我们需要一些建议。据我们所知,我们已经做好了一切。但显然缺少一些东西。
最奇怪的是,这不是我们第一次执行这些步骤。几周前我们已经成功完成了这项工作,但现在有些事情已经明确了。