I’ve been playing round with certificates, keys and Certificate Signing Requests (CSRs) whilst evaluating the security of an IoT solution.
I’ve had a longstanding misconception around CSRs and I thought I would document it here in case anyone else finds the same issue.
The purpose of a CSR is to request a certificate from a Certificate Authority (CA), where they sign your public key and a number of pieces of data called “subjects”. Normally these subjects, for HTTPS, are related to the domain.
The CSR in question looks like this:
root@kali:~# openssl req -in csr.req -text -noout Certificate Request: Data: Version: 0 (0x0) Subject: emailAddress=cybergibbon@test.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (1024 bit) Modulus: 00:ea:a9:04:df:20:63:6d:78:8d:a4:c3:8a:7e:b5: a9:38:a7:1d:2a:75:20:90:45:2d:c9:9e:b3:08:18: a9:59:d4:79:95:40:ef:cc:4f:2c:93:73:21:02:05: 9b:47:c4:9b:73:21:a8:fe:da:9c:2c:71:98:f5:49: 37:a7:28:a4:f5:14:6a:a0:91:dd:a7:87:63:d4:b4: 2a:aa:a6:9b:b2:a4:72:ab:91:58:2b:e5:6e:34:84: 05:ce:c8:dc:7f:3c:33:5f:d2:14:27:37:34:ee:aa: 58:29:de:5c:f5:b7:93:69:94:a9:20:02:84:fb:cd: 5e:04:43:56:df:c2:48:f7:41 Exponent: 65537 (0x10001) Attributes: a0:00 Signature Algorithm: sha1WithRSAEncryption 01:e8:97:81:25:0b:b1:c5:9c:66:62:6f:0a:6a:00:b6:1d:6c: d9:17:50:20:16:42:54:4e:cb:30:c7:a3:35:bb:fd:22:a3:d6: 73:5e:ea:2d:fb:50:39:3b:56:84:bc:3e:d1:cf:62:7c:03:b5: 43:d7:5d:38:b8:cd:39:d1:89:09:23:44:d8:ef:17:ce:e3:5b: 9d:2d:8a:4c:9e:45:81:a2:70:88:db:d5:aa:6c:7b:03:f2:2b: ee:b2:67:2f:62:3e:cf:d1:e2:fd:e4:d0:82:66:00:26:3a:6f: b8:f4:ff:e4:85:4f:de:d5:51:a6:a0:07:ef:33:ab:b5:d1:04: eb:18
This has a subject of an email address – cybergibbon@test.com and my public key. That whole lot is then signed with my private key. This allows the recipient of the CSR to verify that someone with the private key corresponding to the public key has added the data cybergibbon@test.com.
I thought the CA then signed the entire CSR, preserving the subject, and hence also my signature. It turns out that they can actually just re-write the subject and sign it – my signature is no longer involved!
Here is an example certificate received back from the CA:
root@kali:~# openssl x509 -in cybergibbon_at_test.com.crt -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 35242 (0x89aa) Signature Algorithm: sha1WithRSAEncryption Issuer: C=DK, O=HackingTeam Validity Not Before: Jul 6 03:52:32 2015 GMT Not After : Jul 4 01:52:33 2025 GMT Subject: emailAddress=cybergibbons@test.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (1024 bit) Modulus: 00:ea:a9:04:df:20:63:6d:78:8d:a4:c3:8a:7e:b5: a9:38:a7:1d:2a:75:20:90:45:2d:c9:9e:b3:08:18: a9:59:d4:79:95:40:ef:cc:4f:2c:93:73:21:02:05: 9b:47:c4:9b:73:21:a8:fe:da:9c:2c:71:98:f5:49: 37:a7:28:a4:f5:14:6a:a0:91:dd:a7:87:63:d4:b4: 2a:aa:a6:9b:b2:a4:72:ab:91:58:2b:e5:6e:34:84: 05:ce:c8:dc:7f:3c:33:5f:d2:14:27:37:34:ee:aa: 58:29:de:5c:f5:b7:93:69:94:a9:20:02:84:fb:cd: 5e:04:43:56:df:c2:48:f7:41 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 49:85:CB:85:5F:EF:50:A6:2E:E1:B0:95:33:24:77:58:6C:70:C7:62 X509v3 Authority Key Identifier: keyid:65:F1:07:3D:58:53:F3:BE:1C:02:0C:B6:36:E6:3F:95:F5:60:33:E3 Signature Algorithm: sha1WithRSAEncryption 59:73:5f:2c:5c:19:2f:ec:db:3d:38:40:45:ed:72:d9:6b:dc: ac:2e:99:fa:db:ae:59:6f:aa:06:ab:73:4e:06:46:13:71:3f: 81:2e:76:b3:4a:fb:82:cf:4c:d3:43:9f:f4:6f:08:5e:d6:22: 44:c7:5d:e3:fa:5c:83:01:82:03:d5:10:74:17:0b:ed:4d:2f: 4a:72:2e:63:6d:78:7d:2f:dc:62:8d:72:f8:96:05:61:ea:36: a4:b3:81:24:1e:62:12:04:48:f6:d1:ca:27:66:54:94:ec:24: ad:c3:aa:1a:e1:90:1c:f9:5c:ae:0e:ba:c9:94:fe:30:75:50: c1:a3:69:8f:13:25:8f:b1:81:45:08:b9:30:3d:26:9a:0a:6e: bc:74:97:6e:fb:2d:5f:86:21:b5:0c:b1:a0:47:e5:95:d4:24: 8f:f8:ad:52:0b:a6:f7:54:f8:17:06:26:1e:57:47:36:48:49: a8:c6:50:a0:69:4a:c2:8f:35:5c:73:cd:5b:a7:d6:14:e3:30: c6:61:a0:dc:a2:c9:14:67:01:d3:f2:c6:bc:52:44:0e:bb:fc: 60:69:c1:28:63:f7:9b:d6:f9:4c:d9:b7:3a:21:2c:93:7b:8c: e7:f8:ab:62:3c:be:19:d0:e0:94:86:58:71:b7:4f:a5:f6:a3: 16:f8:0a:61
As you can see – there is no notion of my signature in there. The email of cybergibbon@test.com has been altered to cybergibbons@test.com by the CA. This is because my registered email is cybergibbons@test.com.
It’s not very important, but I was initially excited when the CA returned a certificate for an email which I wasn’t registered with as it could have led to an interesting vulnerability. It’s important to note that a certificate issued by a CA can be done so without the owner of the public key being aware.