Jak włączyć SSL na TS-109?

m@k

Passing Basics
Beginner
6 Maj 2009
22
2
3
Kraków
QNAP
TS-x51
Ethernet
1 GbE
Hej,
Mam problem po ugradzie firmware'u na TS-109 II do wersji 3.2.0 Build0622. Chciałem, aby strona umieszczona w Qweb była dostępna po https. Z poprzednim firmware mi się to udało, ale nie wiem, jak bo nie mam zapisanej konfiguracji :)

Liczę na pomoc jakiegoś znawcy apacha.

Z nowym firmware wydawało mi się, że powinno być jeszcze prościej. W stunnel zmieniłem konfigurację

Kod:
[https]
accept = 443
; previous value: connect = 127.0.0.1:8080
connect = 80
TIMEOUTclose = 0

Po restartcie demona stunnel, jak łączę się po sieci lokalnej https://192.168.0.5/ to dostaję

Method Not Implemented
[192.168.0.6]GET to /index.html not supported.
Invalid method in request [192.168.0.6]GET / HTTP/1.1

Jak widać coś dopisuje nr IP do requesty http i tego już apache nie umie obsłużyć. Co mam źle skonfigurowane?

W logach apacha wygląda to następująco:

127.0.0.1 - - [04/Sep/2010:13:09:01 +0200] "[192.168.0.6]GET / HTTP/1.1" 501 361
127.0.0.1 - - [04/Sep/2010:13:09:02 +0200] "[192.168.0.6]GET /favicon.ico HTTP/1.1" 501 373

Jak ciekawostkę dodam, że skrypt test.php
Kod:
<?php
phpinfo();
?>
działa! (https://192.168.0.5/test.php) a w logach pojawia się

127.0.0.1 - - [04/Sep/2010:13:09:11 +0200] "[192.168.0.6]GET /test.php HTTP/1.1" 200 48641
127.0.0.1 - - [04/Sep/2010:13:09:12 +0200] "[192.168.0.6]GET /test.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2536
127.0.0.1 - - [04/Sep/2010:13:09:12 +0200] "[192.168.0.6]GET /test.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2158

i potem przez krótki czas działa nawet https://192.168.0.5/ czy też https://192.168.0.5/index.html. Ale po chwili wszystko wraca co stanu początkowego, tj. invalid method.

Liczę na Waszą pomoc, bo mam przeczucie, że rozwiązanie musi być proste...

pozdrawiam
m@k
 
Witam,

Być może tak było z poprzednim firmware (sprzed 3.2.0). Apache na TS-109 jest bardzo ograniczony.
Rozważam instalację apacha z ipkg, ale mam pewne obawy, więc póki co mam nadzieję, że stunnel + ograniczony apache wystarczą.

m@k
 
Jasne :)

/etc/config/stunnel/stunnel.conf

Kod:
; Sample stunnel configuration file by Michal Trojnara 2002-2006
; Some options used here may not be adequate for your particular configuration
; Please make sure you understand them (especially the effect of chroot jail)

; Certificate/key is needed in server mode and optional in client mode
cert = /etc/stunnel/stunnel.pem
;key = /usr/local/etc/stunnel/mail.pem

; Some security enhancements for UNIX systems - comment them out on Win32
;chroot = /usr/local/var/lib/stunnel/
setuid = admin
setgid = administrators
; PID is created inside chroot jail
pid = /stunnel.pid

; Some performance tunings
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
;compression = rle

; Workaround for Eudora bug
;options = DONT_INSERT_EMPTY_FRAGMENTS

; Authentication stuff
;verify = 2
; Don't forget to c_rehash CApath
; CApath is located inside chroot jail
;CApath = /certs
; It's often easier to use CAfile
;CAfile = /usr/local/etc/stunnel/certs.pem
; Don't forget to c_rehash CRLpath
; CRLpath is located inside chroot jail
;CRLpath = /crls
; Alternatively you can use CRLfile
;CRLfile = /usr/local/etc/stunnel/crls.pem

