Как добавить расширение 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,
        },
    },
}
Другие вопросы по тегам