Я разрабатываю приложение, используя азотную веб-инфраструктуру поверх ковбойского веб-сервера. Когда я запускаю сервер через 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 азота поверх ковбойского веб-сервера. Спасибо за вашу помощь до сих пор ....