feat(admin): авто-загрузка сертификатов УЦ НРД + ежесуточное обновление
Новый раздел /admin/setup → «Сертификаты УЦ» (и в шаге 3 wizard'а): список URL .cer-файлов УЦ (одна ссылка на строку). По кнопке «Скачать сейчас» система качает каждый URL, парсит X.509, и через certmgr -inst импортирует в mroot (если cert == issuer, т.е. корневой) или uRoot (промежуточный). Дедуп по SHA-256: если файл по URL не изменился — повторного импорта нет. В runtime-конфиге сохраняется журнал FetchedCerts (CN/SHA-256/срок/статус) для отображения в UI. Чекбокс «Авто-обновление раз в сутки» включает фоновую горутину StartCACertsAutoUpdater — стартует через 30 сек после bj-server, потом тикает раз в 24 часа. При изменении сертификата он переустанавливается без участия оператора. Mastered tasks: #44.
This commit is contained in:
@@ -147,6 +147,53 @@
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<!-- Авто-загрузка сертификатов УЦ НРД -->
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .Settings.CACerts.URLs}}ok{{else}}warn{{end}}"></span>Сертификаты УЦ (НРД и др.) — авто-загрузка</h2>
|
||||
<p class="muted">Прямые URL .cer-файлов УЦ НРД (см. <a href="https://www.nsd.ru/workflow/system/cryptography/" target="_blank" rel="noopener">nsd.ru/workflow/system/cryptography/</a>) и других УЦ. Каждый URL скачивается, парсится X.509, и автоматически импортируется в КриптоПро (<code>mroot</code> для корневых, <code>uRoot</code> для промежуточных). Включите авто-обновление — раз в сутки система перепроверит и переустановит, если сертификат изменился.</p>
|
||||
<form method="post" action="/admin/setup/cacerts" style="margin-top:10px;display:grid;gap:10px">
|
||||
<label>URL'ы .cer-файлов (один на строку)</label>
|
||||
<textarea name="urls" rows="4" placeholder="https://www.nsd.ru/path/to/root-ca.cer https://www.nsd.ru/path/to/sub-ca.cer" style="padding:8px;background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:4px;font-family:monospace;font-size:12px">{{range .Settings.CACerts.URLs}}{{.}}
|
||||
{{end}}</textarea>
|
||||
<label style="display:flex;align-items:center;gap:8px;cursor:pointer">
|
||||
<input type="checkbox" name="auto_update" {{if .Settings.CACerts.AutoUpdate}}checked{{end}}>
|
||||
<span>Авто-обновление раз в сутки</span>
|
||||
</label>
|
||||
<div style="display:flex;gap:8px;align-items:center">
|
||||
<button type="submit" class="btn">Сохранить</button>
|
||||
</div>
|
||||
</form>
|
||||
<form method="post" action="/admin/setup/cacerts/fetch" style="margin-top:8px">
|
||||
<button type="submit" class="btn" style="background:var(--ok);color:#0a0f1a;font-weight:600">⬇ Скачать и импортировать сейчас</button>
|
||||
{{if not .Settings.CACerts.LastFetch.IsZero}}
|
||||
<span class="muted" style="margin-left:10px">Последнее обновление: {{.Settings.CACerts.LastFetch.Format "02.01.2006 15:04:05"}}</span>
|
||||
{{end}}
|
||||
</form>
|
||||
{{if .Settings.CACerts.FetchedCerts}}
|
||||
<table style="margin-top:14px">
|
||||
<thead><tr><th>URL</th><th>Владелец</th><th>Хранилище</th><th>Действителен до</th><th>SHA-256</th><th>Статус</th></tr></thead>
|
||||
<tbody>
|
||||
{{range .Settings.CACerts.FetchedCerts}}
|
||||
<tr>
|
||||
<td style="max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="{{.URL}}"><code style="font-size:11px">{{.URL}}</code></td>
|
||||
<td>{{.SubjectCN}}</td>
|
||||
<td><code>{{.Store}}</code></td>
|
||||
<td>{{if not .NotAfter.IsZero}}{{.NotAfter.Format "02.01.2006"}}{{end}}</td>
|
||||
<td><code style="font-size:11px">{{if .SHA256}}{{slice .SHA256 0 12}}…{{end}}</code></td>
|
||||
<td>{{if .Error}}<span style="color:var(--err)" title="{{.Error}}">ошибка</span>{{else}}<span style="color:var(--ok)">ок</span>{{end}}</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{end}}
|
||||
{{if .Settings.CACerts.LastFetchLog}}
|
||||
<details style="margin-top:10px">
|
||||
<summary style="cursor:pointer;color:var(--accent);font-size:13px">Лог последнего обновления</summary>
|
||||
<pre style="margin-top:8px">{{.Settings.CACerts.LastFetchLog}}</pre>
|
||||
</details>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<!-- nsd-adapter / ИШ НРД -->
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .Settings.NSD.IGWBaseURL}}ok{{else}}err{{end}}"></span>Интеграционный шлюз НРД (ИШ)</h2>
|
||||
|
||||
Reference in New Issue
Block a user