; Some debugging stuff useful for troubleshooting
debug = 7
output = /share/Public/stunnel_debug.txt

; Use it for client mode
client = no

; Service-level configuration

;[pop3s]
;accept  = 995
;connect = 110

;[imaps]
;accept  = 993
;connect = 143

;[ssmtp]
;accept  = 465
;connect = 25

[https]
accept = 443
;connect = 127.0.0.1:8080
;connect = 192.168.5.2:80
connect = 80
TIMEOUTclose = 0

; vim:ft=dosini

/etc/config/apache/apache.conf

Kod:
#ServerType standalone
ServerRoot "/usr/local/apache"
#LockFile /usr/local/apache/logs/apache.lock
PidFile /usr/local/apache/logs/apache.pid
ScoreBoardFile /usr/local/apache/logs/apache.scoreboard
#ResourceConfig /usr/local/apache/conf/srm.conf
#AccessConfig /usr/local/apache/conf/access.conf
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0
#Listen 3000
#Listen 12.34.56.78:80
BindAddress *
LoadModule php5_module libexec/libphp5.so
LoadModule rewrite_module libexec/mod_rewrite.so
LoadModule vhost_alias_module libexec/mod_vhost_alias.so
Port 80
User guest
Group guest
ServerAdmin ken@NasARM
ServerName home.xxx.com
DocumentRoot "/share/Qweb"
<Directory />
                Options FollowSymLinks
                AllowOverride None
</Directory>
<Directory "/share/Qweb">
                Options FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                Allow from all
</Directory>

<IfModule mod_userdir.c>
                UserDir public_html
</IfModule>
<IfModule mod_dir.c>
                DirectoryIndex index.html index.htm index.php
</IfModule>

AccessFileName .htaccess
<Files ~ "^\.ht">
                Order allow,deny
                Deny from all
                Satisfy All
</Files>

UseCanonicalName Off

<IfModule mod_mime.c>
                TypesConfig /usr/local/apache/conf/mime.types
</IfModule>

DefaultType text/plain

<IfModule mod_mime_magic.c>
                MIMEMagicFile /usr/local/apache/conf/magic
</IfModule>

HostnameLookups Off
ErrorLog /usr/local/apache/logs/apache_error_log
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog /usr/local/apache/logs/apache_access_log common
ServerSignature On

#
# Aliases: Add here as many aliases as you need (with no limit). The format is
# Alias fakename realname
#
<IfModule mod_alias.c>
                Alias /Qmultimedia/ "/home/httpd/Qmultimedia/"
                Alias /v3_menu/ "/home/httpd/v3_menu/"
                Alias /cgi-bin/Qmultimedia/html "/home/httpd/cgi-bin/Qmultimedia/html/"
                ScriptAlias /cgi-bin/Qmultimedia/ "/home/httpd/cgi-bin/Qmultimedia/"
                ScriptAlias /Qmultimedia/cgi-bin/ "/home/httpd/Qmultimedia/cgi-bin/"
                <Directory "/home/httpd/Qmultimedia">
                Options MultiViews FollowSymLinks
                                AllowOverride AuthConfig
                                Order allow,deny
                                Allow from all
                </Directory>
                <Directory "/home/httpd/v3_menu">
                                AllowOverride None
                                Order allow,deny
                                Allow from all
                </Directory>
                <Directory "/home/httpd/Qmultimedia/cgi-bin/">
                                AllowOverride None
                                Options ExecCGI
                                Order allow,deny
                                Allow from all
                </Directory>
                <Directory "/home/httpd/cgi-bin/Qmultimedia/">
                                AllowOverride None
                                Options ExecCGI
                                Order allow,deny
                                Allow from all
                </Directory>
                <Directory "/home/httpd/cgi-bin/Qmultimedia/html">
                                AllowOverride None
                                Options ExecCGI
                                Order allow,deny
                                Allow from all
                </Directory>
</IfModule>

<IfModule mod_autoindex.c>
                AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

                AddIconByType (TXT,/icons/text.gif) text/*
                AddIconByType (IMG,/icons/image2.gif) image/*
                AddIconByType (SND,/icons/sound2.gif) audio/*
                AddIconByType (VID,/icons/movie.gif) video/*

                AddIcon /icons/binary.gif .bin .exe
                AddIcon /icons/binhex.gif .hqx
                AddIcon /icons/tar.gif .tar
                AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
                AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
                AddIcon /icons/a.gif .ps .ai .eps
                AddIcon /icons/layout.gif .html .shtml .htm .pdf
                AddIcon /icons/text.gif .txt
                AddIcon /icons/c.gif .c
                AddIcon /icons/p.gif .pl .py
                AddIcon /icons/f.gif .for
                AddIcon /icons/dvi.gif .dvi
                AddIcon /icons/uuencoded.gif .uu
                AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
                AddIcon /icons/tex.gif .tex
                AddIcon /icons/bomb.gif core

                AddIcon /icons/back.gif ..
                AddIcon /icons/hand.right.gif README
                AddIcon /icons/folder.gif ^^DIRECTORY^^
                AddIcon /icons/blank.gif ^^BLANKICON^^
                DefaultIcon /icons/unknown.gif

                ReadmeName README.html
                HeaderName HEADER.html

                IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
</IfModule>

#
# Document types.
#
<IfModule mod_mime.c>
                AddLanguage da .dk
                AddLanguage nl .nl
                AddLanguage en .en
                AddLanguage et .ee
                AddLanguage fr .fr
                AddLanguage de .de
                AddLanguage el .el
                AddLanguage he .he
                AddCharset ISO-8859-8 .iso8859-8
                AddLanguage it .it
                AddLanguage ja .ja
                AddCharset ISO-2022-JP .jis
                AddLanguage kr .kr
                AddCharset ISO-2022-KR .iso-kr
                AddLanguage nn .nn
                AddLanguage no .no
                AddLanguage pl .po
                AddCharset ISO-8859-2 .iso-pl
                AddLanguage pt .pt
                AddLanguage pt-br .pt-br
                AddLanguage ltz .lu
                AddLanguage ca .ca
                AddLanguage es .es
                AddLanguage sv .sv
                AddLanguage cs .cz .cs
                AddLanguage ru .ru
                AddLanguage zh-TW .zh-tw
                AddCharset Big5                          .Big5          .big5
                AddCharset WINDOWS-1251 .cp-1251
                AddCharset CP866                                .cp866
                AddCharset ISO-8859-5   .iso-ru
                AddCharset KOI8-R                  .koi8-r
                AddCharset UCS-2                                .ucs2
                AddCharset UCS-4                                .ucs4
                AddCharset UTF-8                                .utf8
                <IfModule mod_negotiation.c>
                                LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ru ltz ca es sv tw
                </IfModule>
                AddType application/x-tar .tgz
                AddEncoding x-compress .Z
                AddEncoding x-gzip .gz .tgz
                AddType application/x-compress .Z
                AddType application/x-gzip .gz .tgz
                AddType application/x-httpd-php .php .php4 .php3 .phtml
                AddType application/x-httpd-php-source .phps
                AddHandler cgi-script .cgi
                AddType text/html .shtml
                AddHandler server-parsed .shtml
                AddHandler send-as-is asis
                AddHandler imap-file map
                AddHandler type-map var

</IfModule>

<IfModule mod_setenvif.c>
                BrowserMatch "Mozilla/2" nokeepalive
                BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
                BrowserMatch "RealPlayer 4\.0" force-response-1.0
                BrowserMatch "Java/1\.0" force-response-1.0
                BrowserMatch "JDK/1\.0" force-response-1.0
</IfModule>

NameVirtualHost *

<VirtualHost *>
DocumentRoot "/share/Qweb"
</VirtualHost>

<VirtualHost *>
ServerName zdjecia.xxx.com
ServerAlias www.zdjecia.xxx.com
DocumentRoot "/home/httpd/Qmultimedia"
</VirtualHost>

<VirtualHost *>
ServerName pliki.xxx.com
ServerAlias www.pliki.xxx.com
DocumentRoot "/share/Qweb/AjaXplorer"
</VirtualHost>
 
Konfigi wydaja sie byc ok. Jeśli miał bym się uczepić to tylko jednego w apache.conf. Kilka razy miałem dziwne 'przeboje' gdy używałem Port XX. Zawsze pomagała zmiana Port XX na Listen XX

Jak się domyślam komunikacja z apache dez ssl (http://192.168.0.5/) działa bez problemu ? Czy przy połączeniach bez ssl w logach apache tez masz numer IP przed GET (np ..."[192.168.0.6]GET /test.php HTTP/1.1" 200...) ?

Ponieważ pod ręką mam tylko TS-259 to moje kolejne domysły/uwagi mogą być nietrafione :D

W TS-259 przez stunnel skonfigurowany jest dostęp https do web-panelu administracyjnego QNAP. Może tu się coś gryzie ? Dla testów zrobił bym dodatkowy wpis w stunnel.conf na innym porcie niz 443 np:

[test]
accept = 441
connect = 80
TIMEOUTclose = 0

i zobaczył bym co się dzieje dla https://192.168.0.5:441/

Sprawdź może jak się zachowa stunnel/apache gdy zamiast index.html użyjesz index.php z dowolną zawartością wysyłającą dane do klienta (echo, print itp) ?

Wiem, że to niewielkie pocieszenie ;) ale mój apache w TS-259 akceptuje zarówno samo GET... jak i [XX.XX.XX.XX]GET... dla http i https przez stunnel. Jeśli masz zainstalowanego apache na innej maszynie, to zobacz czy masz ten sam błąd jeśli przekierujesz ruch https przez stunnel w QNAP do tego innego apache.
 
Dzięki za podpowiedzi.

  • Zmieniłem Port na Listen - nie pomogło
  • Bezpośrednie połączenie z apachem działa i wówczas w logach jest GET bez IP, tj. "GET /test.php HTTP/1.1" 200 51583
  • na TS-109 po zainstalowaniu firmware stunnel przekierowywał 443 na 8080 i to był właśnie panel administracyjny, który jeśli przywrócę ustawienia stunnel działa prawidłowo po https. Wygląda na to, że za panel administracyjny jest odpowiedzialny inny service http.
  • niestety na 441 to samo
Dobrym pomysłem jest spróbować z apachem na innej maszynie, ale docelowo apache musi być na qnap'ie, bo tylko on jest włączony non stop. Spróbuję tak zrobić. W ten sposób potwierdzę to co już właściwie wynika z informacji od Ciebie, że to nie jest problem z stunnel'em tylko z apachem, który nie radzi sobie z [xx.xx.xx.xx]GET. Ale nie mam pojęcia, jak zmusić apacha, aby radził sobie z requestem z IP. A może da się tak skonfigurować stunnel, aby nie doklejał IP.

Ciekawe, że apache radzi sobie z requestem, gdy jest to plik PHP a z pozostałymi nie (html, css, jpg).
 
Sprawdzałem te requesty na apache zainstalowanym na debianie i wygląda tak, że każdy request odwołujący się do pliku html (np: [192.168.22.11]GET /test.html HTML/1.1) powoduje "Invalid method in request". Tak samo ...GET /... powoduje powstanie Invalid method in request ze względu na to, że standardowo apache odwołuje się do index.html jestli w requescie nie ma określonej nazwy pliku. Czyli wygląda na to, że błąd jest w stunnel - na 100% potwierdzisz to podłączając stunnel do apache na innej maszynie unix-owej.

A co do plików php, to taki request (np: [192.168.22.11]GET /test.php HTML/1.1) jest przekazywany do php, a nie jest interpretowany przez apache. Dla tego nie dostajesz Invalid method
 
Na komputerze "obok" QNAP'a zainstalowałem apacha po Win 2.2.16 i zawołałem po https poprzez QNAP'a i...

Method Not Implemented
[192.168.0.10]GET to /index.html not supported.

Jeszcze zastanawiałem się czy kombinując mod_rewritem mógłbym wyczyścić to IP sprzed GET'a, ale chyba nie da się tego zrobić.
Wygląda na to, że rozwiązanie problemu jest w konfiguracji stunnel'a.
 
Zainstalowałem też na komputerze obok stunnel (pod Win) w wersji tej samej co na QNAP'ie, tj. 4.15. Skonfigurowałem go na stronkę www na QNAP'ie i... działa. Jedyna różnica, jaką widzę, ale wątpię by to ona powodowała problem, to na QNAPie w 1 linii debug logów stunnel jest

stunnel 4.15 on arm-none-linux-gnueabi with OpenSSL 0.9.7a Feb 19 2003

a pod Win mam

stunnel 4.15 on x86-pc-mingw32-gnu with OpenSSL 0.9.7i 14 Oct 2005

Widzę, że pojawił się nowy firmware dla TS-109, ale nowe jest wrogiem dobrego. Mam jeszcze nadzieję, że uda się załatać stunnel.
 
Dodam jeszcze, że włączyłem logowanie dla panela konfiguracyjnego (w skrypcie /etc/init.d/thttpd.sh w linii gdzie jest uruchamiany daemon dodałem -l oraz ścieżkę z nazwą pliku). Przełączyłem stunnel na panel konfiguracyjny (na port 8080) i w logach mam GET'y bez IP w nawiasach klamrowych. Wymiękam. O co tu chodzi?
 
m@k napisał:
Zainstalowałem też na komputerze obok stunnel (pod Win) w wersji tej samej co na QNAP'ie, tj. 4.15. Skonfigurowałem go na stronkę www na QNAP'ie i... działa. Jedyna różnica, jaką widzę, ale wątpię by to ona powodowała problem, to na QNAPie w 1 linii debug logów stunnel jest ....

tak, ta różnica nic nie znaczy. Z tego wynika, że problem jest najprawdopodobniej jest w stunnel na QNAP :/

m@k napisał:
Widzę, że pojawił się nowy firmware dla TS-109, ale nowe jest wrogiem dobrego. Mam jeszcze nadzieję, że uda się załatać stunnel.

może w tym firmware jest naprawiony ten problem. Z jednej strony rozumiem, że nowe jest wrogiem dobrego, ale z drugiej strony stare też najzdrowsze nie jest ;>
Na Twoim miejscu mając już tak dziwne objawy nie zastanawiał bym się tylko zainstalował najnowszy firmware. Gorzej już (raczej) być nie może ;)

m@k napisał:
Dodam jeszcze, że włączyłem logowanie dla panela konfiguracyjnego (w skrypcie /etc/init.d/thttpd.sh w linii gdzie jest uruchamiany daemon dodałem -l oraz ścieżkę z nazwą pliku). Przełączyłem stunnel na panel konfiguracyjny (na port 8080) i w logach mam GET'y bez IP w nawiasach klamrowych. Wymiękam. O co tu chodzi?

przełączyłeś stunnel w QNAP-ie czy ten zaintalowany na windowsie ?
 
Zmieniłem firmware na nowszy. Nic się nie zmieniło. Stunnel na qnap'ie przełączyłem na 8080 - czyli na panel konfiguracyjny. I działa bardzo dobrze. Nie wiem co to jest za serwer _thttpd_, ale z stunnel z nim współpracuje.
Nie działa z apachem.