SSL/TLS Implementierung von Servern lokal testen

Portrait von Finn Kumkar

veröffentlicht am 15.02.2022
geschrieben von Finn Kumkar

Wie man die SSL/TLS Implementierung von Servern lokal mit nmap und openssl testet.

Transportverschlüsselung

Um Daten sicher zwischen einem Server und dem Browser auszutauschen, wird das Internetkommunikationsprotokoll HTTPS (HyperText Transfer Protocol Secure) verwendet. Vereinfacht gesagt, werden durch den Einsatz von HTTPS die Daten zwischen dem Server und dem Browser verschlüsselt.

Hierzu wird das eigentliche HTTP-Protokoll mit dem Verschlüsselungsprotokoll TLS (Transport Layer Security) abgesichert. Die Verwendung des Vorgängerprotokolls SSL (Secure Sockets Layer) ist seit 2015 offiziell als unsicher eingestuft worden.

Damit eine Transportverschlüsselung als sicher gilt, muss die SSL/TLS-Implementierung korrekt konfiguriert sein.

Öffentliche Server testen

Es gibt eine Vielzahl an Möglichkeiten diese Sicherheit der Transportverschlüsselung von öffentlichen Servern zu überprüfen. Ein populärer Service hierfür ist:

www.ssllabs.com/ssltest

Oder wenn der Server nicht am Standard-Port 443 für HTTPS-Verbindungen läuft:

www.immuniweb.com/ssl

Lokale Server testen

Aber was tut man, wenn man einen Server lokal testen muss? Beispielsweise, weil man ihn gerade erst konfiguriert, oder wenn man einen unbekannten Server überprüfen möchte, bevor man ihn ans öffentliche Internet hängt.

Hierzu bieten sich zwei praktische Kommandozeilen Tools an: Mit nmap kann man sich schnell einen Überblick über die erlaubten Protokolle und Cipher einer SSL/TLS-Implementierung verschaffen. Mit openssl kann man überprüfen, ob eine sicher und/oder unsichere Verbindung zum Server möglich ist.

Überblick mit nmap verschaffen

Einen Server der lokal unter https://127.0.0.1:55555 läuft kann man wie folgt testen:

nmap --script ssl-enum-ciphers -p 55555 127.0.0.1

Das Ergebnis ist eine Auflistung aller Protokolle und erlaubte Cipher der SSL/TLS Implementierung. Interessant sind hier vor allem folgende Ergebnisse (in der Ausgabe hervorgehoben):

  1. Das Protokoll (SSLv3 ist offziell unsicher und TLSv1.0 sowie TLSv1.1 sind deprecated).
  2. Der warnings Bereich enthält mögliche Angriffsvektoren.
  3. Der least strength Wert ist der am schlechtesten bewertete Cipher (nach Qualys SSL Labs SSL Server Rating Guide).

Diesen Server sollte man so nicht ans Internet hängen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Starting Nmap 7.91 ( https://nmap.org ) at 2022-01-20 12:44 Mitteleuropäische Zeit
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00s latency).

PORT      STATE SERVICE
55555/tcp open  unknown
| ssl-enum-ciphers:
|   SSLv3:
|     ciphers:
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 4096) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_IDEA_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 4096) - C
|       TLS_RSA_WITH_RC4_128_SHA (rsa 4096) - C
|       TLS_RSA_WITH_SEED_CBC_SHA (rsa 4096) - A
|     compressors:
|       NULL
|     cipher preference: client
|     warnings:
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher IDEA vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       CBC-mode cipher in SSLv3 (CVE-2014-3566)
|       Ciphersuite uses MD5 for message integrity
|       Forward Secrecy not supported by any cipher
|   TLSv1.0:
|     ciphers:
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 4096) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_IDEA_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 4096) - C
|       TLS_RSA_WITH_RC4_128_SHA (rsa 4096) - C
|       TLS_RSA_WITH_SEED_CBC_SHA (rsa 4096) - A
|     compressors:
|       NULL
|     cipher preference: client
|     warnings:
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher IDEA vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       Ciphersuite uses MD5 for message integrity
|       Forward Secrecy not supported by any cipher
|   TLSv1.1:
|     ciphers:
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 4096) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_IDEA_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 4096) - C
|       TLS_RSA_WITH_RC4_128_SHA (rsa 4096) - C
|       TLS_RSA_WITH_SEED_CBC_SHA (rsa 4096) - A
|     compressors:
|       NULL
|     cipher preference: client
|     warnings:
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher IDEA vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       Ciphersuite uses MD5 for message integrity
|       Forward Secrecy not supported by any cipher
|   TLSv1.2:
|     ciphers:
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 4096) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 4096) - A
|       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 4096) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 4096) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 4096) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_IDEA_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 4096) - C
|       TLS_RSA_WITH_RC4_128_SHA (rsa 4096) - C
|       TLS_RSA_WITH_SEED_CBC_SHA (rsa 4096) - A
|     compressors:
|       NULL
|     cipher preference: client
|     warnings:
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher IDEA vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       Ciphersuite uses MD5 for message integrity
|       Forward Secrecy not supported by any cipher
|_  least strength: C

Nmap done: 1 IP address (1 host up) scanned in 0.59 seconds

Spezifisches Protokoll mit openssl testen

Ob ein Server wirklich die Kommunikation über ein unsicheres Protokol TLSv1.0 anbietet, kann man mit dem OpenSSL SSL/TLS Client und seinen Optionen wie folgt testen:

openssl s_client -connect 127.0.0.1:55555 -tls1

Das Ergebnis ist die Debug-Ausgabe einer Verbindung vom OpenSSL SSL/TLS Client zum Server.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
CONNECTED(0000012C)
Can't use SSL_get_servername
depth=0 C = DE, ST = Some-State, O = Company GmbH, CN = Company GmbH, emailAddress = info@company.com
verify error:num=18:self signed certificate
verify return:1
depth=0 C = DE, ST = Some-State, O = Company GmbH, CN = Company GmbH, emailAddress = info@company.com
verify return:1
---
Certificate chain
 0 s:C = DE, ST = Some-State, O = Company GmbH, CN = Company GmbH, emailAddress = info@company.com
   i:C = DE, ST = Some-State, O = Company GmbH, CN = Company GmbH, emailAddress = info@company.com
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFsTCCA5mgAwIBAgIUDy2bhHHxSyf5NFQ8hCRJLTCrOXAwDQYJKoZIhvcNAQEL
BQAwaDELMAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUxETAPBgNVBAoM
CEFDVCBHbWJIMREwDwYDVQQDDAhBQ1QgR21iSDEeMBwGCSqGSIb3DQEJARYPaW5m
b0BhY3RnbWJoLmRlMB4XDTIyMDExMjEyMjI1NFoXDTI1MDExMTEyMjI1NFowaDEL
MAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUxETAPBgNVBAoMCEFDVCBH
bWJIMREwDwYDVQQDDAhBQ1QgR21iSDEeMBwGCSqGSIb3DQEJARYPaW5mb0BhY3Rn
bWJoLmRlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnxDNtqtUbRYr
+L+OYpG8hgc9Ty8ivB0yqDpAhNPLIG/xMYsqwK6lhd8Dcz9fLEVUh+n4C91WJaTB
vhL1eMRRy1Jg+jccnJn/JrbC3VJ9C+uPP2vckW7fzFB2IAa7rJqwgFkpvpjJ14+R
QEvzOwntJXPSqYUvy1100fQQebz79sSGdebOhlIJiiAXS32DQDEBD/d42OckBa6o
dc9JzlRpECh3g4hyioYTKExTWB578+IWOABg/lXm4Y5zXue/gWZvNFxlxk8u5bTc
0UNmxeTt84he967lE+VqCng9qtC/W6YIvTtr7i99Bn7ySj12sP+AekINhnHp3Mc+
iCECGCP/yMO7rBrxgUz3+zXK/HlfvFkzV2heAGBt6EdGuZHdXjF+OF0Lp5/1wg2V
VdrZMdsPN/AbSNx3aQJiglEZ2ha2v3v7hRSxhoMzUPRn+dgld/HRXEBqbZpYs97u
ebkcECfdg4gdWYTFwx5MMLBACbVi2WBe4rdDYslHXNsHbOkZAJKmSahqNNFm3Jzn
TfpsTXXrpOMelmrTAnxx5xxNyjdtJbzoWxC0CZGnNHU/fhyG0kM8hxLGVlgGsd7I
FguK+zoehTe6wMUpZDlkfaV6Aqf/CMS6hVaAMdXKgee/zNEAJkS2vnMI8NuI7C4z
4DAIsvtSvUtOv0ZeoeVpxT8mA7J7Fx8CAwEAAaNTMFEwHQYDVR0OBBYEFH5UY861
nL83ltV82upLfsMA1DFlMB8GA1UdIwQYMBaAFH5UY861nL83ltV82upLfsMA1DFl
MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAAt0ExpOHcPyzh5M
YUU1LipGRiFg8uoSHuLQF+vHmqlrvnD++tdaIzvhmBEGOid82jUzJvLCpiUlnec+
akBio96HokoMgHG/YUIPR2DoQ6cZxi1vzmudOBGA/mV27yk1FS5dchUE70iwih7W
SRle7/X2imS7r1ZWr9dfAvP/YTWCuPSKNFeju/JpoDvDz2pOJaswl1EaI2l6/ASJ
favBIMjCBeR2SVXsuRtlosck3wbe0z25vEhiWsNnHMhqQheiVl5iq2lfT6D63PaB
u241d7S5NwqjxW4x+nkPQA8E69G1FuA3+O+H3hk01URiFWmEZU3so6m1/fQl04l3
TaZvnMW0dkdpS2zWe2IhzXZZbl4WyToeF3sOLdJfMkyM9uc1eMwES/kd6a4OZ1xt
h2OxJAIF3GjjyswiCFWoI6miLmkidumZfyPKKzIfL8dM6/9ZTebSSQanrEtAB3V3
hb7aRyDZVyOBVvczqKkpUOCi547grKxGOT5FlLiOCaTK4xvGjHYTlzFY6H4BJNV0
8CKCTQ77cehq6TfR4LkwQU83e3jRlknRk79+KR1m3ONmPnJdE6RSunryxE2WGfwr
aK+GK+4av881TSNfOoeKoHa2Z1ylrlPUa/velvo/SEPCmJ3UOI7KCw5D/BttWoEs
6PgendZaVVdFW6fSRpTpHO1FRWOh
-----END CERTIFICATE-----
subject=C = DE, ST = Some-State, O = Company GmbH, CN = Company GmbH, emailAddress = info@company.com

issuer=C = DE, ST = Some-State, O = Company GmbH, CN = Company GmbH, emailAddress = info@company.com

---
No client certificate CA names sent
---
SSL handshake has read 1777 bytes and written 686 bytes
Verification error: self signed certificate
---
New, SSLv3, Cipher is AES256-SHA
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 5C3324E8D1474A1EDB4EE9456CA4ABB798B4719D8347FCA3AB783E2211A2F480
    Session-ID-ctx:
    Master-Key: 5B1190717C6496B46D175DC4DB677F9943AF1B870D7A58DBFDBF4E538C675A78B43E9918814E4068E05DFE9C80809AE6
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 1e b3 a6 b5 5e 81 ef e5-9a e3 6c a8 6e 59 10 d3   ....^.....l.nY..
    0010 - c1 9d 45 ac 97 11 a2 c4-24 d1 be 8d d0 9f 55 7e   ..E.....$.....U~
    0020 - 9c 75 42 92 66 d8 69 6c-d3 fc 9f aa cd 8e c2 8b   .uB.f.il........
    0030 - bd 5f d7 2f bc a6 3f 56-e7 9b 14 88 f2 9f b2 a0   ._./..?V........
    0040 - 8b 40 72 cf 41 21 f3 6e-12 e7 38 8f 88 48 a5 86   .@r.A!.n..8..H..
    0050 - 1b 01 f9 89 7b 28 6c 4a-20 11 67 a4 31 e9 85 96   ....{(lJ .g.1...
    0060 - 4c 42 1b b4 0b 3a 73 60-9d 9f c3 46 61 a4 b4 bd   LB...:s`...Fa...
    0070 - d8 05 c3 f3 8d b8 10 fe-55 43 e1 03 5c 9f f4 cc   ........UC..\...
    0080 - 8a 73 ec b9 7f 11 fc a2-60 4f 1e 73 c3 d4 d1 94   .s......`O.s....
    0090 - 34 cc 4a 98 e8 17 69 2f-74 ba 30 71 a2 a6 13 8f   4.J...i/t.0q....

    Start Time: 1642678920
    Timeout   : 7200 (sec)
    Verify return code: 18 (self signed certificate)
    Extended master secret: no
---

HTTPS Request mit openssl

Wenn die Verbindung mit openssl erfolgreich war, kann man einen HTTP-Request gegen den Server senden. Wir können beispielsweise das favicon von stadtwerk.org über eine sichere TLSv1.3-Verbindung wie folgt herunterladen:

openssl s_client -tls1_3 -crlf -quiet -connect stadtwerk.org:443 <<eof
GET /favicon-32x32.png HTTP/1.1
Connection: close
Host: stadtwerk.org

eof

Das Ergebnis verrät uns, dass da jemand von stadt.werk mit Adobe Photoshop CC 2019 (Macintosh) kreativ war 😉

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = stadtwerk.org
verify return:1
HTTP/1.1 200 OK
Date: Tue, 15 Feb 2022 14:44:39 GMT
Server: Apache
Upgrade: h2,h2c
Connection: Upgrade, close
Last-Modified: Tue, 15 Feb 2022 08:07:59 GMT
ETag: "454-5d80a07ff55c0"
Accept-Ranges: bytes
Content-Length: 1108
Content-Type: image/png

PNG

IHDR DtEXtSoftwareAdobe ImageReadyqe<xiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c145 79.163499, 2018/08/13-16:40:22        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:4e407e36-4a35-41e8-ae1d-a067c7d22cfd" xmpMM:DocumentID="xmp.did:9D094CF4F56311E8B305FD34CF60D286" xmpMM:InstanceID="xmp.iid:9D094CF3F56311E8B305FD34CF60D286" xmp:CreatorTool="Adobe Photoshop CC 2019 (Macintosh)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:4e407e36-4a35-41e8-ae1d-a067c7d22cfd" stRef:documentID="xmp.did:4e407e36-4a35-41@`U.:IENDB`