Skip to main content
replaced https://tools.ietf.org/html/rfc with https://www.rfc-editor.org/rfc/rfc
Source Link

The actual ASN.1 structure of a CertificationRequest is defined in RFC2986RFC2986:

The actual ASN.1 structure of a CertificationRequest is defined in RFC2986:

The actual ASN.1 structure of a CertificationRequest is defined in RFC2986:

Source Link
Marc
  • 4.3k
  • 1
  • 21
  • 24

Note: this answer was originally on this question from OP. After splitting the question for clarity, the answer has been moved here.

A CSR is not encrypted in any way. All data in it is readable by anyone with no special requirements. The subject's key pair is not involved when parsing a CSR. There is also no encryption, decryption, hashing, or signing involved in parsing a CSR.

A CSR in PEM format (such as the one shown in the question) is a well-defined way of storing structured data in a binary format, then converting into base64 to allow for ascii-based transmission.

Let's take a look at a CSR from generation all the way to final human-readable representation, going through the various phases of processing the data:

Generating a CSR:

Let's generate a CSR using openssl (between **** are the fields I typed in):

$ openssl req -newkey rsa:2048 -keyout key -out mycsr.csr
Generating a RSA private key
.............+++++
............................+++++
writing new private key to 'key'
Enter PEM pass phrase: ****blahblah****
Verifying - Enter PEM pass phrase: ****blahblah****
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: ****AU****
State or Province Name (full name) [Some-State]: ****Some-State****
Locality Name (eg, city) []: ****Some City****
Organization Name (eg, company) [Internet Widgits Pty Ltd]: ****Some Company****
Organizational Unit Name (eg, section) []: ****Some Org****
Common Name (e.g. server FQDN or YOUR name) []: ****mywebsite.com****
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

I end up with two files: key (my encrypted private key, we won't worry about that one) and mycsr.csr, the actual CSR that I should be sending to the CA.

Contents of the .csr:

$ cat mycsr.csr
-----BEGIN CERTIFICATE REQUEST-----
MIICvTCCAaUCAQAweDELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx
EjAQBgNVBAcMCVNvbWUgQ2l0eTEVMBMGA1UECgwMU29tZSBDb21wYW55MREwDwYD
VQQLDAhTb21lIE9yZzEWMBQGA1UEAwwNbXl3ZWJzaXRlLmNvbTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAMON0JIMj7Pe3qaGwz2qLHdi/792HjGDXtZy
CuBbiCrxtBPoSsL2qZu/1uiJOW9azqxNoY8Ey8HspM9wVhbjemg2AhXaDok9SYZa
i74yIZo45FMvU0fq0tB7h8YY5fSsSzPLIFln4C44fdYWV+BodSLvHWtQyNT1bx/V
s6aDrXdgownnc3X7CooLeECOZesjehpKi6yiu/x74T2H1nczqvsBlF67uj//YzbN
wmlwG3pvtayx4iNux1/mcOcMlKXAbdtMHjPbcU8p5leMLBjMIIR6HeXhxuHYiqmm
evj6+dKdnwRranz7fmC8069fshTh1vLO0n8LWhXXxid6CNm1RFECAwEAAaAAMA0G
CSqGSIb3DQEBCwUAA4IBAQB60GH3Ky000KwckvIrG6+zI44UN7owt57TQ7Sv5SxR
bToWRXORvLZZSi8YIc5GeowvXJ9MJFcBFQ28oq3ctZoinIj1DAuvFdQy5ttmjTXR
r5lrD/EcVDHVsNBdoc/K0wP0SO2mPwB1TOfL/51O6MffrKgkENQhknqU1VHtkRi+
FA0SD/mA9K4Aki8HOyg8mVZks6q5b1IaymsGkowGbZySOOVdCyoYCAmKks0gEOgC
PM08kymcKVMO8rM7NxsjZIU6txBNhg4ZocolR7fQt5seyEHN7+i3MWPbxadX3v4R
4GMItS53W9Zzp1T++GYIhp+CTkWvwmGDfcEC+kcGCdoN
-----END CERTIFICATE REQUEST-----

Base64 decoding the .csr:

As you noticed, this is base64 encoded. Let's decode it, stripping out the header and footer

$ cat mycsr.csr | grep -v CERTIFICATE | base64 -d | hexdump -C
00000000  30 82 02 bd 30 82 01 a5  02 01 00 30 78 31 0b 30  |0...0......0x1.0|
00000010  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
00000020  55 04 08 0c 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
00000030  12 30 10 06 03 55 04 07  0c 09 53 6f 6d 65 20 43  |.0...U....Some C|
00000040  69 74 79 31 15 30 13 06  03 55 04 0a 0c 0c 53 6f  |ity1.0...U....So|
00000050  6d 65 20 43 6f 6d 70 61  6e 79 31 11 30 0f 06 03  |me Company1.0...|
00000060  55 04 0b 0c 08 53 6f 6d  65 20 4f 72 67 31 16 30  |U....Some Org1.0|
00000070  14 06 03 55 04 03 0c 0d  6d 79 77 65 62 73 69 74  |...U....mywebsit|
00000080  65 2e 63 6f 6d 30 82 01  22 30 0d 06 09 2a 86 48  |e.com0.."0...*.H|
...
000002b0  9f 82 4e 45 af c2 61 83  7d c1 02 fa 47 06 09 da  |..NE..a.}...G...|
000002c0  0d                                                |.|

