• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

error 20 at 0 depth lookup:unable to get local issuer certif

amzd

Newbie
Hallo,
es geht um ein nicht funktionierendes Zertifikat.
ich habe unter Linux (SLES 11) einen private Key erstellt und ein certificate signing request (CSR). habe das zu meinem CA gesandt und mein Zertifikat bekommen.
Leider wird das in Linux nicht erkannt.

Dies waren die Befehle:

Code:
openssl req -nodes -newkey rsa:2048 -keyout domain.key -out servername.csr -config /etc/ssl/req.cnf
Das -keyout hat den private key "domain.key" erstellt.
Das servername.csr habe ich an den CA gesandt. Der hat mir ein zertifikat zurück gesandt.
Wenn ich jetzt mit openssl verifizieren will:

Code:
Openssl verify /var/stunnel/pem/domain.key
Dann bekomme ich:
error 20 at 0 depth lookup:unable to get local issuer certificate
Den gleichen Fehler bekomme ich wenn ich das mir zugestellte Zertifikat verifizieren will:

Code:
Openssl verify /var/stunnel/cert/servername.crt
oder auch

Code:
openssl verify -CAfile /var/stunnel/pem/servername.pem /var/stunnel/cert/servername.crt
In servername.pem hatte ich den domain.key und dahinter das Zertifikat kopiert.
Weiß jemand Rat?
Bin ich hier im richtigen Sub-Forum?
Danke und Gruß
 
OP
A

amzd

Newbie
Hallo,
kurze Nachricht:
ich musste die root chain herunterladen, entpacken, in .pem konvertieren. Danach bekam ich mein OK.
stunnel funktioniert dennoch nicht.
Muss ich noch mal schauen.

Danke und Gruß
 

spoensche

Moderator
Teammitglied
Stunnel funktioniert nicht? Du musst schon ein wenig genauer werden.

Was für Fehlermeldungen bekommst du?
 
OP
A

amzd

Newbie
Hallo,

ich habe schon mal ausgeholt, kam aber nicht weiter:
http://www.linuxforen.de/forums/showthread.php?t=275489

War eine Woche im Urlaub, hier der Sachverhalt:
Auf einem Server DMS1 läuft eine Dealermanagement-Software, die auf Port 6000 lauscht. Dieser Port ist ungesichert.
Die Anfragen kommen von außen, von beliebigen Clients. Früher wurden die Anfragen an DMS1:6000 gestellt.
Aber nun, da man entschieden hat, dass eine gesicherte Verbindung benutzt werden muss, werden die Anfragen via ssl an DMS1:444 gestellt (z.B.).

Die DealermanagementSoftware kann so schnell nicht auf ssl umgestellt werden.
Also möchte ich, dass ein stunnel auf dms1:444 lauscht, die Anfrage entschlüsselt – und dann die entschlüsselte Anfrage an dms1:6000 weiter leitet. Das Ergebnis müsste ja automatisch rückwärts gehen.

Kann stunnel für diesen Zweck benutzt werden?
Habe langsam die Vermutung, dass das nicht geht, weil stunnel nur für eine ganz spezifische Verbindung benutzt werden kann, aber nicht, um beliebige Client-Anfragen, die via ssl kommen, auf dem lokalen Server zu entschlüsseln, das dann von der DMS-Software auf dem Server bearbeiten zu lassen und dann wieder zu verschlüsseln und an den anfragenden Client zurück zu senden. Das würde stunnel als eine Art tcp-trace mit Entschlüsselung-Verschlüsselung-Übersetzung verwenden.

Wenn ich stunnel auf dem Server als server laufen lasse, dann muss ich ja
Code:
[SW1]
accept = 
connect =
konfigurieren.
Accept wäre dann ein Port auf dem stunnel lauscht und an den eine lokale Anwendung senden müss. Aber ich will, dass stunnel auf dem verschlüsselten Port lauscht und dann an die lokale Anwendung unverschlüsselt weiterleitet, von dort alle Antworten annimmt, diese wieder verschlüsselt und an den Anfragenden zurück sendet.

Weiß jemand ob das geht und wenn, wie?
Danke und Gruß
 

spoensche

Moderator
Teammitglied
Da die Software über HTTP kommuniziert machst du dir das leben mit stunnel nur unnötig schwer. Du könntest für diese Aufgabe z.B. den HTTP-Server Nginx als SSL-Proxy verwenden und dein Problem wäre damit gelöst.
 
OP
A

amzd

Newbie
Hi,
ich hatte das Thema neu eröffnet, weil es hier unter gelöst erscheint, was es ja nicht war.
Den nginx sehe ich als Proxy für einen ganzen Server, aber hier sollen ja nur die Anfragen auf einen Port, die neuerdings via ssl kommen, umgeleitet werden.
Irgendwie kommt mir nginx für diese Aufgabe wie eine Kanone für Spatzen vor.

Ginge das denn prinzipiell mit stunnel? Eher nicht?

Schöne Grüße
 

spoensche

Moderator
Teammitglied
Du kannst es auch mit stunnel realisieren. Bei "accept" trägst du den stunnel Port ein (Da kommen die verschlüsselten Verbindungen an) und bei "connect" trägst du den Port von der Anwendung ein. stunnel ist also nichts weiteres als ein SSL-Proxy.
 
OP
A

amzd

Newbie
Hi,
ich würde es gerne mit stunnel realisieren.
so wie du sagst, hatte ich das schon probiert:
Code:
[sw1]
accept = 444
connect = 6000

Dann:
Code:
stunnel &
Ergebnis:
Code:
[1]+ Done      stunnel
netstat -lpr zeigt, dass 444 nicht abgehört wird.

Er startet stunnel und beendet stunnel gleich wieder.
Es kommt auch keine Logdatei zustande, was ich spezifiziert hatte:
Code:
debug = 5 
output = /var/stunnel/stunnel444.log
Dann hatte ich die Ports von accept und connect vertauscht.
Danach kam eine Meldung:
Could not load DH parameters from ...
Daraufhin habe ich die Diffie Hellman Parameter mit openssl erzeugt:
openssl gendh >/var/dhparms.log
Und das dann and das Zertifikat dran gehängt.
Hat er auch erkannt.
Habe die Ports wieder vertauscht, mit
accept = 444
Aber danach sagt er gar nichts und beendet stunnel sofort wie oben angezeigt mit [1]+
Wieso bringt er hier keinen Output, wenn er sich an etwas stört, sondern nur, wenn accept auf 6000 stetht und connect auf 444?

Müsste stunnel jetzt unter dem Namen sw1 laufen oder wofür ist
[sw1]
Wenn ich das nicht angebe, moniert er das accept bei inetd-Mode nicht spezifiziert werden kann.

Wenn ich bewusst auf einen besetzten Port konfiguriere, bekomme ich wenigstens output, was er so alles macht:
Code:
Reading configuration from file /etc/stunnel/stunnel.conf
Snagged 64 random bytes from /root/.rnd
Wrote 1024 new random bytes to /root/.rnd
PRNG seeded successfully
Using DH parameters from /var/stunnel/certs/servername.crt
DH initialized with 512 bit key
ECDH initialized
Certificate: /var/stunnel/certs/servername.crt
Certificate loaded
Key file: /var/stunnel/pem/servername.pem
Private key loaded
SSL context initialized for service sw1
Configuration successful
No limit detected for the number of clients
libwrap_init: FD=3 allocated (blocking mode)
libwrap_init: FD=4 allocated (blocking mode)
libwrap_init: FD=4 allocated (blocking mode)
libwrap_init: FD=5 allocated (blocking mode)
libwrap_init: FD=5 allocated (blocking mode)
libwrap_init: FD=6 allocated (blocking mode)
libwrap_init: FD=6 allocated (blocking mode)
libwrap_init: FD=7 allocated (blocking mode)
libwrap_init: FD=7 allocated (blocking mode)
libwrap_init: FD=8 allocated (blocking mode)
signal_pipe: FD=9 allocated (blocking mode)
signal_pipe: FD=10 allocated (blocking mode)
accept socket: FD=11 allocated (non-blocking mode)
Option SO_REUSEADDR set on accept socket
Error binding sa3 to 0.0.0.0:6000
bind: Address already in use (98)

Nun vermute ich, dass er evtl. sofort zumacht, weil es auf dem Server gar keinen Dienst sw1 gibt.
Frage hier: muss der existent sein?
Die Anfragen kommen von aussen direkt auf den Port 444 und sollen von stunnel entschlüsselt und auf 6000 lokal weiter geleitet werden. Die Antworten vom Server sollen dann entsprechend auf dem gleichen Weg zurück gehen.

Vielen Dank im Voraus.
Schöne Grüße
Andreas
 
OP
A

amzd

Newbie
Hi,
was mir noch durch den Kopf geht:
wenn das Zertifikat auf einem 2048er-Verschlüsselung basiert, müssen dann die Diffie Hellman key auch 2048 statt 512 sein?

Danke und Gruß
 

spoensche

Moderator
Teammitglied
Der Diffie Hellman Key auh dhparam genannt muss keine 2048 Bit sein, allerdings auch nicht weniger als 1024 Bit. Da er aber für die Initiierung der verschlüsselten Verbindung mit eingebunden wird (Erzeugen des Masterkeys) und Rechenpower günstig ist sollte er min. 2048 Bit besser 4096 Bit lang sein.
 
OP
A

amzd

Newbie
Hi,
OK, das mit dem 2048bit-Key für dh hat geklappt:

Aber wichtiger waren meine Fragen von 12:32.
Warum beendet sich stunnel sofort wenn ich auf einen freien Port konfiguriere?

Warum sagt er unten:
Code:
SSL context initialized for service sw1
Configuration successful
Muss ein Dienst sw1 auf dem Server laufen und deswegen beendet er sich sofort?
Ich habe diesen Dienst "sw1" nicht, weil die Portanfragen auf 444 eingehen, entschlüsselt werden sollen und auf 6000 weitergehen sollen und dann zurück.

Irgendwo habe ich einen Denkfehler, oder?

Code:
ltautol1:/var # Reading configuration from file /etc/stunnel/stunnel.conf
Snagged 64 random bytes from /root/.rnd
Wrote 1024 new random bytes to /root/.rnd
PRNG seeded successfully
Using DH parameters from /var/stunnel/certs/servername.crt
DH initialized with 2048 bit key
ECDH initialized
Certificate: /var/stunnel/certs/servername.crt
Certificate loaded
Key file: /var/stunnel/pem/servername.pem
Private key loaded
SSL context initialized for service sw1
Configuration successful
No limit detected for the number of clients
libwrap_init: FD=3 allocated (blocking mode)
libwrap_init: FD=4 allocated (blocking mode)
libwrap_init: FD=4 allocated (blocking mode)
libwrap_init: FD=5 allocated (blocking mode)
libwrap_init: FD=5 allocated (blocking mode)
libwrap_init: FD=6 allocated (blocking mode)
libwrap_init: FD=6 allocated (blocking mode)
libwrap_init: FD=7 allocated (blocking mode)
libwrap_init: FD=7 allocated (blocking mode)
libwrap_init: FD=8 allocated (blocking mode)
signal_pipe: FD=9 allocated (blocking mode)
signal_pipe: FD=10 allocated (blocking mode)
accept socket: FD=11 allocated (non-blocking mode)
Option SO_REUSEADDR set on accept socket
Error binding sa3 to 0.0.0.0:8500
bind: Address already in use (98)

So scheint es doch soweit ok zu sein. Warum läuft das auf einem freien Port nicht an, sondern bringt sofort

Code:
[1]+ Done           stunnel

?

Viele Grüße
 
OP
A

amzd

Newbie
Hi,
da kommt nichts:
Code:
ps -eaf |grep stun
root     14063 13946  0 14:07 pts/0    00:00:00 grep stun
beim netstat-Befehl werden weder die in stunnel eingetragenen Ports noch sw1 aufgelistet.

Der Aufruf
stunnel &
läut durch, beendet sich, sagt nichts, macht keine Log-Datei. Einfach nichts.
Nur wenn ich stunnel bewußt auf einen besetzten Port konfiguriere zeigt er, was er macht, und bleibt dann stehen, weil der Port - natürlich - nicht verfügbar ist.

Vielleicht kann stunnel auch nur auf nicht-verschlüsselte Ports hören, um die weiterzuleiten, aber nicht umgekehrt?

Schöne Grüße
Andreas
 
OP
A

amzd

Newbie
Hi,
stunnel hatte sich sofort wieder beendet, weil in der stunnel.conf folgende Zeilen enthalten waren:
setuid = nobody
setgid = nogroup


Diese Benutzer hatten keinerlei Rechte auf die stunnel-Verzeichnisse oder -Dateien.
Ich hatte angenommen, dass es extra so konfiguriert war und sich jemand etwas dabei gedacht hatte.
Nachdem ich diese Zeilen auskommentiert hatte, ging es dann.

Weiß jemand, wie das mit nobody und nogroup gemeint war?

