2016-04-27 3 views
2

Использование последней версии Crossbar (0,13, установленное с apt-get на Ubuntu 14.04) У меня возникают проблемы с подключением с использованием SSL и промежуточных сертификатов.Конфигурация межсетевого экрана SSL/TLS с промежуточными и подписанными сертификатами

Если я настроил сервер без свойства ca_certificates в ключе tls, тогда сервер работает нормально, а соединения могут быть выполнены с помощью Google Chrome через протокол wss. Тем не менее пытаюсь установить соединение с помощью thruway терпит неудачу со следующей ошибкой:

Could not connect: Unable to complete SSL/TLS handshake: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

Какого having spoken with the Thruway team, кажется, проблема сертификата - на нашем живом сайте мы используем intermediate and cross-signed certificate from Gandi, который необходим для некоторых браузеров, и поэтому некоторые открытый Ssl реализации.

Кажется, что в то время как браузеры с удовольствием делают соединение TLS только с ключом и сертификатом, Thruway требует цепочки. Однако приведенная ниже конфигурация, использующая два сертификата Gandi, не работает для либо Chrome, либо Thruway. Chrome показывает ошибку:

failed: WebSocket opening handshake was canceled

При использовании файла .crossbar/config.json ниже. Итак, это проблема с моей конфигурацией, с моими сертификатами или с какой-то другой частью стека Open-SSL?

(Файл ниже был изменен для удаления потенциально уязвимой информации, поэтому может показаться, что он не будет работать по другим причинам. Если соединение работает, основные функции аутентификации и другие компоненты работают нормально, поэтому, пожалуйста, оставляйте ответы/комментарии в отношении реализации TLS. комментарии не действительны JSON, но включены, чтобы читатели могли видеть файлы сертификатов использования)

{ 
    "version": 2, 
    "controller": {}, 
    "workers": [ 
     { 
      "type": "router", 
      "realms": [ 
       { 
        "name": "test", 
        "roles": [ 
         { 
          "name": "web", 
          "authorizer": "test.utils.permissions", 
          "disclose": { 
           "caller": true, 
           "publisher": true 
          } 
         }, 
         { 
          "name": "no", 
          "permissions": [] 
         } 
        ] 
       } 
      ], 
      "transports": [ 
       { 
        "type": "websocket", 
        "endpoint": { 
         "type": "tcp", 
         "port": 9001, 
         "interface": "127.0.0.1" 
        }, 
        "auth": { 
         "wampcra": { 
          "type": "static", 
          "users": { 
           "authenticator": { 
            "secret": "authenticator-REDACTED", 
            "role": "authenticator" 
           } 
          } 
         } 
        } 
       }, 
       { 
        "type": "web", 
        "endpoint": { 
         "type": "tcp", 
         "port": 8089, 
         "tls": { 
          "key": "../ssl/key.pem", 
          "certificate": "../ssl/cert.pem", 
          "ca_certificates": [ 
           "../ssl/gandi.pem", // https://www.gandi.net/static/CAs/GandiProSSLCA2.pem 
           "../ssl/gandi-cross-signed.pem" // https://wiki.gandi.net/en/ssl/intermediate#comodo_cross-signed_certificate 
          ], 
          "dhparam": "../ssl/dhparam.pem" 
         } 
        }, 
        "paths": { 
         "/": { 
          "type": "static", 
          "directory": "../web" 
         }, 
         "ws": { 
          "type": "websocket", 
          "url": "wss://OUR-DOMAIN.com:8089/ws", 
          "auth": { 
           "wampcra": { 
            "type": "dynamic", 
            "authenticator": "test.utils.authenticate" 
           } 
          } 
         } 
        } 
       } 
      ] 
     }, 
     { 
      "type": "guest", 
      "executable": "/usr/bin/env", 
      "arguments": [ 
       "php", 
       "../test.php", 
       "ws://127.0.0.1:9001", 
       "test", 
       "authenticator", 
       "authenticator-REDACTED" 
      ] 
     } 
    ] 
} 

