Сертификаты: срок действия — по сроку закрытого ключа (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:
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"crypto/sha256"
|
||||
"crypto/x509"
|
||||
"crypto/x509/pkix"
|
||||
"encoding/asn1"
|
||||
"encoding/hex"
|
||||
"encoding/pem"
|
||||
@@ -242,10 +243,32 @@ func classifyCertFile(path string) *CertFile {
|
||||
cf.Serial = cert.SerialNumber.Text(16)
|
||||
cf.NotBefore = cert.NotBefore
|
||||
cf.NotAfter = cert.NotAfter
|
||||
if k := privateKeyUsageEnd(cert.Extensions); !k.IsZero() && k.Before(cf.NotAfter) {
|
||||
cf.NotAfter = k // подписывать можно до конца срока ключа, а не сертификата
|
||||
}
|
||||
cf.INN = extractCertINN(cert)
|
||||
return cf
|
||||
}
|
||||
|
||||
// privateKeyUsageEnd — конец срока закрытого ключа (расширение PrivateKeyUsagePeriod, 2.5.29.16). В ГОСТ-
|
||||
// сертификатах ключ подписи действует год–15 месяцев, а сам сертификат — до 15 лет; подписывать после
|
||||
// срока ключа нельзя. Нулевое время — расширения нет.
|
||||
func privateKeyUsageEnd(exts []pkix.Extension) time.Time {
|
||||
for _, e := range exts {
|
||||
if !e.Id.Equal(asn1.ObjectIdentifier{2, 5, 29, 16}) {
|
||||
continue
|
||||
}
|
||||
var p struct {
|
||||
NotBefore time.Time `asn1:"generalized,optional,tag:0"`
|
||||
NotAfter time.Time `asn1:"generalized,optional,tag:1"`
|
||||
}
|
||||
if _, err := asn1.Unmarshal(e.Value, &p); err == nil {
|
||||
return p.NotAfter
|
||||
}
|
||||
}
|
||||
return time.Time{}
|
||||
}
|
||||
|
||||
// extractCertINN — ИНН из OID 1.2.643.3.131.1.1 в Subject.
|
||||
func extractCertINN(c *x509.Certificate) string {
|
||||
innOID := asn1.ObjectIdentifier{1, 2, 643, 3, 131, 1, 1}
|
||||
|
||||
Reference in New Issue
Block a user