Hey, some of that looks readable already, we can see some of the information I typed into openssl.

DER decoding the ASN.1 data:

This is DER-encoded ASN.1 data, we can tell openssl to parse it for us:

$ cat mycsr.csr | grep -v CERTIFICATE | base64 -d | openssl asn1parse -inform DER -i -dump
    0:d=0  hl=4 l= 701 cons: SEQUENCE          
    4:d=1  hl=4 l= 421 cons:  SEQUENCE          
    8:d=2  hl=2 l=   1 prim:   INTEGER           :00
   11:d=2  hl=2 l= 120 cons:   SEQUENCE          
   13:d=3  hl=2 l=  11 cons:    SET               
   15:d=4  hl=2 l=   9 cons:     SEQUENCE          
   17:d=5  hl=2 l=   3 prim:      OBJECT            :countryName
   22:d=5  hl=2 l=   2 prim:      PRINTABLESTRING   :AU
   26:d=3  hl=2 l=  19 cons:    SET               
   28:d=4  hl=2 l=  17 cons:     SEQUENCE          
   30:d=5  hl=2 l=   3 prim:      OBJECT            :stateOrProvinceName
   35:d=5  hl=2 l=  10 prim:      UTF8STRING        :Some-State
   47:d=3  hl=2 l=  18 cons:    SET               
   49:d=4  hl=2 l=  16 cons:     SEQUENCE          
   51:d=5  hl=2 l=   3 prim:      OBJECT            :localityName
   56:d=5  hl=2 l=   9 prim:      UTF8STRING        :Some City
   67:d=3  hl=2 l=  21 cons:    SET               
   69:d=4  hl=2 l=  19 cons:     SEQUENCE          
   71:d=5  hl=2 l=   3 prim:      OBJECT            :organizationName
   76:d=5  hl=2 l=  12 prim:      UTF8STRING        :Some Company
   90:d=3  hl=2 l=  17 cons:    SET               
   92:d=4  hl=2 l=  15 cons:     SEQUENCE          
   94:d=5  hl=2 l=   3 prim:      OBJECT            :organizationalUnitName
   99:d=5  hl=2 l=   8 prim:      UTF8STRING        :Some Org
  109:d=3  hl=2 l=  22 cons:    SET               
  111:d=4  hl=2 l=  20 cons:     SEQUENCE          
  113:d=5  hl=2 l=   3 prim:      OBJECT            :commonName
  118:d=5  hl=2 l=  13 prim:      UTF8STRING        :mywebsite.com
  133:d=2  hl=4 l= 290 cons:   SEQUENCE          
  137:d=3  hl=2 l=  13 cons:    SEQUENCE          
  139:d=4  hl=2 l=   9 prim:     OBJECT            :rsaEncryption
  150:d=4  hl=2 l=   0 prim:     NULL              
  152:d=3  hl=4 l= 271 prim:    BIT STRING        
      0000 - 00 30 82 01 0a 02 82 01-01 00 c3 8d d0 92 0c 8f   .0..............
      0010 - b3 de de a6 86 c3 3d aa-2c 77 62 ff bf 76 1e 31   ......=.,wb..v.1
      0020 - 83 5e d6 72 0a e0 5b 88-2a f1 b4 13 e8 4a c2 f6   .^.r..[.*....J..
      0030 - a9 9b bf d6 e8 89 39 6f-5a ce ac 4d a1 8f 04 cb   ......9oZ..M....
      0040 - c1 ec a4 cf 70 56 16 e3-7a 68 36 02 15 da 0e 89   ....pV..zh6.....
      0050 - 3d 49 86 5a 8b be 32 21-9a 38 e4 53 2f 53 47 ea   =I.Z..2!.8.S/SG.
      0060 - d2 d0 7b 87 c6 18 e5 f4-ac 4b 33 cb 20 59 67 e0   ..{......K3. Yg.
      0070 - 2e 38 7d d6 16 57 e0 68-75 22 ef 1d 6b 50 c8 d4   .8}..W.hu"..kP..
      0080 - f5 6f 1f d5 b3 a6 83 ad-77 60 a3 09 e7 73 75 fb   .o......w`...su.
      0090 - 0a 8a 0b 78 40 8e 65 eb-23 7a 1a 4a 8b ac a2 bb   [email protected].#z.J....
      00a0 - fc 7b e1 3d 87 d6 77 33-aa fb 01 94 5e bb ba 3f   .{.=..w3....^..?
      00b0 - ff 63 36 cd c2 69 70 1b-7a 6f b5 ac b1 e2 23 6e   .c6..ip.zo....#n
      00c0 - c7 5f e6 70 e7 0c 94 a5-c0 6d db 4c 1e 33 db 71   ._.p.....m.L.3.q
      00d0 - 4f 29 e6 57 8c 2c 18 cc-20 84 7a 1d e5 e1 c6 e1   O).W.,.. .z.....
      00e0 - d8 8a a9 a6 7a f8 fa f9-d2 9d 9f 04 6b 6a 7c fb   ....z.......kj|.
      00f0 - 7e 60 bc d3 af 5f b2 14-e1 d6 f2 ce d2 7f 0b 5a   ~`..._.........Z
      0100 - 15 d7 c6 27 7a 08 d9 b5-44 51 02 03 01 00 01      ...'z...DQ.....
  427:d=2  hl=2 l=   0 cons:   cont [ 0 ]        
  429:d=1  hl=2 l=  13 cons:  SEQUENCE          
  431:d=2  hl=2 l=   9 prim:   OBJECT            :sha256WithRSAEncryption
  442:d=2  hl=2 l=   0 prim:   NULL              
  444:d=1  hl=4 l= 257 prim:  BIT STRING        
      0000 - 00 7a d0 61 f7 2b 2d 34-d0 ac 1c 92 f2 2b 1b af   .z.a.+-4.....+..
      0010 - b3 23 8e 14 37 ba 30 b7-9e d3 43 b4 af e5 2c 51   .#..7.0...C...,Q
      0020 - 6d 3a 16 45 73 91 bc b6-59 4a 2f 18 21 ce 46 7a   m:.Es...YJ/.!.Fz
      0030 - 8c 2f 5c 9f 4c 24 57 01-15 0d bc a2 ad dc b5 9a   ./\.L$W.........
      0040 - 22 9c 88 f5 0c 0b af 15-d4 32 e6 db 66 8d 35 d1   "........2..f.5.
      0050 - af 99 6b 0f f1 1c 54 31-d5 b0 d0 5d a1 cf ca d3   ..k...T1...]....
      0060 - 03 f4 48 ed a6 3f 00 75-4c e7 cb ff 9d 4e e8 c7   ..H..?.uL....N..
      0070 - df ac a8 24 10 d4 21 92-7a 94 d5 51 ed 91 18 be   ...$..!.z..Q....
      0080 - 14 0d 12 0f f9 80 f4 ae-00 92 2f 07 3b 28 3c 99   ........../.;(<.
      0090 - 56 64 b3 aa b9 6f 52 1a-ca 6b 06 92 8c 06 6d 9c   Vd...oR..k....m.
      00a0 - 92 38 e5 5d 0b 2a 18 08-09 8a 92 cd 20 10 e8 02   .8.].*...... ...
      00b0 - 3c cd 3c 93 29 9c 29 53-0e f2 b3 3b 37 1b 23 64   <.<.).)S...;7.#d
      00c0 - 85 3a b7 10 4d 86 0e 19-a1 ca 25 47 b7 d0 b7 9b   .:..M.....%G....
      00d0 - 1e c8 41 cd ef e8 b7 31-63 db c5 a7 57 de fe 11   ..A....1c...W...
      00e0 - e0 63 08 b5 2e 77 5b d6-73 a7 54 fe f8 66 08 86   .c...w[.s.T..f..
      00f0 - 9f 82 4e 45 af c2 61 83-7d c1 02 fa 47 06 09 da   ..NE..a.}...G...
      0100 - 0d                                                . 

Making sense of the contents:

We can see the structure of the file, including all the fields I typed in clearly readable, and some big blobs of data corresponding to my public key and the signature.

The actual ASN.1 structure of a CertificationRequest is defined in RFC2986:

   CertificationRequest ::= SEQUENCE {
        certificationRequestInfo CertificationRequestInfo,
        signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
        signature          BIT STRING
   }

   CertificationRequestInfo ::= SEQUENCE {
        version       INTEGER { v1(0) } (v1,...),
        subject       Name,
        subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
        attributes    [0] Attributes{{ CRIAttributes }}
   }

   SubjectPublicKeyInfo { ALGORITHM : IOSet} ::= SEQUENCE {
        algorithm        AlgorithmIdentifier {{IOSet}},
        subjectPublicKey BIT STRING
   }

   AlgorithmIdentifier {ALGORITHM:IOSet } ::= SEQUENCE {
        algorithm          ALGORITHM.&id({IOSet}),
        parameters         ALGORITHM.&Type({IOSet}{@algorithm}) OPTIONAL
   }

Making it human-friendly:

This is all nice and well but this output is still hard to read. Instead, we can ask openssl to do all these steps for us and display it in a much friendlier way:

$ openssl req -text -in mycsr.csr 
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = AU, ST = Some-State, L = Some City, O = Some Company, OU = Some Org, CN = mywebsite.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:c3:8d:d0:92:0c:8f:b3:de:de:a6:86:c3:3d:aa:
                    2c:77:62:ff:bf:76:1e:31:83:5e:d6:72:0a:e0:5b:
                    88:2a:f1:b4:13:e8:4a:c2:f6:a9:9b:bf:d6:e8:89:
                    39:6f:5a:ce:ac:4d:a1:8f:04:cb:c1:ec:a4:cf:70:
                    56:16:e3:7a:68:36:02:15:da:0e:89:3d:49:86:5a:
                    8b:be:32:21:9a:38:e4:53:2f:53:47:ea:d2:d0:7b:
                    87:c6:18:e5:f4:ac:4b:33:cb:20:59:67:e0:2e:38:
                    7d:d6:16:57:e0:68:75:22:ef:1d:6b:50:c8:d4:f5:
                    6f:1f:d5:b3:a6:83:ad:77:60:a3:09:e7:73:75:fb:
                    0a:8a:0b:78:40:8e:65:eb:23:7a:1a:4a:8b:ac:a2:
                    bb:fc:7b:e1:3d:87:d6:77:33:aa:fb:01:94:5e:bb:
                    ba:3f:ff:63:36:cd:c2:69:70:1b:7a:6f:b5:ac:b1:
                    e2:23:6e:c7:5f:e6:70:e7:0c:94:a5:c0:6d:db:4c:
                    1e:33:db:71:4f:29:e6:57:8c:2c:18:cc:20:84:7a:
                    1d:e5:e1:c6:e1:d8:8a:a9:a6:7a:f8:fa:f9:d2:9d:
                    9f:04:6b:6a:7c:fb:7e:60:bc:d3:af:5f:b2:14:e1:
                    d6:f2:ce:d2:7f:0b:5a:15:d7:c6:27:7a:08:d9:b5:
                    44:51
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         7a:d0:61:f7:2b:2d:34:d0:ac:1c:92:f2:2b:1b:af:b3:23:8e:
         14:37:ba:30:b7:9e:d3:43:b4:af:e5:2c:51:6d:3a:16:45:73:
         91:bc:b6:59:4a:2f:18:21:ce:46:7a:8c:2f:5c:9f:4c:24:57:
         01:15:0d:bc:a2:ad:dc:b5:9a:22:9c:88:f5:0c:0b:af:15:d4:
         32:e6:db:66:8d:35:d1:af:99:6b:0f:f1:1c:54:31:d5:b0:d0:
         5d:a1:cf:ca:d3:03:f4:48:ed:a6:3f:00:75:4c:e7:cb:ff:9d:
         4e:e8:c7:df:ac:a8:24:10:d4:21:92:7a:94:d5:51:ed:91:18:
         be:14:0d:12:0f:f9:80:f4:ae:00:92:2f:07:3b:28:3c:99:56:
         64:b3:aa:b9:6f:52:1a:ca:6b:06:92:8c:06:6d:9c:92:38:e5:
         5d:0b:2a:18:08:09:8a:92:cd:20:10:e8:02:3c:cd:3c:93:29:
         9c:29:53:0e:f2:b3:3b:37:1b:23:64:85:3a:b7:10:4d:86:0e:
         19:a1:ca:25:47:b7:d0:b7:9b:1e:c8:41:cd:ef:e8:b7:31:63:
         db:c5:a7:57:de:fe:11:e0:63:08:b5:2e:77:5b:d6:73:a7:54:
         fe:f8:66:08:86:9f:82:4e:45:af:c2:61:83:7d:c1:02:fa:47:
         06:09:da:0d
-----BEGIN CERTIFICATE REQUEST-----
MIICvTCCAaUCAQAweDELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx
EjAQBgNVBAcMCVNvbWUgQ2l0eTEVMBMGA1UECgwMU29tZSBDb21wYW55MREwDwYD
VQQLDAhTb21lIE9yZzEWMBQGA1UEAwwNbXl3ZWJzaXRlLmNvbTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAMON0JIMj7Pe3qaGwz2qLHdi/792HjGDXtZy
CuBbiCrxtBPoSsL2qZu/1uiJOW9azqxNoY8Ey8HspM9wVhbjemg2AhXaDok9SYZa
i74yIZo45FMvU0fq0tB7h8YY5fSsSzPLIFln4C44fdYWV+BodSLvHWtQyNT1bx/V
s6aDrXdgownnc3X7CooLeECOZesjehpKi6yiu/x74T2H1nczqvsBlF67uj//YzbN
wmlwG3pvtayx4iNux1/mcOcMlKXAbdtMHjPbcU8p5leMLBjMIIR6HeXhxuHYiqmm
evj6+dKdnwRranz7fmC8069fshTh1vLO0n8LWhXXxid6CNm1RFECAwEAAaAAMA0G
CSqGSIb3DQEBCwUAA4IBAQB60GH3Ky000KwckvIrG6+zI44UN7owt57TQ7Sv5SxR
bToWRXORvLZZSi8YIc5GeowvXJ9MJFcBFQ28oq3ctZoinIj1DAuvFdQy5ttmjTXR
r5lrD/EcVDHVsNBdoc/K0wP0SO2mPwB1TOfL/51O6MffrKgkENQhknqU1VHtkRi+
FA0SD/mA9K4Aki8HOyg8mVZks6q5b1IaymsGkowGbZySOOVdCyoYCAmKks0gEOgC
PM08kymcKVMO8rM7NxsjZIU6txBNhg4ZocolR7fQt5seyEHN7+i3MWPbxadX3v4R
4GMItS53W9Zzp1T++GYIhp+CTkWvwmGDfcEC+kcGCdoN
-----END CERTIFICATE REQUEST-----

Ah, finally. We have a clear representation of CSR contents. There was no magic here, this is just openssl performing all the decoding necessary. Note that it only has access to the .csr, my keys do not come into play in any of this parsing.

Final word:

The information you see in these last steps is exactly what the CA sees. To summarize:

  • the subject information
  • the subject's public key
  • the signature of the two items above
  • the algorithm used to sign