如何使用任意或已弃用的扩展名签署证书

例如,假设我想使用任意或已弃用的扩展名签署证书(例如 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"

    ), 


慕侠2389804
浏览 99回答 1
1回答

一只甜甜圈

// 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 已知的事物的 OID。{"nsCertType", "Netscape Cert Type", NID_netscape_cert_type, 9, &so[407]},so是之前定义的,如果你跳转到第 407项,你会看到:    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 的整数列表。第一个0x60是9610所以2*40 + 16,这意味着 OID 开头为2.16.那么彼此都是“base128”形式:如果最高有效位为 1,则将所有后续数字的 7 个最低有效位组合在一起,直到其中一个最高有效位为 00x86是100001102,所以必须与0x48aka 010010002一起使用,所以它实际上是000011010010002或840100x01小于 128 所以它就是它本身,10x86仍然是100001102,但必须与0xF8( 111110002 ) 和0x42( 010000102配对,我们在这里停止,因为第一位是 0) 所以总共0000110111100010000102或11373010最后两个0x01是他们自己,1。所以我们确实再次得到2.16.840.1.113730.1.1您可以在一些在线 OID 浏览器上仔细检查它,Netscape 证书类型(Rec. ITU-T X.509 v3 证书扩展,用于识别证书主体是安全套接字层 (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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go