Как подписать сертификат с произвольным или устаревшим расширением - PullRequest
0 голосов
/ 19 сентября 2019

Например, я хочу подписать сертификат с произвольным или устаревшим расширением (например, nsCertType): https://www.openssl.org/docs/manmaster/man5/x509v3_config.html

Я считаю, что я должен добавить произвольное расширение как часть сертификата какниже, но как / где вы узнаете идентификатор объекта asn1?Я прочитал больше документации, которую я хочу признать сегодня, и все еще в тупике.

tmpl := &x509.Certificate{
    SerialNumber:          big.NewInt(time.Now().Unix()*1000),
    Subject:               pkix.Name{CommonName: "edgeproxy", Organization: []string{"edgeproxy"}},
    NotBefore:             now,
    NotAfter:              now.Add(caMaxAge),
    ExtraExtensions:       []pkix.Extension{
        {
            Id: asn1.ObjectIdentifier{}, //what goes here
            Critical: false,
            []byte("sslCA"),
        },
    },
    ExtKeyUsage:           []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth,x509.ExtKeyUsageClientAuth,x509.ExtKeyUsageEmailProtection, x509.ExtKeyUsageTimeStamping, x509.ExtKeyUsageMicrosoftCommercialCodeSigning, x509.ExtKeyUsageMicrosoftServerGatedCrypto, x509.ExtKeyUsageNetscapeServerGatedCrypto} ,
    KeyUsage:              x509.KeyUsageCRLSign | x509.KeyUsageCertSign,
    IsCA:                  true,
    BasicConstraintsValid: true,
}

В python я бы сделал это, но не знаю, как перенести это в go (что я и делаю в конце дня):

    OpenSSL.crypto.X509Extension(
        b"nsCertType",
        False,
        b"sslCA"
    ), 

1 Ответ

1 голос
/ 19 сентября 2019

Исходные коды в https://golang.org/src/encoding/asn1/asn1.go define:

// An ObjectIdentifier represents an ASN.1 OBJECT IDENTIFIER.

type ObjectIdentifier []int

Таким образом, идентификатор объекта (сокращенно OID) представляет собой массив целых чисел.Модуль asn1 имеет методы для их анализа, например parseObjectIdentifier.

. Это структура, которую нужно поместить после атрибута Id:.

Но теперь вам нужно выяснить OIDвы хотите.

Несмотря на трудность чтения, исходный код OpenSSL может показать вам OID многих вещей в мирах X.400 / X.500 / X.509 или, по крайней мере, те, которые известны OpenSSL.

Если вы перейдете на https://github.com/openssl/openssl/blob/1aec7716c1c5fccf605a46252a46ea468e684454/crypto/objects/obj_dat.h

и выполните поиск по nsCertType, вы получите:

{"nsCertType", "Netscape Cert Type", NID_netscape_cert_type, 9, &so[407]},

so, определенный ранее, и если вы прыгнете на его 407 th элемент, который вы видите:

    0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x01,0x01,  /* [  407] OBJ_netscape_cert_type */

и выполнение окончательного поиска по OBJ_netscape_cert_type в том же файле дает:

  71,    /* OBJ_netscape_cert_type           2 16 840 1 113730 1 1 */

, что означает, что соответствующий OID равен 2.16.840.1.113730.1.1

Или вы можете декодировать приведенный выше список целых чисел, описывающих этот OID (см. Как ASN.1 кодирует идентификатор объекта? для получения подробной информации).

  • first 0x60 is 96 10 so 2*40 + 16, что означает, что OID начинается с 2.16.
  • , затем все остальные находятся в форме "base128":если старший значащий бит равен 1, объедините 7 младших значащих битов вместе всех следующих чисел, пока один не получит 0, поскольку старший значащий бит
  • 0x86 равен 10000110 2 , поэтому необходимо0x48 иначе 01001000 2 так оно и есть на самом деле 00001101001000 2 или 840 10
  • 0x01 - этоменьше 128, поэтому он сам по себе, 1
  • 0x86 по-прежнему 10000110 2 , но должен быть в паре с обоими 0xF8 (11111000 2) и 0x42 (01000010 2 , и мы остановимся здесь, поскольку первый бит равен 0), поэтому 000011011110001000010 2 в целом или 113730 10
  • и два последних 0x01 сами по себе, 1.

, поэтому мы получаем снова 2.16.840.1.113730.1.1

Вы можете проверить это дваждыв некотором онлайн-браузере OID, например, здесь: http://oid -info.com / cgi-bin / display? oid = 2.16.840.1.113730.1.1 & action = display , который дает следующее описание для него:

Тип сертификата Netscape (a Рек.Расширение сертификата МСЭ-T X.509 v3, используемое для определения того, является ли субъект сертификата клиентом SSL, сервером SSL или Центром сертификации (ЦС)

Затем можно дажепросмотрите различные дуги, такие как netscape one или другие, чтобы найти другие OID.

Вы также получите полную запись ASN.1:

{joint-iso-itu-t(2) country(16) us(840) organization(1) netscape(113730) cert-ext(1) cert-type(1)}
...