Установка SSL-сертификата и запуск веб-фреймворка азота через сервер cowboy через https

Я разрабатываю приложение, используя азотную веб-инфраструктуру поверх ковбойского веб-сервера. Когда я запускаю сервер через http, он работает отлично. Сейчас в продакшене приложение должно работать по https.

Я изменил файл cowboy.config в каталоге etc азота по умолчанию.

% vim: ts=4 sw=4 et ft=erlang
[
{cowboy,[
    {bind_address,"127.0.0.1"},
    {port,80},
    {server_name,nitrogen},       
    {document_root,"./site/static"},
    %% some comments.........
    {static_paths, ["/js/","/images/","/css/","/nitrogen/","/favicon.ico"]}
]}
].  

к этому

% vim: ts=4 sw=4 et ft=erlang
[
{cowboy,[
    {bind_address,"127.0.0.1"},
    {port,443},
    {server_name,nitrogen},
    {cacertfile, "Path/cacert.pem"},
    {certfile, "Path/webservercert.pem"},
    {keyfile, "Path/webserverkey.pem"},
    {password, "webserverkeypassphrase"}
    {document_root,"./site/static"},
    %% some comments.........
    {static_paths, ["/js/","/images/","/css/","/nitrogen/","/favicon.ico"]}
]}
].  

Где Путь — это абсолютный путь к SSL-сертификату, который я создал и подписал сам, используя openSSL. Я беру имя своего сайта как domainname.com, но сначала создаю ЦС в соответствии с документацией openSSL.

Я также изменил обратные вызовы супервизора в файле nitrogen_sup.erl, расположенном в nitrogen/site/scr, со значения по умолчанию.

%% ===================================================================
%% Supervisor callbacks
%% ===================================================================

init([]) ->
%% Start the Process Registry...
application:start(crypto),
application:start(nprocreg),
application:start(ranch),

%% Start Cowboy...
application:start(cowboy),
{ok, BindAddress} = application:get_env(cowboy, bind_address),
{ok, Port} = application:get_env(cowboy, port),
{ok, ServerName} = application:get_env(cowboy, server_name),
{ok, DocRoot} = application:get_env(cowboy, document_root),
{ok, StaticPaths} = application:get_env(cowboy, static_paths),  

io:format("Starting Cowboy Server (~s) on ~s:~p, root: '~s'~n",
          [ServerName, BindAddress, Port, DocRoot]),

Dispatch = init_dispatch(DocRoot, StaticPaths),

{ok, _} = cowboy:start_http(http, 100,     
        [
            {port, Port}               
        ], [
    {env, [{dispatch, Dispatch}]},
    {max_keepalive, 50}
]),

{ok, { {one_for_one, 5, 10}, []} }.

к этому ниже

%% ===================================================================
%% Supervisor callbacks
%% ===================================================================

init([]) ->
   %% Start the Process Registry...

   application:start(crypto),    
   application:start(nprocreg),
   application:start(ranch),   

   %% Start Cowboy...
   application:start(cowboy),
   {ok, BindAddress} = application:get_env(cowboy, bind_address),
   {ok, Port} = application:get_env(cowboy, port),
   {ok, ServerName} = application:get_env(cowboy, server_name),
   {ok, DocRoot} = application:get_env(cowboy, document_root),
   {ok, StaticPaths} = application:get_env(cowboy, static_paths),
   {ok, CAcertfile} = application:get_env(cowboy, cacertfile),
   {ok, Certfile} = application:get_env(cowboy, certfile),
   {ok, Keyfile} = application:get_env(cowboy, keyfile),
   {ok, Password} = application:get_env(cowboy, password),

   io:format("Starting Cowboy Server (~s) on ~s:~p, root: '~s'~n",
          [ServerName, BindAddress, Port, DocRoot]),

   Dispatch = init_dispatch(DocRoot, StaticPaths),
   {ok, _} = cowboy:start_https(https, 100,
     [
        {port, Port},
        {cacertfile, CAcertfile}, 
        {certfile, Certfile},
        {keyfile,  Keyfile},
        {password, Password}            
    ], [         
    {env, [{dispatch, Dispatch}]},
    {max_keepalive, 50}
]),

{ok, { {one_for_one, 5, 10}, []} }.

С помощью sync:go() файл компилируется и перезагружается. Однако я закрыл азот и начал его снова.

в оболочке я использую утилиту curl, чтобы проверить, слушает ли сервер

$ curl --cacert Absolute_path/cacert.pem -i https://domainname.com

ответ корректен, так как содержимое индексной страницы отображается в оболочке

Однако, когда я захожу в браузер Firefox, он выдает предупреждение о безопасности, которое я признал, за исключением того, что я знаю его причину, которую я постоянно добавляю в исключения. Когда я пытаюсь получить страницу снова, браузер выдает эту ошибку.

