Вопрос или проблема
У меня есть приложение, которое использует WebSockets. Я сгенерировал SSL-сертификат с помощью Let’s Encrypt и использую веб-сервер Nginx. Проблема, с которой я столкнулся, заключается в том, что мой домен показывает безопасное соединение в браузере, но когда я использую Twilio, функция, реализованная в моем приложении, которая должна автоматически инициировать звонок, выдает ошибку. Я также проверил SSL-сертификат с помощью SSL Labs, он действителен и истечет через 90 дней.
Twilio не удалось получить содержимое с: https://example.com:8080/inbound
Ошибка: ошибка при handshake: исключение сертификата
Account SID: [some_id]
SID: [some_id]
Request ID: [some_id]
Удаленный хост: abhiai.com
Метод запроса: POST
URI запроса: https://example.com:8080/inbound
Версия SSL: TLSv1.2
Фрагмент URL: true
Я хочу понять, где я ошибаюсь, и хочу установить безопасное соединение в моем приложении. Вот мой файл конфигурации по умолчанию для Nginx:
# Конфигурация сервера по умолчанию
#
server {
listen 80 default_server;
listen [::]:80 default_server;
# Конфигурация SSL
#
# listen 443 ssl default_server;
#listen [::]:443 ssl default_server;
#
# Примечание: вы должны отключить gzip для SSL-трафика.
# Смотрите: https://bugs.debian.org/773332
#
# Ознакомьтесь с ssl_ciphers для обеспечения безопасной конфигурации.
# Смотрите: https://bugs.debian.org/765782
#
# Самоподписанные сертификаты, сгенерированные пакетом ssl-cert
# Не используйте их на производственном сервере!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Добавьте index.php в список, если вы используете PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
# ssl_protocols TLSv1.2 TLSv1.3;
#ssl_prefer_server_ciphers on;
location / {
# Сначала попытайтесь обслужить запрос как файл, затем
# как каталог, затем вернитесь к отображению 404.
try_files $uri $uri/ =404;
}
# передать PHP-скрипты серверу FastCGI
#
#location ~ \.php$ {
# include snippets/fastcgi-php.conf;
#
# # С php-fpm (или другими Unix-сокетами):
# fastcgi_pass unix:/run/php/php7.4-fpm.sock;
# # С php-cgi (или другими tcp-сокетами):
# fastcgi_pass 127.0.0.1:9000;
#}
# запретить доступ к файлам .htaccess, если корень документа Apache
# совпадает с корнем nginx
#
#location ~ /\.ht {
# deny all;
#}
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
# SSL-сертификаты
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'HIGH:!aNULL:!MD5';
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}
# Конфигурация виртуального хоста для example.com
#
# Вы можете переместить это в другой файл в папке sites-available/ и создать символическую ссылку на него
# в sites-enabled/, чтобы активировать его.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
Я хочу установить безопасное соединение, используя WebSockets через Twilio, я уже включил версию Tls 1.2 в своем конфигурационном файле. Вот мой файл node.js для проверки сертификата:
let options = {
key: fs.readFileSync('./ssl/privatekey.pem'),
cert: fs.readFileSync('./ssl/certificate.pem')
};
if (platform === "linux") {
options = {
key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'), // Обновите путь к вашему частному ключу
cert: fs.readFileSync('/etc/letsencrypt/live/example.com/cert.pem') // Обновите путь к вашему сертификату
};
}
Ответ или решение
Ошибка «Handshake failure: certificate exception» при подключении к Twilio через WebSockets может быть вызвана несколькими факторами, связанными с конфигурацией SSL и общей настройкой вашего приложения и веб-сервера Nginx. Рассмотрим основные аспекты и шаги по устранению данной проблемы.
1. Проверка SSL-сертификатов
Несмотря на то, что вы упомянули, что сертификат является действующим, важно убедиться в следующем:
-
Правильное указание путей к сертификатам: Убедитесь, что пути к SSL-сертификатам в конфигурациях Nginx и Node.js указаны корректно:
- Для Nginx:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
- Для вашего Node.js приложения:
options = { key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'), cert: fs.readFileSync('/etc/letsencrypt/live/example.com/cert.pem') };
Проверьте, что файлы доступны и имеют правильные права доступа.
- Для Nginx:
-
Полный цепочка сертификатов: Убедитесь, что используемый вами сертификат включает полный цепочку сертификатов, иначе может возникнуть ошибка при установлении соединения.
2. Настройка Nginx для WebSocket
Поскольку вы используете WebSockets, необходимо убедиться, что конфигурация Nginx поддерживает их корректные прокси-настройки. Добавьте следующий блок конфигурации в ваш блок сервера для HTTPS:
location /inbound {
proxy_pass http://localhost:8080; # или другой адрес вашего WebSocket сервера
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
3. Проверка версии протокола TLS
Убедитесь, что используемая версия протокола TLS поддерживает необходимые стандарты. Как вы указали, у вас включены TLSv1.2 и TLSv1.3 в конфигурации Nginx:
ssl_protocols TLSv1.2 TLSv1.3;
Также должно быть учтено, что некоторые старые клиенты могут не поддерживать последние версии TLS. Убедитесь, что ваша версия Node.js поддерживает используемые протоколы.
4. Тестирование сертификатов
Проверьте, работоспособность вашего SSL-сертификата с помощью командной строки:
openssl s_client -connect example.com:443 -servername example.com
Обратите внимание на любые ошибки, которые могут указать на проблемы с цепочкой сертификатов или настройками SSL.
5. Проверка конфигурации и логов
Проверьте логи Nginx (/var/log/nginx/error.log
) на наличие ошибок, которые могут помочь в диагностике проблемы. Это может дать вам дополнительную информацию о том, что именно идет не так при попытке установить соединение с Twilio.
6. Обновление Node.js и библиотек
Если вы используете старую версию Node.js или какие-либо устаревшие библиотеки, может потребоваться обновление до последних стабильных версий. Это может решить проблемы совместимости с TLS и WebSockets.
Заключение
Проблема с ошибкой подключения «Handshake failure: certificate exception» часто связана с неправильной конфигурацией SSL или проблемами с WebSocket. Пройдите по указанным шагам, и вы сможете определить и устранить проблему. Поскольку вы работаете с Twilio и WebSockets, очень важно обеспечить корректность и безопасность всех соединений. Надеюсь, это поможет вам успешно решить вашу проблему.