200 lines
8.3 KiB
HTML
200 lines
8.3 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}{{ ca.name }} - CA详情{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
<h2>CA机构详情: {{ ca.name }}
|
|
<small class="text-muted fs-6">(路径: {{ ca.name|to_pinyin }})</small>
|
|
</h2>
|
|
<div>
|
|
<a href="{{ url_for('export_ca_view', ca_id=ca.id) }}"
|
|
class="btn btn-primary me-2"
|
|
data-bs-toggle="tooltip"
|
|
title="导出CA证书(管理员可导出私钥)">
|
|
<i class="fas fa-file-export"></i> 导出CA
|
|
</a>
|
|
<a href="{{ url_for('generate_crl_view', ca_id=ca.id) }}"
|
|
class="btn btn-warning me-2"
|
|
data-bs-toggle="tooltip"
|
|
title="重新生成证书吊销列表">
|
|
<i class="fas fa-sync-alt"></i> 生成CRL
|
|
</a>
|
|
{% if crl %}
|
|
<a href="{{ url_for('download_crl', ca_id=ca.id) }}"
|
|
class="btn btn-success"
|
|
data-bs-toggle="tooltip"
|
|
title="下载当前CRL文件(有效期至 {{ crl.next_update.strftime('%Y-%m-%d') }})">
|
|
<i class="fas fa-download"></i> 下载CRL
|
|
</a>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h5 class="card-title">
|
|
<i class="fas fa-info-circle"></i> 基本信息
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<dl class="row">
|
|
<dt class="col-sm-4"><i class="fas fa-id-card"></i> 通用名</dt>
|
|
<dd class="col-sm-8">{{ ca.common_name }}</dd>
|
|
|
|
<dt class="col-sm-4"><i class="fas fa-building"></i> 组织</dt>
|
|
<dd class="col-sm-8">{{ ca.organization }}</dd>
|
|
|
|
<dt class="col-sm-4"><i class="fas fa-users"></i> 组织单位</dt>
|
|
<dd class="col-sm-8">{{ ca.organizational_unit or 'N/A' }}</dd>
|
|
|
|
<dt class="col-sm-4"><i class="fas fa-globe"></i> 国家</dt>
|
|
<dd class="col-sm-8">{{ ca.country }}</dd>
|
|
|
|
<dt class="col-sm-4"><i class="fas fa-map-marked"></i> 州/省</dt>
|
|
<dd class="col-sm-8">{{ ca.state or 'N/A' }}</dd>
|
|
|
|
<dt class="col-sm-4"><i class="fas fa-city"></i> 城市</dt>
|
|
<dd class="col-sm-8">{{ ca.locality or 'N/A' }}</dd>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6">
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h5 class="card-title">
|
|
<i class="fas fa-cogs"></i> 技术信息
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<dl class="row">
|
|
<dt class="col-sm-4"><i class="fas fa-key"></i> 密钥长度</dt>
|
|
<dd class="col-sm-8">{{ ca.key_size }}位</dd>
|
|
|
|
<!-- 修改有效期显示部分 -->
|
|
<dt class="col-sm-4"><i class="fas fa-calendar-check"></i> 有效期</dt>
|
|
<dd class="col-sm-8">
|
|
{{ ca.days_valid }}天
|
|
{% if ca.created_at %}
|
|
(至 {{ (ca.created_at + timedelta(days=ca.days_valid)).strftime('%Y-%m-%d') }})
|
|
{% endif %}
|
|
</dd>
|
|
|
|
<dt class="col-sm-4"><i class="fas fa-user"></i> 创建者</dt>
|
|
<dd class="col-sm-8">{{ get_username(ca.created_by) }}</dd>
|
|
|
|
<dt class="col-sm-4"><i class="fas fa-clock"></i> 创建时间</dt>
|
|
<dd class="col-sm-8">{{ ca.created_at.strftime('%Y-%m-%d %H:%M') }}</dd>
|
|
|
|
<dt class="col-sm-4"><i class="fas fa-file-certificate"></i> 证书路径</dt>
|
|
<dd class="col-sm-8">
|
|
<code class="text-truncate d-block" style="max-width: 250px;">{{ ca.cert_path }}</code>
|
|
<small class="text-muted">拼音路径: {{ ca.cert_path|to_pinyin }}</small>
|
|
</dd>
|
|
|
|
<dt class="col-sm-4"><i class="fas fa-lock"></i> 私钥路径</dt>
|
|
<dd class="col-sm-8">
|
|
<code class="text-truncate d-block" style="max-width: 250px;">{{ ca.key_path }}</code>
|
|
<small class="text-muted">拼音路径: {{ ca.key_path|to_pinyin }}</small>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-header d-flex justify-content-between align-items-center">
|
|
<h5 class="card-title mb-0">
|
|
<i class="fas fa-certificate"></i> 颁发的证书
|
|
<span class="badge bg-primary rounded-pill">{{ certificates|length }}</span>
|
|
</h5>
|
|
<div>
|
|
<a href="{{ url_for('create_certificate_view') }}?ca_id={{ ca.id }}"
|
|
class="btn btn-sm btn-primary"
|
|
data-bs-toggle="tooltip"
|
|
title="使用此CA颁发新证书">
|
|
<i class="fas fa-plus"></i> 创建证书
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="card-body">
|
|
{% if certificates %}
|
|
<div class="table-responsive">
|
|
<table class="table table-sm table-hover">
|
|
<thead class="table-light">
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>通用名</th>
|
|
<th>状态</th>
|
|
<th>有效期至</th>
|
|
<th>创建时间</th>
|
|
<th>操作</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for cert in certificates %}
|
|
<tr>
|
|
<td>{{ cert.id }}</td>
|
|
<td>{{ cert.common_name }}</td>
|
|
<td>
|
|
{% if cert.status == 'active' %}
|
|
<span class="badge bg-success"><i class="fas fa-check-circle"></i> 有效</span>
|
|
{% elif cert.status == 'revoked' %}
|
|
<span class="badge bg-danger"><i class="fas fa-ban"></i> 已吊销</span>
|
|
{% else %}
|
|
<span class="badge bg-secondary"><i class="fas fa-clock"></i> 已过期</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ cert.expires_at.strftime('%Y-%m-%d') }}</td>
|
|
<td>{{ cert.created_at.strftime('%Y-%m-%d') }}</td>
|
|
<td>
|
|
<div class="btn-group btn-group-sm">
|
|
<a href="{{ url_for('certificate_detail', cert_id=cert.id) }}"
|
|
class="btn btn-info"
|
|
data-bs-toggle="tooltip"
|
|
title="查看证书详情">
|
|
<i class="fas fa-eye"></i>
|
|
</a>
|
|
<a href="{{ url_for('export_certificate_view', cert_id=cert.id) }}"
|
|
class="btn btn-success"
|
|
data-bs-toggle="tooltip"
|
|
title="导出证书">
|
|
<i class="fas fa-download"></i>
|
|
</a>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% else %}
|
|
<div class="text-center py-4">
|
|
<i class="fas fa-certificate fa-3x text-muted mb-3"></i>
|
|
<h5 class="text-muted">该CA尚未颁发任何证书</h5>
|
|
<a href="{{ url_for('create_certificate_view') }}?ca_id={{ ca.id }}" class="btn btn-primary mt-2">
|
|
<i class="fas fa-plus"></i> 立即创建证书
|
|
</a>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block scripts %}
|
|
{{ super() }}
|
|
<script>
|
|
// 启用工具提示
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
|
|
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
|
|
return new bootstrap.Tooltip(tooltipTriggerEl)
|
|
})
|
|
})
|
|
</script>
|
|
{% endblock %} |