Сертификаты: срок действия — по сроку закрытого ключа (PrivateKeyUsagePeriod)

В ГОСТ-сертификатах ключ подписи действует год–15 месяцев, а сам сертификат — до 15 лет;
bj показывал и проверял срок сертификата (например, 06.10.2036 вместо 2027). Теперь
справочник профиля ИШ и сертификаты с флешки берут срок ключа (2.5.29.16), если он раньше;
срок сертификата показывается рядом. У УЦ — по-прежнему срок сертификата.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-21 23:27:28 +03:00
parent 219ed656a2
commit 29e19c78a9
4 changed files with 56 additions and 3 deletions
+20 -1
View File
@@ -95,6 +95,25 @@ certs_list_json(){
python3 - "$PROFDIR/local.pse" "$PROFDIR/local.gdbm" <<'PY2'
import sys,subprocess,json,re
out=[]; seen=set()
MON=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
def key_not_after(b):
# срок закрытого ключа — расширение PrivateKeyUsagePeriod (2.5.29.16), [1] notAfter GeneralizedTime;
# у ГОСТ-сертификатов он короче срока самого сертификата (ключ подписи — год, сертификат — до 15 лет)
k=b.find(b'\x06\x03\x55\x1d\x10')
if k<0: return ''
j=k+5
try:
if b[j]==0x01: j+=3 # critical BOOLEAN
if b[j]!=0x04: return ''
j+=2 if b[j+1]<0x80 else 2+(b[j+1]&0x7f) # OCTET STRING
if b[j]!=0x30: return ''
end=j+2+b[j+1]; j+=2
while j<end:
t,n=b[j],b[j+1]; v=b[j+2:j+2+n].decode('ascii','replace'); j+=2+n
if t==0x81 and len(v)>=14:
return '%s %d %s:%s:%s %s GMT'%(MON[int(v[4:6])-1],int(v[6:8]),v[8:10],v[10:12],v[12:14],v[0:4])
except Exception: pass
return ''
for p in sys.argv[1:]:
store=p.rsplit('.',1)[-1]
try: d=open(p,'rb').read()
@@ -112,7 +131,7 @@ for p in sys.argv[1:]:
sn=g('serial').upper()
if sn in seen: i+=4; continue
seen.add(sn)
out.append({'kind':'x509','store':store,'subject':g('subject'),'subject_cn':cn(g('subject')),'issuer_cn':cn(g('issuer')),'serial':sn,'not_before':g('notBefore'),'not_after':g('notAfter'),'self_signed':g('subject')==g('issuer')})
out.append({'kind':'x509','store':store,'subject':g('subject'),'subject_cn':cn(g('subject')),'issuer_cn':cn(g('issuer')),'serial':sn,'not_before':g('notBefore'),'not_after':g('notAfter'),'key_not_after':key_not_after(b),'self_signed':g('subject')==g('issuer')})
else:
r=subprocess.run(['openssl','crl','-inform','DER','-noout','-issuer','-nextupdate','-nameopt','utf8,sep_comma_plus'],input=b,stdout=subprocess.PIPE,stderr=subprocess.DEVNULL)
if r.returncode==0: