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