есть другие вопросы, которые адрес вопросы, схожие с этим @

  • This one имеет дело с тем, что любая ошибка TLS завершает соединение WSS без какой-либо полезной ошибки.
  • This one касается конкретно с отменой рукопожатия, но в их случае это был неправильно настроен библиотека, используемая в компиляции, которая не является релевантным в этом случае, как Перекладина была установлена ​​с apt-get
+0

тоже имеющий такую ​​же проблема. хотите настроить ssl/tls в перекладину. –

+1

Привет, Наконец-то я могу настроить его. следует за перекладиной [примеры] (https://github.com/crossbario/crossbarexamples/tree/master/authentication/tls). Установите последнюю версию [перекладину] (http://crossbar.io/docs/Installation-on-Ubuntu/). (Я установил 0.13.2) –

ответ

1

Это не проблема с перекладиной. Это, по-видимому, проблема с клиентом WAMP - Thruway. Davidwdan является владельцем репо Thruway Github, и он говорит:

"Thruway's Ratchet transport provider does not directly support SSL. You'll need to put some sort of proxy in front of it."

Вы можете найти более подробную информацию о том, какие Davidwdan и другие должны сказать об этом прямо здесь https://github.com/voryx/Thruway/issues/163.

Теперь, чтобы добраться до решения. Имейте в виду, что только для пользователей Apache. Если вы работаете на Nginx, идея почти такая же.

Пара вещей, которые нужно отметить, прежде чем мы начнем.

  1. Следуйте руководству Crossbar по установке! Не пытайтесь делать это сами! Существует больше возможностей для настройки Crossbar, а затем встречается с глазом.Прекрасные люди в Crossbar выложили подробные инструкции только для вас! https://crossbar.io/docs/Installation/.
  2. В этом примере у меня есть Crossbar и Apache, работающие на одной машине. Хотя это не требование и не имеет значения!

Первое, что вы хотите сделать, это создать новый виртуальный хост. Я выбрал порт 4043 для этого виртуального хоста, но вы можете выбрать все, что захотите. Этот виртуальный хост будет для каждой библиотеки WAMP, у которой нет проблемы с подключением через wss: // (с SSL). Ниже приведен полный список клиентов WAMP: http://wamp-proto.org/implementations/. Убедитесь, что директива ProxyPass и директива ProxyPassReverse имеют IP-адрес, указывающий на машину, на которой работает маршрутизатор CROSSBAR. В моем случае, поскольку Apache и Crossbar работают на одном компьютере, я просто использую 127.0.0.1. Также убедитесь, что порт, используемый в директиве ProxyPass, и директива ProxyPassReverse - это то же самое, что и порт, который вы определили в вашем .crossbar/config.json! Вам также понадобится сертификат SSL, настроенный на этом виртуальном хосте, который вы можете увидеть, я добавил ниже директив Proxy.

Listen 4043 

<VirtualHost *:4043> 
ServerName example.org 
ProxyRequests off 
SSLProxyEngine on 
ProxyPass /ws/ ws://127.0.0.1:8000/ 
ProxyPassReverse /ws/ ws://127.0.0.1:8000/ 

## Custom fragment 
SSLEngine on 
SSLCertificateFile /path/to/server_cert.pem 
SSLCertificateKeyFile /path/to/server_key.pem 
SSLCertificateChainFile /path/to/server_ca.pem 
</VirtualHost> 

Далее убедитесь, что ваш кросс-бар не настроен с помощью SSL! Это очень важно. Thruway или любая другая библиотека, которая НЕ МОЖЕТ подключаться через SSL, НЕ сможет использовать маршрутизатор, если вы настроили его на использование SSL! Ниже приведен рабочий файл config.json для Crossbar, который вы сможете использовать.

{ 
"version": 2, 
"controller": {}, 
"workers": [ 
{ 
    "type": "router", 
    "realms": [ 
    { 
     "name": "production_realm", 
     "roles": [ 
     { 
      "name": "production_role", 
      "permissions": [ 
      { 
       "uri": "", 
       "match": "prefix", 
       "allow": { 
       "call": true, 
       "register": true, 
       "publish": true, 
       "subscribe": true 
       } 
      } 
      ] 
     } 
     ] 
    } 
    ], 
    "transports": [ 
    { 
     "type": "websocket", 
     "endpoint": { 
     "type": "tcp", 
     "port": 8000 
     }, 
     "options": { 
      "allowed_origins": ["http://*","https://*"] 
     }, 
     "auth": { 
     "ticket": { 
      "type": "static", 
      "principals": { 
      "production_user": { 
       "ticket": "tSjlwueuireladgte", 
       "role": "production_role" 
      } 
      } 
     } 
     } 
    } 
    ] 
    } 
] 
} 

Обратите внимание, что номер порта, определенный выше, соответствует номеру порта, определенному на виртуальном хосте.

./crossbar/config.json:

"endpoint": { 
     "type": "tcp", 
     "port": 8000 
     }, 

виртуального хоста:

ProxyPass /ws/ ws://127.0.0.1:8000/ 
ProxyPassReverse /ws/ ws://127.0.0.1:8000/ 

Кроме того, если вы читали другие учебники, некоторые люди скажут вам, чтобы убедиться, что вы используете директиву ProxyPreserveHost в вашем файле виртуального хоста. НЕ СЛУШАЙТЕ ИХ! Это приведет к неожиданным результатам. Когда эта директива включена, этот параметр передает строку Host: от входящего запроса на прокси-сервер вместо имени хоста, указанного в строке ProxyPass! Даже Apache говорит, чтобы держаться подальше от этой директивы https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypreservehost. Если у вас есть он включен, то вы получите ошибку, подобную ниже:

failing WebSocket opening handshake ('missing port in HTTP Host header 
'example.org' and server runs on non-standard port 8000 (wss = 
False)') 

И последнее, но не в последнюю очередь, убедитесь, что все следующие библиотеки Apache установлены и включены. В последнее время установки Apache все следующие библиотеки предустановленными по умолчанию, и нужно просто быть:

$ sudo a2enmod proxy 
$ sudo a2enmod proxy_http 
$ sudo a2enmod proxy_balancer 
$ sudo a2enmod lbmethod_byrequests 
$ sudo a2enmod proxy_wstunnel 

Убедитесь, что вы открыть какой порт ваш виртуальный хост-файл прослушивает и в зависимости от того порта ваш перекладина маршрутизатор прослушивает , В моем случае:

$ sudo ufw allow 4043 
$ sudo ufw allow 8000 

И, наконец, перезапустите Apache, чтобы все ваши изменения вступили в силу.

$ sudo service apache2 restart 

И последнее, но не в последнюю очередь я хочу дать быстрое объяснение того, почему все это должно быть сделано:

  1. Если у вас есть настройки SSL сертификата на сервере браузер выдаст ошибку при попытке подключиться к любому WAMP-маршрутизатору без использования wss: //.
  2. Обычно для решения этой проблемы необходимо настроить маршрутизатор WAMP на использование SSL-сертификата, который уже настроен на вашем сервере.
  3. Единственная проблема заключается в том, что Thruway.php (единственный хороший клиент php, который я знаю, который работает с WAMP) не очень хорошо работает с wss: //. Даже создатели Thruway.php на GitHub говорят, что это не сработает.
  4. Решение этой проблемы заключается в использовании обратного прокси.
  5. Сначала вам нужно настроить свой WAMP-маршрутизатор и убедиться, что он не использует сертификат SSL.
  6. Далее вам нужно настроить обратный прокси-сервер, так что wss: // запросы преобразуются в ws: //. Это позволит вашему браузеру подключаться к маршрутизатору WAMP без жалоб.
  7. Поскольку маршрутизатор WAMP не настроен на использование SSL, Thruway.php также будет работать отлично!

И хорошо ... Это все люди! Я знаю, что мне нужно было дать подробный ответ на этот вопрос, потому что мне потребовалось 5 дней, чтобы понять все это!

+0

Добро пожаловать в SO, и это впечатляющий первый ответ! Я постараюсь найти время, чтобы разобраться в этом, и посмотреть, поможет ли он системе мониторинга чата в Интернете. На данный момент я все равно вернусь только ради усилий, которые вы вложили! – M1ke