首頁  >  文章  >  後端開發  >  在 golang 中產生期間向 CSR 提供​​ ExtendedKeyUsage 資訊時出現問題

在 golang 中產生期間向 CSR 提供​​ ExtendedKeyUsage 資訊時出現問題

王林
王林轉載
2024-02-09 15:03:18659瀏覽

在 golang 中生成期间向 CSR 提供​​ ExtendedKeyUsage 信息时出现问题

在golang中產生CSR期間,出現了向ExtendedKeyUsage提供資訊的問題。這個問題可能會影響到產生的CSR的正確性和有效性。 ExtendedKeyUsage是憑證擴充的一部分,用於指定憑證的使用目的。透過向CSR提供正確的ExtendedKeyUsage信息,可以確保證書在特定場景下的可用性和安全性。然而,在golang中,有時會遇到產生CSR時無法正確提供ExtendedKeyUsage資訊的問題。 php小編西瓜將在本文中詳細介紹這個問題的原因和解決方案,幫助讀者解決類似的問題並順利產生符合要求的CSR。

問題內容

我偶然發現了一個奇怪的問題。 我正在編寫一個小型 golang 工具,它根據一些用戶提供的輸入產生 csr 。我基本上成功地實現了目標,但在 extendedkeyusage 方面遇到了問題。簡單地說,它不起作用。

一些 x509 欄位的 asn1 編組程式碼:

var oidemailaddress = asn1.objectidentifier{1, 2, 840, 113549, 1, 9, 1}
    var oidextensionkeyusage = asn1.objectidentifier{2, 5, 29, 15}
    var oidextensionextendedkeyusage = asn1.objectidentifier{2, 5, 29, 37}

    asn1keyusagedigsig, err := asn1.marshal(asn1.bitstring{
        bytes:     []byte{byte(x509.keyusagedigitalsignature)},
        bitlength: 8,
    })
    asn1keyusagedatenc, err := asn1.marshal(asn1.bitstring{
        bytes:     []byte{byte(x509.keyusagedataencipherment)},
        bitlength: 8,
    })
    asn1keyusagecauth, err := asn1.marshal(asn1.bitstring{
        bytes:     []byte{byte(x509.extkeyusageclientauth)},
        bitlength: 8,
    })

    if err != nil {
        error.fatalf("can't serialize extended key usage %s", err)
    }

然後我創建了一個模板並成功生成並保存了csr,差不多了:

template := x509.certificaterequest{
        rawsubject:         asn1subj,
        emailaddresses:     []string{emailaddress},
        signaturealgorithm: _sigalg,
        extraextensions: []pkix.extension{
            {
                id: oidextensionextendedkeyusage,
                value: asn1keyusagecauth,
            },
            {
                id:       oidextensionkeyusage,
                critical: true,
                value:    asn1keyusagedatenc,
            },
            {
                id:       oidextensionkeyusage,
                critical: true,
                value:    asn1keyusagedigsig,
            },
        },
    }

    csrbytes, _ := x509.createcertificaterequest(rand.reader, &template, privatekey)
and here is an openssl req -in my_output.csr -text -noout
******
         asn1 oid: prime256v1
                nist curve: p-256
        attributes:
        requested extensions:
            x509v3 subject alternative name: 
                email:[email protected]
            x509v3 extended key usage: 
                ....
            x509v3 key usage: critical
                key agreement
            x509v3 key usage: critical
                encipher only
    signature algorithm: ecdsa-with-sha256

******

我的extendedkeyusage是空的,而它應該是clientauthentication。我做錯了什麼?

我期待看到:

X509v3 Extended Key Usage: ClientAuthentication

我看到的是空白欄位。我嘗試使用來自另一個 oid 的不同位元組集,但仍然沒有任何結果。就好像 extendedkeyusage 欄位不允許寫入任何內容(雖然它應該)

如果是導入的:

版本:go1.19.3 darwin/amd64

解決方法

我認為問題出在列印資料時。鍵/值實際上存在於資料中。

從程式碼:

var oidextensionextendedkeyusage = asn1.objectidentifier{2, 5, 29, 37}

asn1keyusagecauth, err := asn1.marshal(asn1.bitstring{
    bytes:     []byte{byte(x509.extkeyusageclientauth)},
    bitlength: 8,
})

extraextensions: []pkix.extension{
    {
        id: oidextensionextendedkeyusage,
        //critical: true,
        value: asn1keyusagecauth,
        //value: {2, 5, 29, 15},
    },

oidextensionextendedkeyusage 為 asn.1 oid 2.5.29.37,使用 der 編碼器編碼時將為「55 1d 25」

您可以在線對其進行編碼,以查看它將生成什麼二進位(例如 https://www.php.cn/link/8e08227323cd829e449559bb381484b7)

asn1keyusagecauth 值為2(在x509.go 中定義的常數),當使用der 編碼器編碼為asn.1 bit string 時將為“00 02”(第一個00 是填充位數(無), 02 是填充位數)值2)

現在取得憑證要求的 base64 值並使用 asn.1 der 解碼器對其進行解碼(例如:https: //asn1.io/asn1playground)

miibtzccav0caqawgzwxczajbgnvbaytakfvmq8wdqydvqqiewztewruzxkxdzan bgnvbactbln5zg5letetmbega1uechmkc210aensawvuddelmakga1uecxmcsvqx jtajbgnvbamthhntdggtq2xpzw50lvk4cdg1bk1psvnzmgliz0exijagbgkqhkig 9w0bcqeme3ntdghjbgllbnrac210ac5jb20wwtatbgcqhkjopqibbggqhkjopqmb bwncaar4riguoxsyxdaml9f9e2grjumuk8q0jilotb2kadmbz1rocedszuuxkqcr 0vud2aw3vidph1ar4hkqwkm43hxqof4wxayjkozihvcnaqkomu8wttaebgnvhree fzavgrnzbxroy2xpzw50qhntdgguy29tmasga1udjqqeawiiaajaobgnvhq8baf8e bamcaagwdgydvr0paqh/baqdagabmaogccqgsm49bamca0gameuciqdtbj 0atjy f1gy8am2mv7/x3tsebmmvdszkw8l6rvseqigmih8co9nkp0axdmgp9x4kvjjzk9x rw3roydt89d73oa=

#
try the full power of oss' asn-1step by downloading a free trial

oss nokalva tlv print utility  version 8.6.1
copyright (c) 1997-2022 oss nokalva, inc.  all rights reserved.


30 8201b7(439)
  30 82015d(349)
    02 01 00
    30 819c(156)
      31 0b
        30 09
          06 03 550406
          13 02 4155
      31 0f
        30 0d
          06 03 550408
          13 06 5379646e6579
      31 0f
        30 0d
          06 03 550407
          13 06 5379646e6579
      31 13
        30 11
          06 03 55040a
          13 0a 736d7468436c69656e74
      31 0b
        30 09
          06 03 55040b
          13 02 4954
      31 25
        30 23
          06 03 550403
          13 1c 736d74682d436c69656e742d59387038356e4d694953733069486741
      31 22
        30 20
          06 09 2a864886f70d010901
          0c 13 736d7468636c69656e7440736d74682e636f6d
    30 59
      30 13
        06 07 2a8648ce3d0201
        06 08 2a8648ce3d030107
      03 42 000478ac88143b14b25dd68c2fd17d7b68118ee3142bc4348e29684dbda401d9...
    a0 5e
      30 5c
        06 09 2a864886f70d01090e
        31 4f
          30 4d
            30 1e
              06 03 551d11
              04 17 30158113736d7468636c69656e7440736d74682e636f6d
            30 0b -- here it is!
              06 03 551d25
              04 04 03020002
            30 0e
              06 03 551d0f
              01 01 ff
              04 04 03020008
            30 0e
              06 03 551d0f
              01 01 ff
              04 04 03020001
  30 0a
    06 08 2a8648ce3d040302
  03 48 003045022100d3063fb402d8f2175198f0033632feff5f7b6c11b98c55db332b0f25...


results
to get more details, please provide/compile a schema for your data.

向下捲動上面的輸出,直到找到 here it is!

您的鍵/值是:

30 0B    -- a SEQUENCE of 11 bytes
    06 03 551D25   -- an item of 3 bytes (551D25 ... OidExtensionExtendedKeyUsage)
    04 04 03020002 --  an item of 4 bytes (03 02 0002 ... an item of 2 bytes 0002 ... asn1KeyUsageCAuth)

我很想根據 asn.1 規範解碼 csr ...但我找不到它:(

以上是在 golang 中產生期間向 CSR 提供​​ ExtendedKeyUsage 資訊時出現問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除