fix(tls): o painel de seguranca estava vazio em qualquer modo menos um
/admin/security mostrava "Nao foi possivel carregar os dados" porque /api/v1/admin/tls respondia 503. A rota so era ligada quando o certificado vinha do watcher do acme.json do Traefik, o unico provider que tinha metodos de estado proprios. Nesta instalacao o TRAEFIK_ACME_DIR nao esta definido e o STATIC_CERT_PATH tambem nao, portanto o servidor cai no certificado autoassinado efemero -- ou seja, o painel calava-se exactamente no estado em que o operador mais precisa de ser avisado. - ProviderStatus deriva o estado de qualquer port.CertProvider, lendo a folha do certificado que ele realmente serve - o painel passa a ser ligado sempre que ha JWT_SECRET - passa a dizer quem emitiu e se e autoassinado, com um aviso proprio: nas portas de correio um autoassinado e recusado por qualquer cliente que verifique, o que pesa mais do que uma validade ainda longe CheckSignatureFrom nao serve para detectar isto: tambem exige que o emissor seja uma CA, coisa que uma folha descartavel nunca declara, e por isso dava a fallback degradada como correctamente emitida. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
9689f26dda
commit
136f9f339a
9 files changed
+194
-7
No files matched your search
@@ -16,6 +16,13 @@ type TlsStatusSource interface {
|
||||
HasCertificateFor(host string) bool
|
||||
}
|
||||
|
||||
// TlsCertificateInspector is optional extra detail: who issued the
|
||||
// certificate, and whether it is self-signed. A source that cannot say simply
|
||||
// does not implement it.
|
||||
type TlsCertificateInspector interface {
|
||||
CertificateSummary(host string) (issuer string, selfSigned bool, ok bool)
|
||||
}
|
||||
|
||||
type adminTlsAPI struct {
|
||||
source TlsStatusSource
|
||||
mailHost string
|
||||
@@ -76,6 +83,19 @@ func (a *adminTlsAPI) handleStatus(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
// Who signed it, and whether anything would trust it. A self-signed
|
||||
// certificate on 25 and 993 is refused by every client that verifies, so
|
||||
// it outranks an expiry that is comfortably far away.
|
||||
if inspector, ok := a.source.(TlsCertificateInspector); ok {
|
||||
if issuer, selfSigned, found := inspector.CertificateSummary(a.mailHost); found {
|
||||
status["issuer"] = issuer
|
||||
status["self_signed"] = selfSigned
|
||||
if selfSigned {
|
||||
status["state"] = "SELF_SIGNED"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !status["has_certificate"].(bool) {
|
||||
status["state"] = "NO_CERTIFICATE"
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user