卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34787本站已运行393

创建一个 CSR,其中 OU 用逗号而不是加号分隔

创建一个 csr,其中 ou 用逗号而不是加号分隔

在使用SSL证书时,创建一个CSR(证书签名请求)是必不可少的一步。而在创建CSR时,有一个重要的参数是OU(组织单位)字段。通常情况下,OU字段使用加号(+)来分隔不同的组织单位。然而,根据php小编香蕉的建议,如果要正确创建CSR,应该使用逗号(,)来分隔不同的组织单位。这样做可以确保CSR的正确性,避免在证书申请过程中出现问题。因此,在创建CSR时,请记得使用逗号分隔OU字段,以确保证书的准确性和顺利申请。

问题内容

我正在尝试使用加密库在 go 中创建证书签名请求。问题是它生成的 CSR 的 OU 由 + 分隔,即

Subject: O = Example Org, OU = OU1 + OU = OU2, CN = example.com

如何生成由 分隔的 OU 的 CSR,例如

Subject: O = Example Org, OU = OU1, OU = OU2, CN = example.com

生成由 + 分隔的 OU 似乎是 crypto lib 的默认行为。这可以使用加密库来完成吗?如果没有,那么是否有任何其他库可以生成CSR,其OU由分隔

我尝试使用下面的代码生成 CSR

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/x509"
    "crypto/x509/pkix"
    "encoding/pem"
    "fmt"
    "os"
)

func main() {
    privKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    csrTemplate := x509.CertificateRequest{
        Subject: pkix.Name{
            CommonName:         "example.com",
            Organization:       []string{"Example Org"},
            OrganizationalUnit: []string{"OU1", "OU2"},
        },
        EmailAddresses: []string{"[email protected]"},
    }

    csrBytes, err := x509.CreateCertificateRequest(rand.Reader, &csrTemplate, privKey)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    csrPem := pem.EncodeToMemory(&pem.Block{
        Type:  "CERTIFICATE REQUEST",
        Bytes: csrBytes,
    })

    fmt.Println(string(csrPem))
}

解决方法

“+”和“,”都不是证书的一部分。它正是在提供证书请求的人类可读字符串表示形式时使用的。

详细信息:您的代码只是打印出 PEM 格式的 CSR 文件,而不是人类可读的证书请求表示形式。使用 asn1parse 查看此 CSR 会得出:

$ openssl asn1parse -in csr.pem 
   ...       
   37:d=4  hl=2 l=  10 cons: SEQUENCE          
   39:d=5  hl=2 l=   3 prim: OBJECT            :organizationalUnitName
   44:d=5  hl=2 l=   3 prim: PRINTABLESTRING   :OU1
   49:d=4  hl=2 l=  10 cons: SEQUENCE          
   51:d=5  hl=2 l=   3 prim: OBJECT            :organizationalUnitName
   56:d=5  hl=2 l=   3 prim: PRINTABLESTRING   :OU2
   61:d=3  hl=2 l=  20 cons: SET

因此,这些是单独的对象,而不是中间有“+”的组合字符串。当使用 req 显示证书请求时,会出现此“+”:

$ openssl req -in csr.pem -text 
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: O = Example Org, OU = OU1 + OU = OU2, CN = example.com

这里使用哪个分隔符实际上可以进行配置。请参阅 openssl-namedisplay-options 并查找 sep_comma_plus_space ,这是默认分隔符。引用文档:

所以你已经明白了:在不同的 RDN(即 O、OU、CN、...)之间使用逗号,而在同一 RDN 内的多个 AVA 之间使用加号(如多个 OU)。另外,无论如何都不鼓励使用多个 AVA。

卓越飞翔博客
上一篇: 从 Golang 中的单个程序打开多个终端窗口
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