Как добавить расширение SAN в сертификат с помощью Go
Мне нужно указать зарегистрированный идентификатор в сертификате.
Поэтому я добавляю это в конфигурационный файл, когда подписываю сертификат с помощью OpenSSL.
[ alternate_names ]
DNS.1 = localhost
RID.1 = 1.2.3.4.5.5
Вот, 1.2.3.4.5.5
OID.
Я следовал за тем, как отформатировать запись альтернативного имени субъекта OID в файле openssl.cnf в переполнении стека.
Теперь я хочу создать сертификат в Go. Ниже один мой текущий конфиг
cfg := cert.Config{
CommonName: name,
Organization: []string{"Elasticsearch Operator"},
AltNames: cert.AltNames{
DNSNames: []string{
"localhost",
},
},
Usages: []x509.ExtKeyUsage{
x509.ExtKeyUsageServerAuth,
x509.ExtKeyUsageClientAuth,
},
}
В этой конфигурации, как я могу добавить номер OID.
1 ответ
Нет прямого способа добавить OBJECT IDENTIFIER в сертификат с помощью Go.
Мы нашли нестандартное решение.
Go предоставляет возможность добавить дополнительную информацию SAN в Сертификат
x509.Certificate{
ExtraExtensions: []pkix.Extension{
{
// Here, We add SAN additional with specific ID
},
},
}
Согласно 2.5.29.17 - Альтернативное имя субъекта, OID для SAN 2.5.29.17
Допустим, мы добавим зарегистрированный идентификатор 1.2.3.4.5.5
в Сан. И этот RID должен быть добавлен как тег #8
, (Согласно 2.5.29.17)
Таким образом, значение байта для этого расширения []byte{0x88, 0x05, 0x2A, 0x03, 0x04, 0x05, 0x05}
Вот,
0x88
это значение тега для конкретного контекста#8
0x05
длина закодированного значения0x2A, 0x03, 0x04, 0x05, 0x05
закодировано значение1.2.3.4.5.5
0x2A
происходит от42
который40 * 1 + 2
, Вот1
а также2
первые два значения идентификатора.
Итак, наконец
rawValue := []asn1.RawValue{
{FullBytes: []byte{0x88, 0x05, 0x2A, 0x03, 0x04, 0x05, 0x05}},
}
rawByte, _ := asn1.Marshal(rawValue)
_ = x509.Certificate{
ExtraExtensions: []pkix.Extension{
{
Id: asn1.ObjectIdentifier{2, 5, 29, 17},
Value: rawByte,
},
},
}