Secure Connection Failed

The key does not support the requested operation.

(Error code: sec_error_invalid_key)

.The page you are trying to view cannot be shown because the authenticity of the received data could not be verified.
.Please contact the website owners to inform them of this problem. Alternatively, use the command found in the help menu to report this broken site.

Когда я проверил в консоли азота, нашел ли этот отчет об ошибке

([email protected])4> user@user:~/nitrogen/rel/nitrogen$ 
user@user:~/nitrogen/rel/nitrogen$ sudo ./bin/nitrogen console
Exec: /home/user/nitrogen/rel/nitrogen/erts-5.10.4/bin/erlexec  -boot       /home/user/nitrogen/rel/nitrogen/releases/2.2.2/nitrogen -mode interactive  -config /home/user/nitrogen/rel/nitrogen/etc/app.config -config /home/user/nitrogen/rel/nitrogen/etc/cowboy.config -config /home/user/nitrogen/rel/nitrogen/etc/sync.config -args_file /home/dotshule/nitrogen/rel/nitrogen/etc/vm.args -- console
Root: /home/dotshule/nitrogen/rel/nitrogen
Erlang R16B03 (erts-5.10.4) [source] [smp:2:2] [async-threads:5] [hipe] [kernel-poll:true]

Eshell V5.10.4  (abort with ^G)
([email protected])1> Starting Cowboy Server (nitrogen) on 127.0.0.1:443, root: './site/static'

=ERROR REPORT==== 20-Feb-2014::14:51:12 ===
SSL: certify: tls_connection.erl:375:Fatal error: unknown ca

Теперь я не понимаю, является ли сервер тем, который отказывается от моего сертификата, или я пропустил шаг, или один или два шага пошли не так, или проблема в моем самостоятельно созданном ЦС (корневой сертификат cacert.pem< /strong>) или проблема в openSSL!

Теперь у меня возникло подозрение, что это может быть, если я сгенерирую свой CSR и отправлю его в доверенный центр сертификации, такой как symantec, digcert, thawte, geotrust и т. д. полученный сертификат также может не работать.

Мне нужна ваша помощь, пожалуйста, в этой проблеме https азота поверх ковбойского веб-сервера. Спасибо за вашу помощь до сих пор ....


person Vianney Sserwanga    schedule 22.02.2014    source источник
comment
Во всех браузерах выдает одну и ту же ошибку?   -  person chops    schedule 24.02.2014
comment
Да, я пробовал, IE8, Safari, Chrome, Opera, а также Firefox   -  person Vianney Sserwanga    schedule 24.02.2014


Ответы (2)


Я не уверен, почему ковбой выдает именно эту ошибку (tls_connection.erl на самом деле является частью Erlang, а не Cowboy или Nitrogen).

Тем не менее, когда дело доходит до запуска SSL с Nitrogen, я обычно просто рекомендую пользователям использовать nginx в качестве обратного прокси-сервера перед Nitrogen, и на сайте Nitrogen есть примеры конфигурации nginx по адресу http://азотныйпроект.com/doc/config.html (прокрутите вниз до примера только для SSL).

Я понимаю, что это не совсем идеально, поэтому в качестве альтернативы я бы посмотрел, смогут ли nginx или apache успешно обслуживать образцы страниц с одинаковыми комбинациями ключей и сертификатов. Очевидно, ошибка «неизвестный ca» говорит о том, что Erlang не нравится тот факт, что это самозаверяющий сертификат. Таким образом, вы можете поэкспериментировать с использованием других подписанных сертификатов/ключей, которые могут лежать у вас под рукой, или сгенерировать реальный бесплатно на StartSSL.com и посмотреть, продолжает ли появляться ошибка.

Опять же, ни один из этих ответов не является надежным, но они должны указать вам несколько направлений для решения ваших проблем.

Лично я запускаю все свои экземпляры Nitrogen за nginx и позволяю nginx заниматься SSL и балансировкой нагрузки.

person chops    schedule 24.02.2014
comment
В ковбое есть особенность, которая заставляет меня попробовать этот вариант. Однако Чопс, вот что я получил от вашей помощи - если сертификат от известного центра сертификации, он определенно будет работать. Я убежден, что это сработает, потому что "curl --cacert /../.../cacert.pem https://domainname.com" работает! -- опция cacert предназначена для решения проблемы 'unknown ca' при использовании утилиты curl. - person Vianney Sserwanga; 26.02.2014

Моя методология действительно работает, я успешно протестировал ее с использованием SSL-сертификатов SYMANTEC и VERISIGN, и это может быть формальный способ установки SSL-сертификатов на веб-сервере Cowboy.

person Vianney Sserwanga    schedule 11.03.2014