feat(check): handlungsleitende Hinweise bei TLS- und Zertifikatsfehlern
Der bisherige Fehlertext gab den rohen x509-Fehler weiter, ohne zu sagen, was zu tun ist. check unterscheidet jetzt unbekannte CA, unpassenden Hostnamen, SHA-1-Signatur, abgelaufenes Zertifikat, zu alte TLS-Version und fehlende gemeinsame Cipher-Suite und nennt jeweils die passende Stellschraube. Der technische Originalfehler bleibt erhalten. Reine Netzwerkfehler bekommen bewusst keinen Hinweis, damit kein falscher Verdacht entsteht. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
This commit is contained in:
parent
7237aee744
commit
fd88251e07
2 changed files with 116 additions and 0 deletions
|
|
@ -117,6 +117,74 @@ func TestMissingAPIPermissionIsDistinguished(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestDirectoryTLSErrorsGiveActionableHints(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
err string
|
||||
want string // Textbaustein, der in der Ausgabe stehen muss
|
||||
}{
|
||||
{
|
||||
"unbekannte CA",
|
||||
`LDAPS-Verbindung zu dc01.firma.local:636: x509: certificate signed by unknown authority`,
|
||||
"ad.ca_file",
|
||||
},
|
||||
{
|
||||
"Hostname passt nicht",
|
||||
`LDAPS-Verbindung zu dc01.firma.local:636: x509: certificate is valid for DC01, not dc01.firma.local`,
|
||||
"ad.servers",
|
||||
},
|
||||
{
|
||||
"SHA-1-Signatur",
|
||||
`LDAPS-Verbindung zu dc01:636: x509: cannot verify signature: insecure algorithm SHA1-RSA`,
|
||||
"SHA-256",
|
||||
},
|
||||
{
|
||||
"Zertifikat abgelaufen",
|
||||
`LDAPS-Verbindung zu dc01:636: x509: certificate has expired or is not yet valid`,
|
||||
"abgelaufen",
|
||||
},
|
||||
{
|
||||
"TLS-Version zu alt",
|
||||
`LDAPS-Verbindung zu dc01:636: tls: protocol version not supported`,
|
||||
"min_tls_version",
|
||||
},
|
||||
{
|
||||
"keine gemeinsame Cipher-Suite",
|
||||
`LDAPS-Verbindung zu dc01:636: tls: no cipher suite supported by both client and server`,
|
||||
"tlsrsakex",
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
c := newChecker(t, &fakePinger{at: checkNow}, &fakeDir{dnErr: errors.New(tc.err)})
|
||||
rep := c.Run(context.Background(), "")
|
||||
if rep.OK() {
|
||||
t.Fatal("TLS-Fehler muss auffallen")
|
||||
}
|
||||
out := report(t, rep)
|
||||
if !strings.Contains(out, tc.want) {
|
||||
t.Errorf("Hinweis %q fehlt in der Ausgabe:\n%s", tc.want, out)
|
||||
}
|
||||
// Der technische Originalfehler muss erhalten bleiben.
|
||||
if !strings.Contains(out, "dc01") {
|
||||
t.Errorf("der Originalfehler darf nicht verloren gehen:\n%s", out)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestPlainNetworkErrorGetsNoMisleadingHint(t *testing.T) {
|
||||
c := newChecker(t, &fakePinger{at: checkNow},
|
||||
&fakeDir{dnErr: errors.New("dc01.firma.local: connection refused")})
|
||||
rep := c.Run(context.Background(), "")
|
||||
out := report(t, rep)
|
||||
for _, unwanted := range []string{"ad.ca_file", "min_tls_version", "SHA-256"} {
|
||||
if strings.Contains(out, unwanted) {
|
||||
t.Errorf("ein reiner Netzwerkfehler darf keinen TLS-Hinweis erzeugen (%q):\n%s", unwanted, out)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestUnreachableDCIsNamed(t *testing.T) {
|
||||
c := newChecker(t, &fakePinger{at: checkNow},
|
||||
&fakeDir{dnErr: errors.New("dc01.firma.local: connection refused")})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue