Maison  >  Article  >  développement back-end  >  Problème de fourniture d'informations ExtendedKeyUsage au CSR lors de la construction de Golang

Problème de fourniture d'informations ExtendedKeyUsage au CSR lors de la construction de Golang

王林
王林avant
2024-02-09 15:03:18626parcourir

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

Lors de la génération CSR dans Golang, un problème est survenu lors de la fourniture d'informations à ExtendedKeyUsage. Ce problème peut affecter l'exactitude et la validité du CSR généré. ExtendedKeyUsage fait partie de l'extension du certificat et est utilisé pour spécifier le but de l'utilisation du certificat. En fournissant des informations ExtendedKeyUsage correctes au CSR, la disponibilité et la sécurité du certificat dans des scénarios spécifiques peuvent être garanties. Cependant, dans Golang, vous rencontrez parfois le problème que les informations ExtendedKeyUsage ne peuvent pas être fournies correctement lors de la génération du CSR. L'éditeur PHP Xigua présentera en détail les causes et les solutions à ce problème dans cet article pour aider les lecteurs à résoudre des problèmes similaires et à générer avec succès une CSR qui répond aux exigences.

Contenu des questions

Je suis tombé sur un problème étrange. J'écris un petit outil golang qui génère csr basé sur certaines entrées fournies par l'utilisateur. J'ai surtout réussi à atteindre mon objectif, mais j'ai rencontré des problèmes avec extendedkeyusage. Autrement dit, cela ne fonctionne pas.

Codes de marshaling asn1 pour certains champs x509 :

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)
    }

Ensuite, j'ai créé un modèle et généré et enregistré avec succès le csr, presque :

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

******

Mon extendedkeyusage est vide, alors qu'il devrait s'agir d'une authentification client. Qu'ai-je fait de mal?

J'ai hâte de voir :

X509v3 Extended Key Usage: ClientAuthentication

Je vois des champs vides. J'ai essayé d'utiliser un ensemble d'octets différent d'un autre oid mais toujours aucun résultat. C'est comme si le champ extendedkeyusage ne permettait pas d'écrire quoi que ce soit (même s'il le devrait)

Si importé :

Version : go1.19.3 darwin/amd64

Workaround

Je pense que le problème vient de l'impression des données. Les clés/valeurs existent réellement dans les données.

D'après le code :

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 est asn.1 oid 2.5.29.37 qui, une fois encodé à l'aide de l'encodeur, sera "55 1d 25"

Vous pouvez l'encoder en ligne pour voir quel binaire il générera (par exemple https://www.php.cn/link/8e08227323cd829e449559bb381484b7)

La valeur de

asn1keyusagecauth est 2 (constante définie dans x509.go), qui sera "00 02" une fois codée en chaîne de bits asn.1 à l'aide de l'encodeur (le premier 00 est le nombre de bits de remplissage (aucun), 02 est le nombre de chiffres de remplissage) valeur 2)

Récupérez maintenant la valeur base64 de la demande de certificat et décodez-la à l'aide du décodeur asn.1 (par exemple : https://asn1.io/asn1playground)

miibtzccav0caqawgzwxczajbgnvbaytakfvmq8wdqydvqqiewztewruzxkxdzan bgnvbactbln5zg5letetmbega1uechmkc210aensawvuddelmakga1uecxmcsvqx jtajbgnvbamthhntdggtq2xpzw50lvk4cdg1bk1psvnzmgliz0exijagbgkqhkig 9w0bcqeme3ntdghjbgllbnrac210ac5jb20wwtatbgcqhkjopqibbggqhkjopqmb bwncaar4riguoxsyxdaml9f9e2grjumuk8q0jilotb2kadmbz1rocedszuuxkqcr 0vud2aw3vidph1ar4hkqwkm43hxqof4wxayjkozihvcnaqkomu8wttaebgnvhree fzavgrnzbxroy2xpzw50qhntdgguy29tmasga1udjqqeawiiaajaobgnvhq8baf8e bamcaagwdgydvr0paqh/ba​​qdagabmaogccqgsm49bamca0gameuciqdtbj+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.

Faites défiler la sortie ci-dessus jusqu'à ce que vous la trouviez ici !

Votre clé/valeur est :

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)

J'adorerais décoder le csr selon la spécification asn.1...mais je ne le trouve pas :(

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer