Назад | Перейти на главную страницу

Настройка ejabberd STARTTLS на порту 5222

Я только что установил и настроил докер ejabberd/ecs изображение на экземпляре ubuntu 20.04 aws.

У меня есть порты, доменное имя и пользователи, настроенные и работающие.

На хосте (ubuntu) я сгенерировал сертификаты Let's Encrypt с помощью certbot, скопировал их в контейнер докеров:

certfiles:               
  - /home/ejabberd/conf/fullchain.pem
  - /home/ejabberd/conf/privkey.pem  

ca_file: "/home/ejabberd/conf/fullchain.pem"

Я хочу, чтобы мои пользователи использовали только безопасное соединение.

Я читал в документации, что лучше использовать STARTTLS вместо TLS.

Проблема в том, что ejabberd, похоже, использует мои сертификаты только при настройке TLS.

Когда я устанавливаю такую ​​конфигурацию:

listen:
  -
    port: 5222
    ip: "::"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    tls: true
...
  -                                                                      
    port: 5280                                                           
    ip: "::"                                                             
    module: ejabberd_http                                                
    tls: true                                             
    request_handlers:                                     
      "/admin": ejabberd_web_admin 

и перезагрузите конфиг bin/ejabbedctl reload_config, тогда я могу получить доступ https://example.com:5280/admin/ используя ssl.

И когда я тестирую сертификат с помощью openssl с другой машины, похоже, работает, потому что я получаю следующее:

openssl s_client -connect example.com:5222
CONNECTED(00000005)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = example.com
verify return:1
---
Certificate chain
 0 s:CN = example.com
   i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
 1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
...

Но когда я использую, как должен, насколько я понимаю, starttls и starttls_required:

listen:
  -
    port: 5222
    ip: "::"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    starttls: true
    starttls_required: true

Тогда ejabberd, похоже, не использует безопасное соединение на порту 5222:

openssl s_client -connect example.com:5222
CONNECTED(00000005)
140324192997824:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../ssl/record/ssl3_record.c:332:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 315 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

Есть идеи, что я могу сделать, чтобы это исправить?

Чтобы соединение было безопасным, нужно указать tls: true в слушателе. Например, в конфигурации ниже оба порта 5222 и 5223 имеют те же настройки, но 5223 также включает tls: true. Благодаря этому ваш openssl тест обнаружит безопасное соединение на порту 5223 но не на 5222.

  -
    port: 5222
    ip: "::"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    starttls_required: true
  -
    port: 5223
    ip: "::"
    tls: true
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    starttls_required: true

В качестве примечания: если проблема не исчезнет, ​​попробуйте изменить ca_file к ca_file: "/home/ejabberd/conf/cacert.pem" предполагая cacert.pem - это файл, созданный установщиком ejabberd, а не вашим LE.