[{{ (f.step or f.group or f.category or 'info')|replace('_','-')|lower }}]{{ f.severity_label|upper }}{{ f.title }}{{ f.detail or '' }}
{%- endmacro %}
{# A boolean row rendered with green/red text. #}
{% macro yn(value, ok='対応', bad='未対応') -%}
{% if value %}{{ ok }}{% else %}{{ bad }}{% endif %}
{%- endmacro %}
{# Revocation cell (OCSP / CRL). Translates the technical error
strings from certs/revocation.py into a single clean Japanese
label, so we never print awkward combinations like
「未確認 no OCSP URL」. #}
{% macro rev_cell(r, kind) -%}
{%- if not r -%}
—
{%- elif r.checked and not r.revoked -%}
Not Revoked
{%- if r.source %} ({{ r.source }}){% endif -%}
{%- elif r.checked and r.revoked -%}
Revoked
{%- if r.reason %} ({{ r.reason }}){% endif -%}
{%- else -%}
{%- set err = (r.error or '')|string -%}
{%- if 'no OCSP URL' in err or 'no AIA' in err -%}
{{ kind }} URL が提供されていません
{%- elif 'no CRL DP' in err or 'no http CRL URL' in err -%}
{{ kind }} URL が提供されていません
{%- elif 'all CRLs unreachable' in err -%}
{{ kind }} レスポンダに到達できません
{%- elif err -%}
確認失敗({{ err }})
{%- else -%}
未確認
{%- endif -%}
{%- endif -%}
{%- endmacro %}
{# -------- 概要 -------- #}
{% if summary %}
{% for f in summary %}{{ finding_row(f) }}{% endfor %}
{% else %}
[info]該当項目なし
{% endif %}
{# -------- 信頼性 -------- #}
{# Certificate chain table #}
{% set chain = result.data.certificate_chain if result.data else [] %}
{% if chain %}
証明書チェーン
#
CN / Subject
発行者
有効期限
署名
鍵
{% for c in chain %}
{{ loop.index }}
{{ c.common_name or c.subject or '—' }}
{% if c.sans %}
SAN: {{ (c.sans or [])|join(', ') }}
{% endif %}
{{ c.issuer or '—' }}
{{ c.not_after or '—' }}
{% if c.is_expired %}期限切れ
{% elif c.days_until_expiry is defined and c.days_until_expiry is not none %}残 {{ c.days_until_expiry }} 日{% endif %}
{{ (c.signature_hash_algorithm or '—')|upper }}
{{ c.public_key_algorithm or '—' }}{% if c.public_key_size_bits %} {{ c.public_key_size_bits }}-bit{% endif %}
{% if c.public_key_curve %} ({{ c.public_key_curve }}){% endif %}
{% endfor %}
{% endif %}
{# Trust stores #}
{% set trust = result.data.trust if result.data else [] %}
{% if trust %}
プラットフォームごとの信頼状況
プラットフォーム
信頼
状況
{% for t in trust %}
{{ t.platform }}
{{ yn(t.trusted, '信頼', '未信頼') }}
{{ t.error or '—' }}
{% endfor %}
{% endif %}
{# Revocation + HSTS + CAA summary #}
{% set ocsp = (result.data or {}).get('ocsp') %}
{% set crl = (result.data or {}).get('crl') %}
{% set hsts = (result.data or {}).get('hsts') %}
{% set caa = (result.data or {}).get('caa') %}
{% set preload = (result.data or {}).get('preload') %}
失効・HSTS・CAA
OCSP
{{ rev_cell(ocsp, 'OCSP') }}
CRL
{{ rev_cell(crl, 'CRL') }}
HSTS
{%- if not hsts or hsts.error -%}
—
{%- elif hsts.present -%}
有効max-age={{ hsts.max_age }}{% if hsts.include_subdomains %}; includeSubDomains{% endif %}{% if hsts.preload %}; preload{% endif %}
{%- else -%}
無効
{%- endif -%}
HSTS preload
{%- if preload -%}
{%- for p in preload -%}
{{ p.browser }}: {{ yn(p.listed, 'Listed', 'Not listed') }}{% if not loop.last %} · {% endif %}
{%- endfor -%}
{%- else -%}
—
{%- endif -%}
CAA
{%- if not caa -%}
—
{%- elif caa.records -%}
{{ caa.records|length }} 件({{ caa.effective_host }})
{{ caa.records|join('; ') }}
{%- else -%}
未設定
{%- endif -%}
信頼性に関するすべてのログ
{% set findings = groups['reliability'] %}
{% if findings %}{% for f in findings %}{{ finding_row(f) }}{% endfor %}
{% else %}
[info]項目なし
{% endif %}
{# -------- 安全性 -------- #}
{# Protocol versions #}
{% set versions = (result.data or {}).get('versions') %}
{% if versions %}
対応プロトコル
バージョン
対応
{% for name, ok in versions.items() %}
{{ name }}
{{ yn(ok, '有効', '無効') }}
{% endfor %}
{% endif %}
{# Accepted ciphers per version #}
{% set ciphers = (result.data or {}).get('ciphers') %}
{% if ciphers %}
受理された暗号スイート
{% for name, cs in ciphers.items() %}
{% if cs %}
{{ name }} ({{ cs|length }})
{% for c in cs %}
{{ c }}
{% endfor %}
{% endif %}
{% endfor %}
{% endif %}
{# Named groups #}
{% set groups_list = (result.data or {}).get('named_groups') %}
{% if groups_list %}
TLS 1.3 鍵交換グループ
{% for g in groups_list %}{{ g }}{% if not loop.last %}, {% endif %}{% endfor %}
{% endif %}
安全性に関するすべてのログ
{% set findings = groups['safety'] %}
{% if findings %}{% for f in findings %}{{ finding_row(f) }}{% endfor %}
{% else %}
[info]項目なし
{% endif %}
{# -------- 脆弱性 -------- #}
{% set hb = (result.data or {}).get('heartbleed') %}
{% set ccs = (result.data or {}).get('ccs_injection') %}
{% set renego = (result.data or {}).get('secure_renegotiation') %}
{% set scsv = (result.data or {}).get('fallback_scsv') %}