为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕侠2389804 2023-07-26 13:38:56
例如,假设我想使用任意或已弃用的扩展名签署证书(例如 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 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

// 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 的整数列表。

  • 第一个0x609610所以2*40 + 16,这意味着 OID 开头为2.16.

  • 那么彼此都是“base128”形式:如果最高有效位为 1,则将所有后续数字的 7 个最低有效位组合在一起,直到其中一个最高有效位为 0

  • 0x86100001102,所以必须与0x48aka 010010002一起使用,所以它实际上是00001101001000284010

  • 0x01小于 128 所以它就是它本身,1

  • 0x86仍然是100001102,但必须与0xF8111110002 ) 和0x42010000102配对,我们在这里停止,因为第一位是 0) 所以总共000011011110001000010211373010

  • 最后两个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)}



查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信