【问题标题】:How to sign cert with an arbitrary or deprecated extension如何使用任意或不推荐的扩展名签署证书
【发布时间】:2019-09-18 22:03:15
【问题描述】:

例如,假设我想使用任意或不推荐的扩展名(例如 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"
    ), 

【问题讨论】:

  • 谢谢!已经找到我需要的东西了!想要给出答案,我会接受吗?

标签: go ssl x509certificate x509


【解决方案1】:

https://golang.org/src/encoding/asn1/asn1.go定义源:

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

type ObjectIdentifier []int

所以对象标识符(简称OID)是一个整数数组。 asn1 模块具有解析它们的方法,例如parseObjectIdentifier

这是您需要放在Id: 属性之后的结构。

但现在你需要找出你想要的 OID。

虽然难以阅读,但 OpenSSL 源代码可以向您显示 X.400/X.500/X.509 世界中许多事物的 OID,或者至少是 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 是之前定义的,如果你跳转到它的第 407th 项,你会看到:

    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 的整数列表(有关详细信息,请参阅How does ASN.1 encode an object identifier?)。

  • 第一个0x609610所以2*40 + 16,这意味着OID以2.16.开头
  • 那么彼此都是“base128”形式:如果最高有效位为 1,则将所有后续数字的 7 个最低有效位组合在一起,直到最高有效位为 0 为止
  • 0x86100001102 所以必须与 0x48 aka 010010002 所以它实际上是 00001101001000284010
  • 0x01 小于 128 所以它本身,1
  • 0x86 仍然是 100001102 但必须与 0xF8 (111110002) 和 0x42 (01000010) 配对2 我们在这里停止,因为第一位是 0) 所以000011011110001000010211373010
  • 最后两个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 证书类型(Rec. ITU-T X.509 v3 证书扩展 用于识别证书主题是否为 Secure Sockets 层 (SSL) 客户端、SSL 服务器或证书颁发机构 (CA))

然后,您甚至可以浏览各种弧,例如 netscape 或其他弧,以找出其他 OID。

您还可以获得完整的 ASN.1 符号:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2017-11-28
    • 2015-10-13
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多