Zudem zeigt stunnel nun ein komisches Verhalten, als dass nach der Eingabe des Startbefehls gleich 5 PIDs mit stunnel aktiv sind:
Code:
servername:/etc/stunnel # stunnel /etc/stunnel/stunnel.conf
servername:/etc/stunnel # ps -eaf|grep stunnel
root     21028     1  0 11:48 pts/0    00:00:00 stunnel /etc/stunnel/stunnel.conf
root     21029     1  0 11:48 pts/0    00:00:00 stunnel /etc/stunnel/stunnel.conf
root     21030     1  0 11:48 pts/0    00:00:00 stunnel /etc/stunnel/stunnel.conf
root     21031     1  0 11:48 pts/0    00:00:00 stunnel /etc/stunnel/stunnel.conf
root     21032     1  0 11:48 pts/0    00:00:00 stunnel /etc/stunnel/stunnel.conf
root     21033     1  0 11:48 ?        00:00:00 stunnel /etc/stunnel/stunnel.conf

Weiß jemand warum? Kann man das auf eine PID reduzieren?

Danke und Gruß
 

spoensche

Moderator
Teammitglied
amzd schrieb:
Hi,
stunnel hatte sich sofort wieder beendet, weil in der stunnel.conf folgende Zeilen enthalten waren:
setuid = nobody
setgid = nogroup


Diese Benutzer hatten keinerlei Rechte auf die stunnel-Verzeichnisse oder -Dateien.
Ich hatte angenommen, dass es extra so konfiguriert war und sich jemand etwas dabei gedacht hatte.
Nachdem ich diese Zeilen auskommentiert hatte, ging es dann.

Weiß jemand, wie das mit nobody und nogroup gemeint war?

Ja. Stunnel wurde mit den Rechten des Users nobody ausgeführt. Allerdings hat nobody keine Rechte. Überprüfe mal, ob es auf deinem System einen Systemuser stunnel gibt.

Wenn der User stunnel und die gleichnamige Gruppe existiert, dann ersetzt du in deiner Konfiguration nobody und nogroup mit stunnel und entfernst die Kommentare vor setuid setgid. Anschließend änderst du noch den Eigentümer und die Gruppe der Verzeichnisse, die Stunnel verwendet.

Das ein Systemdienst mit den Rechten eines eigenständigen Benutzer läuft hat einen sicherheitstechn. Hintergrund. Wenn ein Systemdienst mit root Rechten gestartet wird und ein Angreifer eine Schwachstelle im Stunnel ausnutzt, dann hat der Angreifer u.U, vollständige root Rechte auf dem System. Dies verhindert man in dem man einen Systemuser ohne Loginshell für den Betrieb des jeweiligen Dienstes verwendet.

amzd schrieb:
Zudem zeigt stunnel nun ein komisches Verhalten, als dass nach der Eingabe des Startbefehls gleich 5 PIDs mit stunnel aktiv sind:
Code:
servername:/etc/stunnel # stunnel /etc/stunnel/stunnel.conf
servername:/etc/stunnel # ps -eaf|grep stunnel
root     21028     1  0 11:48 pts/0    00:00:00 stunnel /etc/stunnel/stunnel.conf
root     21029     1  0 11:48 pts/0    00:00:00 stunnel /etc/stunnel/stunnel.conf
root     21030     1  0 11:48 pts/0    00:00:00 stunnel /etc/stunnel/stunnel.conf
root     21031     1  0 11:48 pts/0    00:00:00 stunnel /etc/stunnel/stunnel.conf
root     21032     1  0 11:48 pts/0    00:00:00 stunnel /etc/stunnel/stunnel.conf
root     21033     1  0 11:48 ?        00:00:00 stunnel /etc/stunnel/stunnel.conf

Weiß jemand warum? Kann man das auf eine PID reduzieren?

Warum? Weil in der Konfiguration bestimmt ein Parameter Prozesschildren den Wert 5 hat. Das kann man auf einen Prozess reduzieren, was allerdings einen Nachteil hat.
Jeder Childprozess kann eine bestimmte Anzahl an Clientverbindungen bedienen ohne das dabei weitere Clients warten müssen, weil sie von einem anderen Kindprozess bedient werden. Wenn du das ganze jetzt auf einen Prozess runterregelst, dann kann es, je nach Anzahl der Anfragen und der Auslastung des Systems, dazu führen, dass die Clients eine lange Wartezeit haben, und die Reaktionszeit der gesamten Anwendung in die Höhe schnellt und die Anwendung im schlimmsten Fall nicht mehr bedienbar ist.

Ob ein Server Forward Secrecy unterstütz und wie man es testet findest du unter http://www.heise.de/security/artikel/Forward-Secrecy-testen-und-einrichten-1932806.html
 
Oben