go - 如何在 GO 中创建具有扩展名和属性值的证书签名请求?
问题描述
我正在尝试使用 crypto/x509 包来创建证书请求(csr),但我不知道如何添加扩展和属性参数。
在CertificateRequest 结构中,我们可以看到扩展是 pkix.Extension 类型。这是pki.Extension的结构:
type Extension struct {
Id asn1.ObjectIdentifier
Critical bool `asn1:"optional"`
Value []byte
}
在代码中搜索我在https://golang.org/src/crypto/x509/x509.go中找到了以下常量:
var (
oidExtKeyUsageAny = asn1.ObjectIdentifier{2, 5, 29, 37, 0}
oidExtKeyUsageServerAuth = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 1}
oidExtKeyUsageClientAuth = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 2}
oidExtKeyUsageCodeSigning = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 3}
oidExtKeyUsageEmailProtection = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 4}
oidExtKeyUsageIPSECEndSystem = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 5}
oidExtKeyUsageIPSECTunnel = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 6}
oidExtKeyUsageIPSECUser = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 7}
oidExtKeyUsageTimeStamping = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 8}
oidExtKeyUsageOCSPSigning = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 9}
oidExtKeyUsageMicrosoftServerGatedCrypto = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 311, 10, 3, 3}
oidExtKeyUsageNetscapeServerGatedCrypto = asn1.ObjectIdentifier{2, 16, 840, 1, 113730, 4, 1}
oidExtKeyUsageMicrosoftCommercialCodeSigning = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 311, 2, 1, 22}
oidExtKeyUsageMicrosoftKernelCodeSigning = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 311, 61, 1, 1}
)
好的,现在我有了参数的 ID。就我而言,我想将 KeyUsage 扩展设置为 serverAuth。我有身份证,但价值是多少?
我不知道我的方法是否正确。有人可以帮我解决这个问题吗?
解决方案
属性字段被视为已弃用并且无法正常工作。
当我必须向 csr 添加属性时,我将 x509.CreateCertificateRequest 所需的功能复制到内部文件中,并通过在编组证书请求的 tbsCSR 字段之前以原始格式添加我的属性来修复 CreateCertificateRequest。注意:certificateRequest 结构不是 x509.CertfiacteRequest,该结构用于编组。下面是 passwordChallengeAttribute 的代码示例:
var oidChallengePassword = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 9, 7}
type passwordChallengeAttribute struct {
Type asn1.ObjectIdentifier
Value []string `asn1:"set"`
}
passwordAttribute := passwordChallengeAttribute{
Type: oidChallengePassword,
Value: []string{challenge},
}
b, err := asn1.Marshal(passwordAttribute)
if err != nil {
//
}
var rawAttribute asn1.RawValue
asn1.Unmarshal(b, &rawAttribute)
tbsCSR.RawAttributes = append(tbsCSR.RawAttributes, rawAttribute)
但是使用扩展更好并且受支持,因此您只需要实现表示所需扩展的数据结构,将其编组并添加到扩展列表中。例如,添加 BasicConstraints 扩展:
type basicConstraints struct {
IsCA bool `asn1:"optional"`
MaxPathLen int `asn1:"optional,default:-1"`
}
var extensions []pkix.Extension
basicCon := basicConstraints{IsCA: true, MaxPathLen: -1}
bitstr, err := asn1.Marshal(basicCon)
if err != nil {
//
}
var oidExtensionBasicConstraints = []int{2, 5, 29, 19} //export from x509 package
bcExt := pkix.Extension{Id: oidExtensionBasicConstraints, Value: bitstr}
extensions = append(extensions, bcExt)
csrTmpl := &x509.CertificateRequest{
Extensions: extensions,
}
推荐阅读
- python - Discord.py 在命令执行后提及角色
- java - 将数字移到字符串递归Java的开头
- flutter - Flutter - 英雄动画不适用于选项卡导航器
- python - Selenium webdriver 正在打开浏览器,但没有打开给定的 url
- c# - 列表中的数据
不显示在 datagridview - vue.js - Vue.js - 'v-bind' 指令需要一个属性值 (vue/valid-v-bind)
- java - 如何在java中将InputStream转换为Reader?
- regex - 为什么我的 PowerShell 脚本没有命名匹配组?
- android - 如何在 mdpi、ldpi、hdpi、xhdpi 中调整图像大小
- micro-frontend - 如何使用 RxJs 在单水疗中心共享 UI 状态?