2017-02-22 118 views
1

使用OpenSSL生成的證書具有高於SSLRabbitMq一個可行的解決方案後,我得到了來自我們的客戶的要求,我們不能使用OpenSSL生成證書。服務器管理員通過IIS創建了證書鏈。RabbitMQ的經紀人不接受PFX

我們做創建後下面的證書:

  1. 導出的服務器證書爲PFX和提取cert.pemcert.key
  2. 導出客戶端證書到PFX並提取出cert.pemcert.key
  3. 將根CA導出到rootca.pem
  4. 更新配置爲RabbitMq

要測試的連接和證書文件被正確創建,我們通過Troubleshooting Steps here.

一切都過去了罰款。我們能夠在端口5671使用openssl s_client連接爲使用客戶端的cert.pemcert.keyclient.pfx所產生的預期。我們可以看到在管理控制檯中以及在日誌中進行的連接,並且它們來回傳遞。現在

,使用client.pfx在.NET客戶端,我們得到一個錯誤有關證書驗證:

MassTransit.RabbitMqTransport.RabbitMqConnectionException: Connect failed: [email protected]:5671/ ---> RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the specified endpoints were reachable ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

我如何會得到使用client.pfx錯誤但使用cert.pemcert.key時,我從中提取的錯誤不會得到一個錯誤?

回答

1

當使用s_client通過OpenSSL測試連接時,它不執行或非常基本的驗證,.NET應用程序可以提供應用任何邏輯的函數。最常見的驗證類型是將證書的CN與服務器的主機名相匹配,但它確實可以是任何東西。

因此,即使在受信任的根CA上,CN仍然需要與主機名匹配,而不是使用OpenSSL命令拾取主機名。

重新生成證書和修正問題。

此外,您還可以有效地添加下面的代碼,它會忽略這個錯誤:

h.UseSsl(s => 
{ 
    s.ServerName = SslHostName; 
    s.CertificatePath = SslFileLocation; 
    s.CertificatePassphrase = SslPassphrase; 

    // The below allows the Root CA's CN to be different than the others, but adds vulnerability 
    s.AllowPolicyErrors(System.Net.Security.SslPolicyErrors.RemoteCertificateNameMismatch); 
}); 

請注意 - 忽略錯誤進行系統暴露給中間人攻擊(除非你實現你自己的驗證邏輯的風險這當然不是基於CN /主機名匹配的)。

1

此錯誤消息表示客戶端無法驗證服務器證書。您的問題可能與rootca.pem在客戶機器上不受信任有關。遵循相應的操作系統指南,使根CA證書可信。