Javascript PKI.js V2和WebCrypto-使用CSR(证书签名请求)添加主题替代名称

Javascript PKI.js V2和WebCrypto-使用CSR(证书签名请求)添加主题替代名称,javascript,webcrypto-api,Javascript,Webcrypto Api,我在PKI.js和webcryptoapi的V1中有一个完整的功能代码,其中添加了带有CSR的主题替代名称(DNS:)。我正在用V2做同样的尝试,但是代码没有运行 版本1的完整功能示例 V1示例使用。此示例不使用CSR添加主题备选名称 请下载此zip文件:在文件csrhelp master\app\src\csrhelps\CsrhelpService.js行号516中,您将找到以下代码: pkcs10_simpl.attributes.push(new org.pkijs.simpl.ATTR

我在PKI.js和webcryptoapi的V1中有一个完整的功能代码,其中添加了带有CSR的主题替代名称(DNS:)。我正在用V2做同样的尝试,但是代码没有运行

版本1的完整功能示例

V1示例使用。此示例不使用CSR添加主题备选名称

请下载此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()]
                }));
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()]
            }));
我用下面给出的代码替换了上面的代码,行号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示例尝试同样的方法。请注意,我直接从pkijs.org链接而不是github获取了这段代码

请下载此zip文件:在V2 PKCS10_complex_example/PKCS10_complex_example.js行号16784的文件中,您可以找到以下代码:

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()]
                }));
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()]
            }));
我将上面的代码(在region 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:链接在上面给出

提前感谢。

更新2019-02-05:备选方案(用于节点) 多年来,我又回到了这个问题上,我终于觉得有足够的唠叨来创造更小的选择:

  • Node.js
    • (RSA)
    • (ECDSA)
他们更“愚蠢”,因为他们没有实现完整的ASN.1和x.509规范,他们只实现对标准键和标准CSR很重要的部分。因此,它们最终变得快速、轻巧、易于构建

我一直想让它们适应浏览器版本。如果你烦我的话,我也会把它做完的。它非常简单(并且大部分都完成了),只是太单调了,以至于我还没有完成转换

v2示例 今天(2018年4月18日)添加了支持SAN的v2官方示例:

(非常感谢您发布您的v1编辑-我现在正在完成这项工作,因为我的目标是使用常规JavaScript)

v1.3.33示例 我有一个v1示例(基于您的工作)可在

在线演示 去格林洛克看看™ 对于Web浏览器:


CSR规范对我来说是个奇怪的谜。然而,对尤里·s来说,这似乎是儿戏。