gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:55 26 4
gpt4 key购买 nike

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

最佳答案

前往 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?)。

  • 第一个0x6096 10 所以2*40 + 16 ,这意味着 OID 以 2.16. 开头
  • 然后彼此采用“base128”形式:如果最高有效位为 1,则将所有后续数字的 7 个最低有效位组合在一起,直到最高有效位为 0
  • 0x8610000110 2 所以必须与 0x48 一起使用又名 01001000 2 所以它实际上是 00001101001000 2840 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 certificate type (a Rec. ITU-T X.509 v3 certificate extension used to identify whether the certificate subject is a Secure Sockets Layer (SSL) client, an SSL server or a Certificate Authority (CA))

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

您还可以获得完整的 ASN.1 表示法:

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

关于go - 如何使用任意或已弃用的扩展名签署证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58001289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com