Critical: build_leaf_cert self-signed leaves with the leaf key instead of the YubiKey-held Intermediate CA key. Now extracts TBS, signs via pkcs11-tool (ECDSA-SHA384), reassembles, and verifies against the intermediate CA public key before returning. - setup-certauth.sh: ~1100 lines of stale inline api/ copies replaced with copy-from-repo (single source of truth); writes private /etc/certauth/certauth.env (0600); DB init loads env, no more swallowed errors; systemd unit gets EnvironmentFile= - config.py: YubiKey serials no longer hard-coded (env, fail closed); aarch64-only PKCS#11 path replaced with arch-neutral default; all paths env-overridable (CERTAUTH_*) - main.py: removed dead fastapi.security.CSRFProtection import (crashed startup); module-relative static/templates dirs; created_by resolved from the authenticated user instead of hard-coded 1; unclosed file handles fixed; domain_id 0 stored as NULL (FK bug) - models.py: certificates.domain_id FK pointed at users(id), now domains(id) - login: CSRF token now actually sent and validated - tests: 23 tests (auth, API flows, DER helpers, signing pipeline) - README, LICENSE, requirements.txt, pyproject.toml
36 lines
1.7 KiB
HTML
36 lines
1.7 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en" class="bg-gray-900 text-gray-100">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>CertAuth - Login</title>
|
|
<script src="https://cdn.tailwindcss.com"></script>
|
|
</head>
|
|
<body class="min-h-screen flex items-center justify-center">
|
|
<div class="bg-gray-800 rounded-lg p-8 border border-gray-700 w-full max-w-md">
|
|
<h1 class="text-2xl font-bold mb-2 text-blue-400">CertAuth</h1>
|
|
<p class="text-gray-400 mb-6">Certificate Authority Management</p>
|
|
{% if error %}
|
|
<div class="bg-red-900/50 border border-red-700 rounded p-3 mb-4 text-red-300 text-sm">{{ error }}</div>
|
|
{% endif %}
|
|
<form method="post" action="/login">
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
|
<div class="mb-4">
|
|
<label class="block text-sm text-gray-400 mb-1">Username</label>
|
|
<input type="text" name="username" required
|
|
class="w-full bg-gray-700 border border-gray-600 rounded px-3 py-2 text-white focus:outline-none focus:border-blue-500">
|
|
</div>
|
|
<div class="mb-6">
|
|
<label class="block text-sm text-gray-400 mb-1">Password</label>
|
|
<input type="password" name="password" required
|
|
class="w-full bg-gray-700 border border-gray-600 rounded px-3 py-2 text-white focus:outline-none focus:border-blue-500">
|
|
</div>
|
|
<button type="submit"
|
|
class="w-full bg-blue-600 hover:bg-blue-500 text-white font-medium py-2 rounded transition">
|
|
Sign In
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</body>
|
|
</html>
|