2014-02-22 88 views
0

我正在開發一個應用程序,使用氮網絡框架通過牛仔web服務器。當我通過http運行服務器時,效果非常好。現在在生產中,應用程序必須在https上運行。安裝SSL證書並通過https服務器運行氮網框架工作通過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但我首先要創建一個CA以下OpenSSL文檔

我也從默認的氮/網站/ SCR發現nitrogen_sup.erl文件修改主管回調

%% =================================================================== 
%% 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}, []} }. 

使用同步功能:去()文件的編譯d重新加載。但是我關閉了氮氣並重新開始。

在外殼

我使用curl工具來測試服務器監聽

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

爲索引頁面上的內容顯示在外殼

然而,響應posite,當我去火狐瀏覽器它會拋出一個安全警告,我承認,除了我知道它的原因,我永久添加到例外。當我再次嘗試獲取頁面時,瀏覽器會引發此錯誤。

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> [email protected]:~/nitrogen/rel/nitrogen$ 
[email protected]:~/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 

現在我不明白的是服務器是否是一個拒絕我的證書或我跳過了一步,或一個或兩個步驟出錯或問題出在我自己創建的CA(根證書cacert.pem)或問題出在openSSL上!

現在我已經開始懷疑,可能是,如果我生成我CSR並將其發送到受信任的CA如Symantec,digcert,Thawte的,GeoTrust的..等,在。由此產生的證書也可能無法工作。

我需要你的幫助請在牛仔網站服務器問題上的這個氮的https。泰克斯迄今爲止所有的幫助....

+0

它會在所有瀏覽器上產生相同的錯誤嗎? – chops

+0

是的,我已經嘗試過,IE8,Safari,Chrome,Opera以及Firefox –

回答

1

我不知道爲什麼牛仔會拋出那個特定的錯誤(tls_connection.erl實際上是Erlang的一部分,而不是牛仔或氮氣)。

這就是說,當它涉及到用氮氣運行SSL,我通常只是建議用戶使用nginx作爲氮的前反向代理,並在http://nitrogenproject.com/doc/config.html上有氮網站nginx的配置實例(向下滾動到僅限於SSL的示例)。

我意識到這並不完全理想,所以我會看看如果nginx或apache能夠使用相同的key/cert組合成功提供示例頁面。顯然,「unknown ca」錯誤是在說Erlang不喜歡它是一個自簽名證書的事實。因此,您可以嘗試使用其他已簽署的證書/密鑰,或者在StartSSL.com上免費生成一個真實的證書/密鑰,然後查看錯誤是否繼續呈現。

同樣,這些都不是固體的答案,但他們應該幫助指出你在很多方向來幫助解決你的問題。

就我個人而言,我在nginx後面運行所有的Nitrogen實例,並讓nginx處理SSL和負載平衡。

+0

牛仔中有一個功能,它迫使我試圖成功實現這個選項。不過,這是我從你的幫助中得到的 - 如果證書來自**已知的ca **,那肯定會起作用。我相信它會工作,因爲'「curl --cacert /../.../cacert.pem https://domainname.com」'工作! ** - cacert **選項是在使用** curl **工具時解決**'unknown ca'**問題。 –

0

我的方法確實有效,我已經使用SYMANTEC和VERISIGN SSL證書成功地進行了測試,它可能是在牛仔web服務器上安裝SSL證書的正式方式。