2016-10-22 95 views
0

我試圖使用pika使用SSL(自簽名)連接到RabbitMQ。使用SSL連接的Pika無證書文件

問題是,如果我不給證書文件給pika,連接不會失敗。

這是我的代碼:

import pika 
import urllib 

connection = pika.BlockingConnection(pika.URLParameters("amqps://guest:[email protected]:25585")) 
channel = connection.channel() 

channel.queue_declare(queue='hello') 
channel.basic_publish(exchange='', 
         routing_key='hello', 
         body='Hello World!') 

print(" [x] Sent 'Hello World!'") 
connection.close() 

這是我rabbitmq.config:

{tcp_listeners, []}, 
{ssl_listeners, [25585]}, 
{ssl_options, [{cacertfile,   "/etc/rabbitmq/certs/cacert.pem"}, 
       {certfile,    "/etc/rabbitmq/certs/cert.pem"}, 
       {keyfile,    "/etc/rabbitmq/certs/key.pem"}, 
       {verify,    verify_peer}, 
       {versions, ['tlsv1.2', 'tlsv1.1', 'tlsv1']}, 
       {fail_if_no_peer_cert, false}]}, 

我已禁用TCP連接並啓用了SSL,爲什麼連接不失敗?

回答

0

這是因爲在服務器這個配置:{fail_if_no_peer_cert, false}

將其更改爲:{fail_if_no_peer_cert, true}

這意味着斷開連接,如果沒有通過客戶端提供的證書。

+0

我不希望客戶端身份驗證,我認爲如果證書無效,客戶端庫(pika)將丟棄連接 –

+0

在這種情況下,請在客戶端使用以下參數創建連接:'pika.BlockingConnection( pika.ConnectionParameters( host ='172.16.120.130',port = 25585,credentials = pika.PlainCredentials(user,password),ssl = True,ssl_options = {「cert_reqs」:ssl.CERT_REQUIRED,「ca_certs」:caCert}) )' 其中'caCert'是包含服務器證書的證書文件。 –

+0

如果您不這樣做,您的客戶端將忽略服務器證書驗證。您需要告訴客戶端在連接設置中使用'ssl_options'驗證服務器證書 –