Files
vServer/Backend/WebServer/acme/challenge.go
Falknat 9a788800b5 Автоматическое создание сертификатов
Добавил возможность создания автоматических сертификатов.
2026-01-17 10:36:00 +07:00

85 lines
2.3 KiB
Go

package acme
import (
"net/http"
"strings"
tools "vServer/Backend/tools"
)
// HandleChallenge обрабатывает HTTP-01 ACME challenge
// Путь: /.well-known/acme-challenge/{token}
func (m *Manager) HandleChallenge(w http.ResponseWriter, r *http.Request) bool {
path := r.URL.Path
// Проверяем что это ACME challenge
if !strings.HasPrefix(path, "/.well-known/acme-challenge/") {
return false
}
// Извлекаем token из пути
token := strings.TrimPrefix(path, "/.well-known/acme-challenge/")
if token == "" {
http.Error(w, "Token not found", http.StatusNotFound)
return true
}
// Ищем challenge по token
m.mu.RLock()
challenge, exists := m.challenges[token]
m.mu.RUnlock()
if !exists {
tools.Logs_file(1, "ACME", "⚠️ Challenge не найден для token: "+token, "logs_acme.log", false)
http.Error(w, "Challenge not found", http.StatusNotFound)
return true
}
// Отдаём KeyAuth для подтверждения владения доменом
tools.Logs_file(0, "ACME", "✅ Challenge ответ для домена: "+challenge.Domain, "logs_acme.log", true)
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte(challenge.KeyAuth))
return true
}
// addChallenge добавляет challenge в хранилище
func (m *Manager) addChallenge(token, keyAuth, domain string) {
m.mu.Lock()
defer m.mu.Unlock()
m.challenges[token] = &ChallengeData{
Token: token,
KeyAuth: keyAuth,
Domain: domain,
Created: getCurrentTimestamp(),
}
tools.Logs_file(0, "ACME", "📝 Challenge добавлен для: "+domain, "logs_acme.log", false)
}
// removeChallenge удаляет challenge из хранилища
func (m *Manager) removeChallenge(token string) {
m.mu.Lock()
defer m.mu.Unlock()
if challenge, exists := m.challenges[token]; exists {
tools.Logs_file(0, "ACME", "🗑️ Challenge удалён для: "+challenge.Domain, "logs_acme.log", false)
delete(m.challenges, token)
}
}
// cleanupOldChallenges удаляет старые challenges (старше 10 минут)
func (m *Manager) cleanupOldChallenges() {
m.mu.Lock()
defer m.mu.Unlock()
now := getCurrentTimestamp()
maxAge := int64(600) // 10 минут
for token, challenge := range m.challenges {
if now-challenge.Created > maxAge {
delete(m.challenges, token)
}
}
}