Problem mit Webservice, SSL und Silverlight Client

Status
Für weitere Antworten geschlossen.

kotellettenhorst

Benutzer
Mitglied seit
18. Aug 2009
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
Hallo, ich habe ein Problem, an dem ich mir nun seit zwei Wochen die Zähne ausbeiße. Ausgangspunkt ist ein kleiner PHP SOAP Webservice und ein .NET Silverlight (4.0) Client. Service und Client sollen per verschlüsselter SSL Verbindung über https abgerufen bzw. angesprochen werden. Das Ganze funktioniert auf der lokalen XAMPP Entwicklungsumgebung hervorragend. Nun möchte ich die Anwendung auf der Diskstation über meine externe DynDns Adresse veröffentlichen, wobei diverse Probleme bei der Portierung auftreten.

Zunächst einmal eine kurze Erläuterung zur Vorgehensweise, wie in Visual Studio 2010 ein Webservice verwendet werden kann: Mittels "Dienstverweis hinzufügen" öffnet sich ein Wizzard, bei dem die URL des Webservices bzw. dessen WSDL Definition angegeben werden kann (beginnend mit https://, da ja die SSL Verschlüsselung genutzt werden soll). Nach Betätigen der Schaltfläche "Gehe zu" wird dann die Service-Definition abgerufen. Da es sich bei XAMPP ja nur um eine Testumgebung mit Testzertifikaten handelt, erfolgt bei der Abfrage der Definition zunächst eine Sicherheitsabfrage ("Visual Studio hat ein Problem mit dem Sicherheitszertifikat der Site festgestellt. […] Möchten Sie fortfahren?"). Bestätigt man diese Abfrage, so kann Visual Studio die Definition laden, auswerten und beim Abschließen des Wizzard automatisch die entsprechenden Proxy-Klassen zur asynchronen Abfrage des Webservices generieren.

Nun zu meinem eigentlichen Problem: gebe ich als URL die Adresse des Webservices auf der Diskstation an, so passiert erst einmal längere Zeit gar nichts (auch keine Sicherheitsabfrage wie auf dem XAMPP Server), bis die Abfrage in einen Timeout läuft. Das Verhalten ist das gleiche, egal ob ich den internen LAN Hostname der Diskstation oder die externe DynDns Adresse angebe. Die Abfrage ohne SSL über normales http funktioniert hingegen einwandfrei.
In einem Browser (IE, Firefox und Safari) kann ich auch über https auf den Service navigieren, wobei zunächst eine (je nach Browser unterschiedliche) Zertifikatsfehler-Seite angezeigt wird. Aber grundsätzlich ist die Seite über https ansprechbar.
Die einzigen Unterschiede, die mir aufgefallen sind, sind die Art der Zertifikatsfehler im Internetexplorer (von XAMPP: "Dieses Zertifizierungsstellen-Stammzertifikat ist nicht vertrauenswürdig. Installieren Sie das Zertifikat in den Speicher vertrauenswürdiger Stammzertifizierungsstellen…"; und von Diskstation: "Dieses Zertifikat kann nicht bis zu einer Zertifizierungsstelle verifiziert werden").
Weiterhin ist es etwas merkwürdig, dass das Aufrufen des Services beim Mitschneiden des verschlüsselten Datenverkehrs mittels Fiddler (Netzwerk Debugging mit HTTPS Decrypt durch man-in-the-middle) auf der Diskstation sogar dann im Browser nicht mehr funktioniert: unendlich lange nichts bis zum Timeout (in Fiddler: keine Antwort auf das HTTP CONNECT an 443). Der Datenverkehr mit XAMPP kann hingegen problemlos mitgeschnitten werden.
Meine Schlussfolgerung deshalb: es muss irgendetwas mit der SSL Konfiguration und/oder den Zertifikaten im Apache der DS zu tun haben.

Ich hatte auch schon einmal versucht, ein nach Wiki/Forum eigens erstelltes Zertifikat zu importieren. Nach dem Importieren des erstellten CAs zu den vertrauenswürdigen Stammzertifizierungsstellen im Client wurde zwar im IE kein Zertifikatsfehler mehr angezeigt, aber das eigentliche Problem blieb bestehen, so dass ich wieder auf die ursprünglichen Synology Zertifikate zurückgegangen bin.
Irgendetwas scheint in der Standard SSL Konfiguration der Diskstation nicht ganz korrekt zu sein. Die Frage ist nun, was ist im XAMPP Apache oder den dortigen Zerttifikaten anders, dass es dort funktioniert (und zwar auch mit den Standard XAMPP Testzertifikaten) und auf der Diskstation nicht?

Ich bin für jede Hilfe dankbar!
Gruß
kotellettenhorst
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Der Aufruf des DS-Manager via Port 5001 (https) geht aber schon, oder?

Es könnte ein Tipp sein, wenn du dir ein Zertifikat von einem Zertifizierer holst. Irgendwo hier im Forum gibts es dazu Diskussionen und auch Adressen von konstenlosen Zertifizierer.

Itari
 

kotellettenhorst

Benutzer
Mitglied seit
18. Aug 2009
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
Klar, alle HTTPS Aufrufe (sei es der DSM über 5001 oder die Webstation über 443) funktionieren wie gesagt im Browser.

Wenn der Webservice funktioniert, dann würde ich mich auch um eine ordentliche Zertifizierung kümmern, allerdings unterstützen die kostenlosen die ich kenne (z.B. SartSSL) keine DynDns Adressen..
Zunächst aber möchte ich natürlich den Webservice mit Testzertifikaten zum Laufen bekommen, um die Funktion zu prüfen. Das muss ja auch irgendwie möglich sein, da der Aufruf des Services vom XAMPP Apache Server wie gesagt funktioniert..

Vielleicht probier ich nachher testweise mal, die Zertifikate vom XAMPP Apache in der DS aus - oder gibt das irgendwelche Probleme?
Wenn es damit funktioniert, wäre klar, dass es irgendwie an den Zertifikaten liegt. Wenn es damit nicht funktioniert, dann muss es irgendwo einen entscheidenden Unterschied in den httpd*/ssl*.conf Dateien geben..

Vielleicht ist ja noch jemand im Forum aktiv, der in .NET entwickelt und das geschilderte Problem mal eben verifizieren oder entkräften kann (einfach eine beliebige WSDL Datei ins Webroot der DS legen und in Visual Studio einen Dienstverweis über HTTPS hinzufügen..)?
 

kotellettenhorst

Benutzer
Mitglied seit
18. Aug 2009
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
Habe noch mal ein paar Sachen ausprobiert:

Die Standard Synology Zertifikate (server.crt und server.key) auf den XAMPP Apache kopiert. Ergebnis: Webservice aus Visual Studio einwandfrei erreichbar (Sicherheitsabfrage zum Zertifikat erscheint).

Da dies für mich bedeutet, dass es eigentlich nicht an den Zertifikaten liegen kann, sondern irgendwie an der Apache Konfiguration, habe ich noch mal die ssl Konfigurationen verglichen (httpd-ssl.conf bzw. httpd-ssl.conf-user bei der DS unter /usr/syno/apache/conf/extra/): einige Unterschiede sind schon da, wobei ich nicht weiß, in wie weit diese sich auswirken. Mir ist am offensichtlichsten die unterschiedliche Definition der SSLCipherSuite aufgefallen. Diese habe ich auf der DS mal auf den Wert geändert, so wie er im XAMPP Apache angegeben ist. Ergebnis: Webservice aus Visual Studio ist weiterhin nicht erreichbar.

Auf dem XAMPP Apache findet sich unter den Log files auch eine Datei, die die ssl requests auflistet. Im DS ist das ssl request logging standardmäßig abgeschaltet (bzw. auf /dev/null geleitet). Ich habe dort mal statt dessen einen Dateinamen unter /var/log/ angegeben, aber leider wird nichts geloggt (selbst die erfolgreichen Zugriffe über den Webbrowser nicht). Insofern frage ich mich, ob der Apache diese config Datei überhaupt auswertet.. Apache hatte ich natürlich vor der conf Änderung gestoppt und anschließend wieder gestartet (mittels /usr/syno/ect/rc.d/S97apache-user.sh).

Hier hören leider meine Kenntnisse vom Apache auf und ich müsste nur raten und wie wild in den configs rumexperimentieren - und das bringts ja irgendwie auch nicht..
Hat jemand noch einen Tipp hierzu?
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Man muss für das Apache-Logging nicht nur eine Datei angeben, sondern auch noch die Zeilen auskommentieren, wo drinne steht, was und eventuell mit welchem Level geloggt wird ... meist sind das 2 Zeilen, die direkt untereinander stehen.

Itari
 

kotellettenhorst

Benutzer
Mitglied seit
18. Aug 2009
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
Das mag für das ErrorLog gelten, für das CustomLog (Access Log) habe ich keine derartige "Enable"-Einstellung finden können.

Hier mal die httpd.conf-user und die httpd-ssl.conf (kommentarzeilen musste ich größtenteils entfernen, da dies sonst zu lang für den post geworden wäre..):

Rich (BBCode):
ServerRoot "/usr/syno/apache"

Listen 80

LoadModule rewrite_module modules/mod_rewrite.so

<IfModule !mpm_netware_module>
User nobody
Group nobody
</IfModule>

ServerAdmin admin

ServerName *:80

<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>

<Directory "/var/services/web">
    Options MultiViews FollowSymLinks ExecCGI

    AllowOverride All

    Order allow,deny
    Allow from all
    
</Directory>


<IfModule dir_module>
    DirectoryIndex index.html index.htm index.cgi index.php index.php3
</IfModule>

<FilesMatch "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</FilesMatch>


ErrorLog /var/log/httpd-error-user.log
#ErrorLog /dev/null
TraceEnable off

#LogLevel debug
LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    CustomLog /var/log/httpd-access-user.log combined
    #CustomLog /dev/null combined

</IfModule>

<IfModule alias_module>
   
</IfModule>

<IfModule cgid_module>

</IfModule>

DefaultType text/plain

<IfModule mime_module>
    TypesConfig /usr/syno/apache/conf/mime.types

    AddEncoding x-compress Z
    AddEncoding x-gzip gz tgz

    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz

    AddHandler cgi-script .cgi

    AddType image/x-icon .ico
</IfModule>

MIMEMagicFile /usr/syno/apache/conf/magic


ErrorDocument 403 /webdefault/sample.php?status=403
# Page not found in apache
ErrorDocument 404 /webdefault/sample.php?status=404
# Page not found in thttpd
ErrorDocument 500 /webdefault/sample.php?status=500
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html

Include conf/extra/httpd-mpm.conf-user

# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf

# Fancy directory listings
Include conf/extra/httpd-autoindex.conf-user

# Language settings
Include conf/extra/httpd-languages.conf-user

# User home directories
#Include conf/extra/httpd-userdir.conf

# Real-time info on requests and configuration
#Include conf/extra/httpd-info.conf

# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

# Local access to the Apache HTTP Server Manual
#Include conf/extra/httpd-manual.conf

# Distributed authoring and versioning (WebDAV)
#Include conf/extra/httpd-dav.conf

# Various default settings
Include conf/extra/httpd-default.conf-user

<IfDefine SSL>
# Secure (SSL/TLS) connections
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
</IfDefine>

AddType application/x-httpd-php .php
LoadModule php5_module /lib/libphp5.so

LoadModule deflate_module modules/mod_deflate.so

<IfModule mod_deflate.c>
        DeflateCompressionLevel 2
        AddOutputFilterByType DEFLATE text/html text/plain text/xml
        AddOutputFilter DEFLATE js css
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.[0678] no-gzip
        BrowserMatch \bMSIE\s7  !no-gzip !gzip-only-text/html
</IfModule>

LoadModule headers_module modules/mod_headers.so

<Files *.js>
Header unset Etag
</Files>

<Files *.css>
Header unset Etag
</Files>

Rich (BBCode):
Listen 443

AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl

SSLPassPhraseDialog  builtin

#SSLSessionCache         dbm:/usr/syno/apache/logs/ssl_scache
SSLSessionCache          none
SSLSessionCacheTimeout   3600


SSLMutex  file:/var/tmp/ssl_mutex-user

#
#   Global parameters for virtual host
#
SSLCipherSuite HIGH:MEDIUM:!RC4:!aNULL
SSLProtocol all -SSLv2
SSLCertificateFile /usr/syno/etc/ssl/ssl.crt/server.crt
SSLCertificateKeyFile /usr/syno/etc/ssl/ssl.key/server.key

##
## SSL Virtual Host Context
##

<VirtualHost *:443>
SSLEngine on

<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>

BrowserMatch ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

#   Per-Server Logging:
#   The home of a custom SSL log file. Use this when you want a
#   compact non-error SSL logfile on a virtual host basis.
#CustomLog /dev/null \
CustomLog /var/log/httpd-ssl-requests.log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

</VirtualHost>                                  

Include /usr/syno/etc/httpd-ssl-vhost.conf-user

das error log und das normale access log unter /var/log/httpd-access-user.log wird geschrieben, aber das ssl access log nicht, die datei /var/log/httpd-ssl-requests.log wird nicht erstellt.

Auf dem XAMPP Server lautet die Eintragung für das SSL Logging übrigens
Rich (BBCode):
CustomLog /Applications/XAMPP/xamppfiles/logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
und hier erscheinen im log Meldungen á la
Rich (BBCode):
[09/Feb/2011:13:24:26 +0100] 192.168.2.134 TLSv1 AES128-SHA "GET ....

Also zunächst müsste ich erst mal ein funktionierendes SSL Request Logging haben, bevor ich den Fehler weiter eingrenzen kann, aber ich kann mir nicht erklären, wieso lein log erstellt wird..
Kann das mal jemand von euch probieren?
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat