PKI.js V2 和 WebCrypto - 添加带有 CSR 的主题备用名称(证书签名请求)
PKI.js V2 and and WebCrypto - add Subject Alternative Name with CSR (Certificate Signing Request)
我在 PKI.js 和 WebCrypto API 的 V1 中有一个完整的功能代码,它添加了带有 CSR 的主题备用名称 (DNS:)。我正在尝试对 V2 进行同样的操作,但代码不是 运行.
版本 1 的完整功能示例
带有 CSRhelp 的 V1 示例。此示例不添加带有 CSR 的主题备用名称。
请下载此 zip:https://getwww.me/V1-csrhelp-master.zip 在文件 csrhelp-master\app\src\csrhelps\CsrhelpService.js 行号 516 中,您将找到以下代码:
pkcs10_simpl.attributes.push(new org.pkijs.simpl.ATTRIBUTE({
type: "1.2.840.113549.1.9.14", // pkcs-9-at-extensionRequest
values: [(new org.pkijs.simpl.EXTENSIONS({
extensions_array: [
new org.pkijs.simpl.EXTENSION({
extnID: "2.5.29.14",
critical: false,
extnValue: (new org.pkijs.asn1.OCTETSTRING({
value_hex: result
})).toBER(false)
})
]
})).toSchema()]
}));
我用下面给出的代码替换了上面的代码,行号 480 到 511(在#region SubjectKeyIdentifier 中)。 而且工作正常。
var extensions = new org.pkijs.simpl.EXTENSIONS({
extensions_array: [
new org.pkijs.simpl.EXTENSION({
extnID: "2.5.29.14",
critical: false,
extnValue: (new org.pkijs.asn1.OCTETSTRING({ value_hex: result })).toBER(false)
})
]
});
var altNames = new org.pkijs.simpl.GENERAL_NAMES({
names: [
new org.pkijs.simpl.GENERAL_NAME({
NameType: 2,
Name: "domain1.com, DNS:domain2.com, DNS:domain3.com"
})
]
});
extensions.extensions_array.push(new org.pkijs.simpl.EXTENSION({
extnID: "2.5.29.17", // subjectAltName
critical: false,
extnValue: altNames.toSchema().toBER(false)
}));
var attribute = new org.pkijs.simpl.ATTRIBUTE({
type: "1.2.840.113549.1.9.14", // pkcs-9-at-extensionRequest
values: [extensions.toSchema()]
});
pkcs10_simpl.attributes.push(attribute);
版本 2
现在我正在尝试使用 V2 示例进行同样的操作 PKCS#10 complex example。请注意,我直接从 pkijs.org link 而不是 github.
中获取了这段代码
请下载此 zip:https://getwww.me/V2-PKCS10_complex_example.zip 在文件 V2 PKCS10_complex_example/ PKCS10_complex_example.js 行号 16784 中,您将找到以下内容代码:
pkcs10.attributes.push(new Attribute({
type: "1.2.840.113549.1.9.14", // pkcs-9-at-extensionRequest
values: [new Extensions({
extensions: [new Extension({
extnID: "2.5.29.14",
critical: false,
extnValue: new OctetString({ valueHex: result }).toBER(false)
})]
}).toSchema()]
}));
我用下面给出的代码替换了上面的代码(在区域 SubjectKeyIdentifier 中),行号 16749 到 16780。
var extns = new Extensions();
extns.extensions = new Array();
extns.extensions.push(new Extension({
extnID: "2.5.29.14",
critical: false,
extnValue: (new OctetString({ valueHex: result })).toBER(false)
}));
var altNames = new GeneralNames({
names: [
new GeneralName({
NameType: 2,
Name: "domain1.com, DNS:domain2.com, DNS:domain3.com"
})
]
});
extns.extensions.push(new Extension({
extnID: "2.5.29.17", // subjectAltName
critical: false,
extnValue: altNames.toSchema().toBER(false)
}));
var attribute = new Attribute({
type: "1.2.840.113549.1.9.14", // pkcs-9-at-extensionRequest
values: [extns.toSchema()]
});
pkcs10.attributes.push(attribute);
但这不是运行.我找不到我哪里做错了。请帮忙。
我已将 V1 和 V2 示例(已修改)作为 zip 文件附上:links 已在上面给出。
提前致谢。
2019-02-05 更新:备选方案(针对节点)
经过多年回到这个问题,我终于感到足够的唠叨来创建更小的替代方案:
- Node.js
- Rasha.js (RSA), rsa-csr.js
- Eckles.js (ECDSA),ecdsa-csr.js
他们的 "dumber" 在于他们没有实现完整的 ASN.1 和 x.509 规范,他们只实现了对标准密钥和标准 CSR 很重要的部分。因此,它们最终变得快速、轻便且易于构建。
我一直想让它们也适应浏览器版本。如果你打扰我,我也会完成的。它非常简单(并且 大部分 已完成),只是乏味到我还没有完成转换。
v2 示例
今天(2018 年 4 月 18 日)添加了支持 SAN 的 v2 的官方示例:
https://github.com/PeculiarVentures/PKI.js/commit/df5ee2acaf1ffafed6cde8b974e9186d3c4cac78
(非常感谢您发布您的 v1 编辑 - 我现在正在努力,因为我的目标是使用常规 JavaScript)
v1.3.33 示例
我在 https://coolaj86.com/articles/lets-encrypt-v2-step-by-step/
上有一个 v1 示例(基于您的工作)
在线演示
查看用于 Web 浏览器的 Greenlock™:
我在 PKI.js 和 WebCrypto API 的 V1 中有一个完整的功能代码,它添加了带有 CSR 的主题备用名称 (DNS:)。我正在尝试对 V2 进行同样的操作,但代码不是 运行.
版本 1 的完整功能示例
带有 CSRhelp 的 V1 示例。此示例不添加带有 CSR 的主题备用名称。
请下载此 zip:https://getwww.me/V1-csrhelp-master.zip 在文件 csrhelp-master\app\src\csrhelps\CsrhelpService.js 行号 516 中,您将找到以下代码:
pkcs10_simpl.attributes.push(new org.pkijs.simpl.ATTRIBUTE({
type: "1.2.840.113549.1.9.14", // pkcs-9-at-extensionRequest
values: [(new org.pkijs.simpl.EXTENSIONS({
extensions_array: [
new org.pkijs.simpl.EXTENSION({
extnID: "2.5.29.14",
critical: false,
extnValue: (new org.pkijs.asn1.OCTETSTRING({
value_hex: result
})).toBER(false)
})
]
})).toSchema()]
}));
我用下面给出的代码替换了上面的代码,行号 480 到 511(在#region SubjectKeyIdentifier 中)。 而且工作正常。
var extensions = new org.pkijs.simpl.EXTENSIONS({
extensions_array: [
new org.pkijs.simpl.EXTENSION({
extnID: "2.5.29.14",
critical: false,
extnValue: (new org.pkijs.asn1.OCTETSTRING({ value_hex: result })).toBER(false)
})
]
});
var altNames = new org.pkijs.simpl.GENERAL_NAMES({
names: [
new org.pkijs.simpl.GENERAL_NAME({
NameType: 2,
Name: "domain1.com, DNS:domain2.com, DNS:domain3.com"
})
]
});
extensions.extensions_array.push(new org.pkijs.simpl.EXTENSION({
extnID: "2.5.29.17", // subjectAltName
critical: false,
extnValue: altNames.toSchema().toBER(false)
}));
var attribute = new org.pkijs.simpl.ATTRIBUTE({
type: "1.2.840.113549.1.9.14", // pkcs-9-at-extensionRequest
values: [extensions.toSchema()]
});
pkcs10_simpl.attributes.push(attribute);
版本 2
现在我正在尝试使用 V2 示例进行同样的操作 PKCS#10 complex example。请注意,我直接从 pkijs.org link 而不是 github.
中获取了这段代码请下载此 zip:https://getwww.me/V2-PKCS10_complex_example.zip 在文件 V2 PKCS10_complex_example/ PKCS10_complex_example.js 行号 16784 中,您将找到以下内容代码:
pkcs10.attributes.push(new Attribute({
type: "1.2.840.113549.1.9.14", // pkcs-9-at-extensionRequest
values: [new Extensions({
extensions: [new Extension({
extnID: "2.5.29.14",
critical: false,
extnValue: new OctetString({ valueHex: result }).toBER(false)
})]
}).toSchema()]
}));
我用下面给出的代码替换了上面的代码(在区域 SubjectKeyIdentifier 中),行号 16749 到 16780。
var extns = new Extensions();
extns.extensions = new Array();
extns.extensions.push(new Extension({
extnID: "2.5.29.14",
critical: false,
extnValue: (new OctetString({ valueHex: result })).toBER(false)
}));
var altNames = new GeneralNames({
names: [
new GeneralName({
NameType: 2,
Name: "domain1.com, DNS:domain2.com, DNS:domain3.com"
})
]
});
extns.extensions.push(new Extension({
extnID: "2.5.29.17", // subjectAltName
critical: false,
extnValue: altNames.toSchema().toBER(false)
}));
var attribute = new Attribute({
type: "1.2.840.113549.1.9.14", // pkcs-9-at-extensionRequest
values: [extns.toSchema()]
});
pkcs10.attributes.push(attribute);
但这不是运行.我找不到我哪里做错了。请帮忙。
我已将 V1 和 V2 示例(已修改)作为 zip 文件附上:links 已在上面给出。
提前致谢。
2019-02-05 更新:备选方案(针对节点)
经过多年回到这个问题,我终于感到足够的唠叨来创建更小的替代方案:
- Node.js
- Rasha.js (RSA), rsa-csr.js
- Eckles.js (ECDSA),ecdsa-csr.js
他们的 "dumber" 在于他们没有实现完整的 ASN.1 和 x.509 规范,他们只实现了对标准密钥和标准 CSR 很重要的部分。因此,它们最终变得快速、轻便且易于构建。
我一直想让它们也适应浏览器版本。如果你打扰我,我也会完成的。它非常简单(并且 大部分 已完成),只是乏味到我还没有完成转换。
v2 示例
今天(2018 年 4 月 18 日)添加了支持 SAN 的 v2 的官方示例:
https://github.com/PeculiarVentures/PKI.js/commit/df5ee2acaf1ffafed6cde8b974e9186d3c4cac78
(非常感谢您发布您的 v1 编辑 - 我现在正在努力,因为我的目标是使用常规 JavaScript)
v1.3.33 示例
我在 https://coolaj86.com/articles/lets-encrypt-v2-step-by-step/
上有一个 v1 示例(基于您的工作)在线演示
查看用于 Web 浏览器的 Greenlock™: