Trusted Platform Module 2.0 » History » Version 156
Andreas Steffen, 04.01.2021 19:05
1 | 17 | Andreas Steffen | h1. Trusted Platform Module 2.0 |
---|---|---|---|
2 | 1 | Andreas Steffen | |
3 | 6 | Andreas Steffen | {{>toc}} |
4 | 6 | Andreas Steffen | |
5 | 51 | Andreas Steffen | h2. Connect to a TPM 2.0 Device |
6 | 1 | Andreas Steffen | |
7 | 131 | Andreas Steffen | h3. Install TPM 2.0 Software Stack and Tools |
8 | 51 | Andreas Steffen | |
9 | 144 | Andreas Steffen | In order to connect to a TPM 2.0 hardware or firmware device a software stack implementing the "TCG TSS 2.0 System Level API":https://trustedcomputinggroup.org/resource/tcg-tss-2-0-system-level-api-sapi-specification/ is needed. An excellent open source "tpm2-tss":https://github.com/tpm2-software/tpm2-tss library is available from the "tpm2-software":https://github.com/tpm2-software project that also offers a set of "tpm2-tools":https://github.com/tpm2-software/tpm2-tools using the "TCG TSS 2.0 Enhanced System Level API":https://trustedcomputinggroup.org/resource/tcg-tss-2-0-enhanced-system-api-esapi-specification/. |
10 | 1 | Andreas Steffen | |
11 | 89 | Andreas Steffen | When using the latest *strongswan-5.9.1* version with a *Linux 5.4* kernel or newer, we recommend these latest versions: |
12 | 1 | Andreas Steffen | |
13 | 89 | Andreas Steffen | * *tpm2-tss* version 3.0.3: https://github.com/tpm2-software/tpm2-tss/releases/tag/3.0.3 |
14 | 79 | Andreas Steffen | |
15 | 89 | Andreas Steffen | * *tpm2-tools* version 5.0: https://github.com/tpm2-software/tpm2-tools/releases/tag/5.0 |
16 | 79 | Andreas Steffen | |
17 | 90 | Andreas Steffen | Support for earlier strongSwan versions and Linux kernels can be found [[TpmPluginOld|here]]. |
18 | 71 | Andreas Steffen | |
19 | 145 | Andreas Steffen | In order to test if we can connect to the TPM 2.0 device, we list all persistent keys stored in the Non-Volatile (NV) RAM: |
20 | 3 | Andreas Steffen | <pre> |
21 | 91 | Andreas Steffen | tpm2_getcap handles-persistent |
22 | 91 | Andreas Steffen | - 0x81000001 |
23 | 91 | Andreas Steffen | - 0x81000002 |
24 | 91 | Andreas Steffen | - 0x81010001 |
25 | 18 | Andreas Steffen | </pre> |
26 | 1 | Andreas Steffen | |
27 | 146 | Andreas Steffen | The man pages of all *tpm2-tools* functions with their arguments can be found "here":https://github.com/tpm2-software/tpm2-tools/tree/5.0/man. The access to the */dev/tpmrm0* TPM resource manager device requires *root* rights on most Linux platforms. But e.g. with Ubuntu, adding the user to the *tss* group enables direct access to the TPM device: |
28 | 92 | Andreas Steffen | <pre> |
29 | 92 | Andreas Steffen | sudo usermod -a -G tss <username> |
30 | 92 | Andreas Steffen | </pre> |
31 | 96 | Andreas Steffen | |
32 | 51 | Andreas Steffen | h3. Enable the strongSwan tpm Plugin |
33 | 51 | Andreas Steffen | |
34 | 51 | Andreas Steffen | The strongSwan libtpmtss *tpm* plugin and the TSS2 interface are enabled and built with the following options |
35 | 51 | Andreas Steffen | |
36 | 1 | Andreas Steffen | ./configure --enable-tss-tss2 --enable-tpm ... |
37 | 96 | Andreas Steffen | |
38 | 117 | Andreas Steffen | With the strongSwan [[IpsecPki|pki]] tool we can now list the persistent key stored under the handle *0x81010001* |
39 | 96 | Andreas Steffen | <pre> |
40 | 96 | Andreas Steffen | pki --print --type priv --keyid 0x81010001 --debug 2 |
41 | 97 | Andreas Steffen | </pre> |
42 | 98 | Andreas Steffen | With debug level 2 some basic information on the TPM device is shown; A second generation Intel firmware TPM running on the Intel Management Engine is employed. Both SHA1 and SHA256 PCR banks are available: |
43 | 97 | Andreas Steffen | <pre> |
44 | 96 | Andreas Steffen | TPM 2.0 - manufacturer: INTC (Intel) rev: 01.38 2018 |
45 | 96 | Andreas Steffen | TPM 2.0 - algorithms: RSA SHA1 HMAC AES MGF1 KEYEDHASH XOR SHA256 RSASSA RSAES RSAPSS OAEP ECDSA ECDH ECDAA ECSCHNORR KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER CTR OFB CBC CFB ECB |
46 | 96 | Andreas Steffen | TPM 2.0 - ECC curves: NIST_P256 BN_P256 |
47 | 96 | Andreas Steffen | TPM 2.0 - PCR banks: SHA1 SHA256 |
48 | 97 | Andreas Steffen | </pre> |
49 | 99 | Andreas Steffen | Apparently the analyzed persistent key can be used for encryption only because no signature algorithm is defined: |
50 | 97 | Andreas Steffen | <pre> |
51 | 96 | Andreas Steffen | TPM 2.0 via TSS2 v2 available |
52 | 96 | Andreas Steffen | signature algorithm is NULL with ERROR hash |
53 | 97 | Andreas Steffen | </pre> |
54 | 118 | Andreas Steffen | Debug level 2 shows that [[IpsecPki|pki]] extracts the public key from the TPM and converts it into a standard PKCS#1 format: |
55 | 97 | Andreas Steffen | <pre> |
56 | 96 | Andreas Steffen | L0 - subjectPublicKeyInfo: |
57 | 96 | Andreas Steffen | L1 - algorithm: |
58 | 96 | Andreas Steffen | L2 - algorithmIdentifier: |
59 | 96 | Andreas Steffen | L3 - algorithm: |
60 | 96 | Andreas Steffen | 'rsaEncryption' |
61 | 96 | Andreas Steffen | L1 - subjectPublicKey: |
62 | 96 | Andreas Steffen | -- > -- |
63 | 96 | Andreas Steffen | L0 - RSAPublicKey: |
64 | 96 | Andreas Steffen | L1 - modulus: |
65 | 96 | Andreas Steffen | L1 - publicExponent: |
66 | 96 | Andreas Steffen | -- < -- |
67 | 97 | Andreas Steffen | </pre> |
68 | 98 | Andreas Steffen | At the end of the output the fingerprint of the 2048 bit RSA key is listed: |
69 | 97 | Andreas Steffen | <pre> |
70 | 96 | Andreas Steffen | privkey: RSA 2048 bits |
71 | 96 | Andreas Steffen | keyid: ee:c7:bf:5a:de:0f:11:84:2c:86:2b:69:84:ba:65:b9:81:d2:a9:45 |
72 | 1 | Andreas Steffen | subjkey: df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79 |
73 | 97 | Andreas Steffen | </pre> |
74 | 7 | Andreas Steffen | |
75 | 128 | Andreas Steffen | h2. Derive Persistent Endorsement Keys |
76 | 1 | Andreas Steffen | |
77 | 128 | Andreas Steffen | h3. RSA Endorsement Key |
78 | 128 | Andreas Steffen | |
79 | 116 | Andreas Steffen | The "tpm2_createek":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_createek.1.md command derives a 2048 bit RSA Endorsement Key (EK) in a deterministic way from the secret _Endorsement Primary Seed_ *unique* to each TPM device and makes the key persistent in the non-volatile memory of the TPM under the object handle *0x81010002* |
80 | 11 | Andreas Steffen | |
81 | 100 | Andreas Steffen | tpm2_createek -G rsa -c 0x81010002 |
82 | 1 | Andreas Steffen | |
83 | 119 | Andreas Steffen | Using the "tpm2_getcap":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_getcap.1.md command we can check that the newly derived Endorsement Key has been persisted in the NV RAM |
84 | 100 | Andreas Steffen | <pre> |
85 | 100 | Andreas Steffen | tpm2_getcap handles-persistent |
86 | 100 | Andreas Steffen | - 0x81000001 |
87 | 100 | Andreas Steffen | - 0x81000002 |
88 | 100 | Andreas Steffen | - 0x81010001 |
89 | 100 | Andreas Steffen | - 0x81010002 |
90 | 100 | Andreas Steffen | </pre> |
91 | 101 | Andreas Steffen | Listing the key properties shows that the 2048 bit Endorsement Key already exists under the handle *0x81010001* analyzed in the previous section |
92 | 1 | Andreas Steffen | <pre> |
93 | 123 | Andreas Steffen | pki --print --type priv --keyid 0x81010002 |
94 | 100 | Andreas Steffen | TPM 2.0 via TSS2 v2 available |
95 | 100 | Andreas Steffen | signature algorithm is NULL with ERROR hash |
96 | 100 | Andreas Steffen | privkey: RSA 2048 bits |
97 | 100 | Andreas Steffen | keyid: ee:c7:bf:5a:de:0f:11:84:2c:86:2b:69:84:ba:65:b9:81:d2:a9:45 |
98 | 100 | Andreas Steffen | subjkey: df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79 |
99 | 1 | Andreas Steffen | </pre> |
100 | 1 | Andreas Steffen | |
101 | 129 | Andreas Steffen | h3. Delete Persisted Keys |
102 | 126 | Andreas Steffen | |
103 | 119 | Andreas Steffen | We therefore delete the duplicate key with the following "tpm2_evictcontrol":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_evictcontrol.1.md command |
104 | 100 | Andreas Steffen | <pre> |
105 | 100 | Andreas Steffen | tpm2_evictcontrol -c 0x81010002 |
106 | 100 | Andreas Steffen | persistent-handle: 0x81010002 |
107 | 100 | Andreas Steffen | action: evicted |
108 | 100 | Andreas Steffen | </pre> |
109 | 100 | Andreas Steffen | The key removal can be verified with |
110 | 100 | Andreas Steffen | <pre> |
111 | 100 | Andreas Steffen | tpm2_getcap handles-persistent |
112 | 100 | Andreas Steffen | - 0x81000001 |
113 | 102 | Andreas Steffen | - 0x81000002 |
114 | 1 | Andreas Steffen | - 0x81010001 |
115 | 100 | Andreas Steffen | </pre> |
116 | 1 | Andreas Steffen | |
117 | 128 | Andreas Steffen | h3. ECC Endorsement Key |
118 | 103 | Andreas Steffen | |
119 | 120 | Andreas Steffen | Again using the "tpm2_createek":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_createek.1.md command we derive a 256 bit ECC Endorsement Key (EK) in a deterministic way from the secret _Endorsement Primary Seed_ *unique* to each TPM device and make the key persistent in the non-volatile memory of the TPM under the object handle *0x81010002*: |
120 | 103 | Andreas Steffen | |
121 | 103 | Andreas Steffen | tpm2_createek -G ecc -c 0x81010002 -u ek_ecc.pub |
122 | 103 | Andreas Steffen | |
123 | 103 | Andreas Steffen | Optionally we saved the public key in a TPM 2.0 proprietary format in the file *ek_ecc.pub*. The fingerprint of the ECC EK private key can be directly displayed with the command |
124 | 105 | Andreas Steffen | |
125 | 105 | Andreas Steffen | <pre> |
126 | 111 | Andreas Steffen | pki --print --type priv --keyid 0x81010002 |
127 | 104 | Andreas Steffen | TPM 2.0 via TSS2 v2 available |
128 | 104 | Andreas Steffen | signature algorithm is NULL with ERROR hash |
129 | 103 | Andreas Steffen | privkey: ECDSA 256 bits |
130 | 103 | Andreas Steffen | keyid: 25:db:73:13:0f:c9:c8:91:68:30:8e:02:89:c1:0d:65:bd:ad:69:2a |
131 | 103 | Andreas Steffen | subjkey: 9c:b9:fb:b0:32:81:24:82:a7:07:b2:bd:bd:d3:7c:2b:22:7f:74:bf |
132 | 103 | Andreas Steffen | </pre> |
133 | 103 | Andreas Steffen | |
134 | 103 | Andreas Steffen | h2. Endorsement Key Certificates |
135 | 103 | Andreas Steffen | |
136 | 115 | Andreas Steffen | h3. Fetched via URL |
137 | 1 | Andreas Steffen | |
138 | 115 | Andreas Steffen | Endorsement Key certificates issued for Intel firmware TPMs can be automatically downloaded from an Intel web server using the "tpm2_getcertificate":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_getekcertificate.1.md command: |
139 | 115 | Andreas Steffen | |
140 | 112 | Andreas Steffen | tpm2_getekcertificate -o ek_ecc.crt -u ek_ecc.pub |
141 | 106 | Andreas Steffen | |
142 | 121 | Andreas Steffen | For successful retrieval the public key *ek_ecc.pub* in the TPM 2.0 proprietary format is required. Using the [[IpsecPki|pki]] tool we can list the downloaded EK certificate belonging to the ECC key: |
143 | 106 | Andreas Steffen | <pre> |
144 | 106 | Andreas Steffen | pki --print --type x509 --in ek_ecc.crt |
145 | 106 | Andreas Steffen | subject: "" |
146 | 106 | Andreas Steffen | issuer: "C=US, ST=CA, L=Santa Clara, O=Intel Corporation, OU=TPM EK intermediate for CNL_EPID_POST_B1LP_PROD_2 pid:9, CN=www.intel.com" |
147 | 106 | Andreas Steffen | validity: not before Sep 04 02:00:00 2019, ok |
148 | 106 | Andreas Steffen | not after Jan 01 00:59:59 2050, ok (expires in 10600 days) |
149 | 106 | Andreas Steffen | serial: 07:99:3b:c6:88:aa:7d:72:b0:24:24:05:09:01:bb:42:55:70:1a:43 |
150 | 106 | Andreas Steffen | altNames: tcg-at-tpmManufacturer=id:494E5443, tcg-at-tpmModel=CNL, tcg-at-tpmVersion=id:00020000 |
151 | 106 | Andreas Steffen | CRL URIs: https://trustedservices.intel.com/content/CRL/ekcert/CNLEPIDPOSTB1LPPROD2_EK_Device.crl |
152 | 106 | Andreas Steffen | certificatePolicies: |
153 | 106 | Andreas Steffen | 1.2.840.113741.1.5.2.1 |
154 | 106 | Andreas Steffen | CPS: https://trustedservices.intel.com/content/CRL/ekcert/EKcertPolicyStatement.pdf |
155 | 106 | Andreas Steffen | authkeyId: 17:a0:05:75:d0:5e:58:e3:88:12:10:bb:98:b1:04:5b:b4:c3:06:39 |
156 | 106 | Andreas Steffen | subjkeyId: 9c:b9:fb:b0:32:81:24:82:a7:07:b2:bd:bd:d3:7c:2b:22:7f:74:bf |
157 | 106 | Andreas Steffen | pubkey: ECDSA 256 bits |
158 | 106 | Andreas Steffen | keyid: 25:db:73:13:0f:c9:c8:91:68:30:8e:02:89:c1:0d:65:bd:ad:69:2a |
159 | 106 | Andreas Steffen | subjkey: 9c:b9:fb:b0:32:81:24:82:a7:07:b2:bd:bd:d3:7c:2b:22:7f:74:bf |
160 | 106 | Andreas Steffen | </pre> |
161 | 121 | Andreas Steffen | For the RSA 2048 Endorsement Key we first have to extract the public keyfile *ek_rsa.pub* in the TPM 2.0 proprietary format using the "tpm2_readpublic":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_readpublic.1.md command because we forgot to do this in the first place: |
162 | 109 | Andreas Steffen | |
163 | 110 | Andreas Steffen | tpm2_readpublic -Q -c 0x81010001 -o ek_rsa.pub |
164 | 106 | Andreas Steffen | |
165 | 110 | Andreas Steffen | Now we can retrieve the RSA EK certificate, too: |
166 | 106 | Andreas Steffen | |
167 | 114 | Andreas Steffen | tpm2_getekcertificate -o ek_rsa.crt -u ek_rsa.pub |
168 | 106 | Andreas Steffen | |
169 | 106 | Andreas Steffen | and view the contents with |
170 | 106 | Andreas Steffen | <pre> |
171 | 106 | Andreas Steffen | pki --print --type x509 --in ek_rsa.crt |
172 | 106 | Andreas Steffen | subject: "" |
173 | 106 | Andreas Steffen | issuer: "C=US, ST=CA, L=Santa Clara, O=Intel Corporation, OU=TPM EK intermediate for CNL_EPID_POST_B1LP_PROD_2 pid:9, CN=www.intel.com" |
174 | 106 | Andreas Steffen | validity: not before Sep 04 02:00:00 2019, ok |
175 | 106 | Andreas Steffen | not after Jan 01 00:59:59 2050, ok (expires in 10600 days) |
176 | 106 | Andreas Steffen | serial: 14:26:0b:eb:12:a2:82:87:af:3b:75:e0:a1:a4:87:60:72:95:55:92 |
177 | 106 | Andreas Steffen | altNames: tcg-at-tpmManufacturer=id:494E5443, tcg-at-tpmModel=CNL, tcg-at-tpmVersion=id:00020000 |
178 | 106 | Andreas Steffen | CRL URIs: https://trustedservices.intel.com/content/CRL/ekcert/CNLEPIDPOSTB1LPPROD2_EK_Device.crl |
179 | 106 | Andreas Steffen | certificatePolicies: |
180 | 106 | Andreas Steffen | 1.2.840.113741.1.5.2.1 |
181 | 106 | Andreas Steffen | CPS: https://trustedservices.intel.com/content/CRL/ekcert/EKcertPolicyStatement.pdf |
182 | 106 | Andreas Steffen | authkeyId: 17:a0:05:75:d0:5e:58:e3:88:12:10:bb:98:b1:04:5b:b4:c3:06:39 |
183 | 106 | Andreas Steffen | subjkeyId: df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79 |
184 | 106 | Andreas Steffen | pubkey: RSA 2048 bits |
185 | 106 | Andreas Steffen | keyid: ee:c7:bf:5a:de:0f:11:84:2c:86:2b:69:84:ba:65:b9:81:d2:a9:45 |
186 | 106 | Andreas Steffen | subjkey: df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79 |
187 | 1 | Andreas Steffen | </pre> |
188 | 1 | Andreas Steffen | |
189 | 115 | Andreas Steffen | We can easily check that in both EK certificates the key fingerprints (__keyid__ and __subjkey__) match with those of the EK keys persisted in the TPM. |
190 | 115 | Andreas Steffen | |
191 | 115 | Andreas Steffen | h3. Stored in Non-Volatile RAM |
192 | 115 | Andreas Steffen | |
193 | 115 | Andreas Steffen | Most hardware TPMs are shipped with their Endorsement Key Certificates stored in NV RAM. E.g. on an STMicroelectronics TPM device the following data objects are stored in an NV index: |
194 | 115 | Andreas Steffen | <pre> |
195 | 115 | Andreas Steffen | tpm2_getcap handles-nv-index |
196 | 115 | Andreas Steffen | - 0x1410001 |
197 | 115 | Andreas Steffen | - 0x1410002 |
198 | 115 | Andreas Steffen | - 0x1410004 |
199 | 115 | Andreas Steffen | - 0x1880001 |
200 | 115 | Andreas Steffen | - 0x1880011 |
201 | 115 | Andreas Steffen | - 0x1C00002 |
202 | 115 | Andreas Steffen | - 0x1C0000A |
203 | 115 | Andreas Steffen | - 0x1C00012 |
204 | 115 | Andreas Steffen | - 0x1C10102 |
205 | 115 | Andreas Steffen | - 0x1C10103 |
206 | 115 | Andreas Steffen | - 0x1C10104 |
207 | 115 | Andreas Steffen | - 0x1C101C0 |
208 | 115 | Andreas Steffen | </pre> |
209 | 115 | Andreas Steffen | Using the "tpm2_nvreadpublic":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_nvreadpublic.1.md command we can look for large data objects which are prime candidates for X.509 certificates: |
210 | 115 | Andreas Steffen | <pre> |
211 | 115 | Andreas Steffen | tpm2_nvreadpublic |
212 | 115 | Andreas Steffen | ... |
213 | 115 | Andreas Steffen | 0x1c00002: |
214 | 115 | Andreas Steffen | name: 000b5c112bd5f410d0abe96a50e94ff721a005c32567e4b1112ab0a8fb7e0289b7f2 |
215 | 115 | Andreas Steffen | hash algorithm: |
216 | 115 | Andreas Steffen | friendly: sha256 |
217 | 115 | Andreas Steffen | value: 0xB |
218 | 115 | Andreas Steffen | attributes: |
219 | 115 | Andreas Steffen | friendly: ppwrite|writedefine|write_stclear|ppread|ownerread|authread|no_da|written|platformcreate |
220 | 115 | Andreas Steffen | value: 0x1600762 |
221 | 115 | Andreas Steffen | size: 1033 |
222 | 115 | Andreas Steffen | |
223 | 115 | Andreas Steffen | 0x1c0000a: |
224 | 115 | Andreas Steffen | name: 000b1948300e66afad594b7a8e8368d53ddd36908fb2b46dd7b5a88051b50e4047ab |
225 | 115 | Andreas Steffen | hash algorithm: |
226 | 115 | Andreas Steffen | friendly: sha256 |
227 | 115 | Andreas Steffen | value: 0xB |
228 | 115 | Andreas Steffen | attributes: |
229 | 115 | Andreas Steffen | friendly: ppwrite|writedefine|write_stclear|ppread|ownerread|authread|no_da|written|platformcreate |
230 | 115 | Andreas Steffen | value: 0x1600762 |
231 | 115 | Andreas Steffen | size: 639 |
232 | 115 | Andreas Steffen | |
233 | 115 | Andreas Steffen | 0x1c00012: |
234 | 115 | Andreas Steffen | name: 000cde411e123085083eedb1c9312e08dd8d229df6a5e16996035a2e3000d860b372c924de0354a6af4c7886656d2065814f |
235 | 115 | Andreas Steffen | hash algorithm: |
236 | 115 | Andreas Steffen | friendly: sha384 |
237 | 115 | Andreas Steffen | value: 0xC |
238 | 115 | Andreas Steffen | attributes: |
239 | 115 | Andreas Steffen | friendly: ppwrite|writedefine|write_stclear|ppread|ownerread|authread|no_da|written|platformcreate |
240 | 115 | Andreas Steffen | value: 0x1600762 |
241 | 115 | Andreas Steffen | size: 707 |
242 | 115 | Andreas Steffen | ... |
243 | 115 | Andreas Steffen | </pre> |
244 | 130 | Andreas Steffen | We can use [[IpsecPki|pki]] to directly list the properties of the EK certificates: |
245 | 115 | Andreas Steffen | <pre> |
246 | 115 | Andreas Steffen | pki --print --type x509 --keyid 0x01c00002 |
247 | 115 | Andreas Steffen | TPM 2.0 via TSS2 v2 available |
248 | 115 | Andreas Steffen | loaded certificate from TPM NV index 0x01c00002 |
249 | 115 | Andreas Steffen | subject: "" |
250 | 115 | Andreas Steffen | issuer: "C=CH, O=STMicroelectronics NV, CN=STM TPM EK Intermediate CA 06" |
251 | 115 | Andreas Steffen | validity: not before Feb 11 01:00:00 2020, ok |
252 | 115 | Andreas Steffen | not after Jan 01 01:00:00 2031, ok (expires in 3650 days) |
253 | 115 | Andreas Steffen | serial: 72:78:a1:2c:87:b6:aa:45:c4:1f:57:ff:d1:3d:cf:93:42:34:b9:c9 |
254 | 115 | Andreas Steffen | altNames: tcg-at-tpmManufacturer=id:53544D20, tcg-at-tpmModel=ST33HTPHAHD4, tcg-at-tpmVersion=id:00010101 |
255 | 115 | Andreas Steffen | authkeyId: fb:17:d7:0d:73:48:70:e9:19:c4:e8:e6:03:97:5e:66:4e:0e:43:de |
256 | 115 | Andreas Steffen | subjkeyId: e9:3d:51:32:04:42:73:3e:fc:bb:9e:f8:0c:21:9a:53:ec:73:80:94 |
257 | 115 | Andreas Steffen | pubkey: RSA 2048 bits |
258 | 115 | Andreas Steffen | keyid: d3:e3:71:79:df:32:53:34:60:0f:1f:38:dc:d4:6d:53:59:1b:c5:3c |
259 | 115 | Andreas Steffen | subjkey: e9:3d:51:32:04:42:73:3e:fc:bb:9e:f8:0c:21:9a:53:ec:73:80:94 |
260 | 115 | Andreas Steffen | </pre> |
261 | 115 | Andreas Steffen | <pre> |
262 | 115 | Andreas Steffen | pki --print --type x509 --keyid 0x01c0000a |
263 | 115 | Andreas Steffen | TPM 2.0 via TSS2 v2 available |
264 | 115 | Andreas Steffen | loaded certificate from TPM NV index 0x01c0000a |
265 | 115 | Andreas Steffen | subject: "" |
266 | 115 | Andreas Steffen | issuer: "C=CH, O=STMicroelectronics NV, CN=STM TPM ECC Intermediate CA 02" |
267 | 115 | Andreas Steffen | validity: not before Mar 09 01:00:00 2020, ok |
268 | 115 | Andreas Steffen | not after Jan 01 01:00:00 2031, ok (expires in 3650 days) |
269 | 115 | Andreas Steffen | serial: 51:e8:fc:b2:64:8d:1d:36:a5:bc:d7:c9:63:c1:d6:de:e7:25:09:a4 |
270 | 115 | Andreas Steffen | altNames: tcg-at-tpmManufacturer=id:53544D20, tcg-at-tpmModel=ST33HTPHAHD4, tcg-at-tpmVersion=id:00010101 |
271 | 115 | Andreas Steffen | authkeyId: 66:2d:8f:1c:ec:df:f1:47:a8:b6:f0:ea:29:6a:f7:f2:4c:ad:f9:cf |
272 | 115 | Andreas Steffen | subjkeyId: d1:e8:fc:b2:64:8d:1d:36:a5:bc:d7:c9:63:c1:d6:de:e7:25:09:a4 |
273 | 115 | Andreas Steffen | pubkey: ECDSA 256 bits |
274 | 115 | Andreas Steffen | keyid: 8b:62:31:bf:08:9d:39:74:6d:05:fd:35:eb:2e:13:64:12:86:03:16 |
275 | 115 | Andreas Steffen | subjkey: d1:e8:fc:b2:64:8d:1d:36:a5:bc:d7:c9:63:c1:d6:de:e7:25:09:a4 |
276 | 115 | Andreas Steffen | </pre> |
277 | 115 | Andreas Steffen | or we can first retrieve the binary certificate blob from the NV RAM using the "tpm2_nvread":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_nvread.1.md command: |
278 | 115 | Andreas Steffen | |
279 | 115 | Andreas Steffen | tpm2_nvread 0x01c00012 -C o -o ek_ecc384.crt |
280 | 115 | Andreas Steffen | |
281 | 115 | Andreas Steffen | and then list the properties of the EK certificate file: |
282 | 115 | Andreas Steffen | <pre> |
283 | 115 | Andreas Steffen | pki --print --type x509 --in ek_ecc384.crt |
284 | 115 | Andreas Steffen | subject: "" |
285 | 115 | Andreas Steffen | issuer: "C=CH, O=STMicroelectronics NV, CN=STM TPM ECC384 Intermediate CA 01" |
286 | 115 | Andreas Steffen | validity: not before Feb 08 01:00:00 2020, ok |
287 | 115 | Andreas Steffen | not after Jan 01 01:00:00 2031, ok (expires in 3650 days) |
288 | 115 | Andreas Steffen | serial: 39:ed:ae:d4:89:9e:52:08:9f:42:8a:f5:d5:58:7b:50:a6:24:f3:63 |
289 | 115 | Andreas Steffen | altNames: tcg-at-tpmManufacturer=id:53544D20, tcg-at-tpmModel=ST33HTPHAHD4, tcg-at-tpmVersion=id:00010101 |
290 | 115 | Andreas Steffen | authkeyId: bd:96:3e:9a:d5:74:aa:d9:4f:ad:6c:bf:41:6d:d8:5b:4a:55:99:42 |
291 | 115 | Andreas Steffen | subjkeyId: b9:ed:ae:d4:89:9e:52:08:9f:42:8a:f5:d5:58:7b:50:a6:24:f3:63 |
292 | 115 | Andreas Steffen | pubkey: ECDSA 384 bits |
293 | 115 | Andreas Steffen | keyid: 04:68:52:c4:00:ab:10:75:82:57:99:45:1e:7c:12:01:5a:8e:50:c9 |
294 | 1 | Andreas Steffen | subjkey: b9:ed:ae:d4:89:9e:52:08:9f:42:8a:f5:d5:58:7b:50:a6:24:f3:63 |
295 | 1 | Andreas Steffen | </pre> |
296 | 130 | Andreas Steffen | We see that the STMicroelectronics device apparently supports 384 bit ECC keys |
297 | 130 | Andreas Steffen | <pre> |
298 | 130 | Andreas Steffen | TPM 2.0 - manufacturer: STM () rev: 01.38 2018 FIPS 140-2 |
299 | 130 | Andreas Steffen | TPM 2.0 - algorithms: RSA SHA1 HMAC AES MGF1 KEYEDHASH XOR SHA256 SHA384 RSASSA RSAES RSAPSS OAEP ECDSA ECDH ECDAA ECSCHNORR KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER SHA3_256 SHA3_384 CTR OFB CBC CFB ECB |
300 | 130 | Andreas Steffen | TPM 2.0 - ECC curves: NIST_P256 NIST_P384 BN_P256 |
301 | 130 | Andreas Steffen | TPM 2.0 - PCR banks: SHA1 SHA256 |
302 | 130 | Andreas Steffen | </pre> |
303 | 1 | Andreas Steffen | |
304 | 128 | Andreas Steffen | h2. Generate Persistent Attestation Keys |
305 | 107 | Andreas Steffen | |
306 | 128 | Andreas Steffen | h3. RSA Attestation Key |
307 | 128 | Andreas Steffen | |
308 | 133 | Andreas Steffen | A 2048 bit RSA Attestation Key (AK) bound to the RSA EK with handle *0x81010001* can be created with the "tpm2_createak":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_createak.1.md command: |
309 | 25 | Andreas Steffen | |
310 | 124 | Andreas Steffen | tpm2_createak -C 0x81010001 -G rsa -g sha256 -s rsassa -c ak_rsa.ctx -u ak_rsa.pub -n ak_rsa.name |
311 | 1 | Andreas Steffen | |
312 | 124 | Andreas Steffen | and made persistent under the handle *0x81010003* with the "tpm2_evictcontrol":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_evictcontrol.1.md command: |
313 | 124 | Andreas Steffen | <pre> |
314 | 124 | Andreas Steffen | tpm2_evictcontrol -C o -c ak_rsa.ctx 0x81010003 |
315 | 124 | Andreas Steffen | persistent-handle: 0x81010003 |
316 | 124 | Andreas Steffen | action: persisted |
317 | 124 | Andreas Steffen | </pre> |
318 | 125 | Andreas Steffen | The properties of the RSA AK which is a signing key can be displayed with the command |
319 | 124 | Andreas Steffen | <pre> |
320 | 124 | Andreas Steffen | pki --print --type priv --keyid 0x81010003 |
321 | 124 | Andreas Steffen | TPM 2.0 via TSS2 v2 available |
322 | 124 | Andreas Steffen | signature algorithm is RSASSA with SHA256 hash |
323 | 1 | Andreas Steffen | privkey: RSA 2048 bits |
324 | 124 | Andreas Steffen | keyid: df:b7:8f:95:61:8f:70:84:f4:03:e8:7e:83:a6:dd:5f:c5:ff:72:b5 |
325 | 124 | Andreas Steffen | subjkey: 48:82:62:15:74:a2:10:c5:75:70:c2:d6:7d:59:9f:22:d9:4f:9c:07 |
326 | 124 | Andreas Steffen | </pre> |
327 | 13 | Andreas Steffen | |
328 | 128 | Andreas Steffen | h3. ECC Attestation Key |
329 | 84 | Andreas Steffen | |
330 | 132 | Andreas Steffen | A 256 bit ECC Attestation Key (AK) bound to the ECC EK with handle *0x81010002* can be created with the "tpm2_createak":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_createak.1.md command: |
331 | 13 | Andreas Steffen | |
332 | 127 | Andreas Steffen | tpm2_createak -C 0x81010002 -G ecc -g sha256 -s ecdsa -c ak_ecc.ctx -u ak_ecc.pub -n ak_ecc.name |
333 | 1 | Andreas Steffen | |
334 | 127 | Andreas Steffen | and made persistent under the handle *0x81010004* with the "tpm2_evictcontrol":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_evictcontrol.1.md command: |
335 | 127 | Andreas Steffen | <pre> |
336 | 127 | Andreas Steffen | tpm2_evictcontrol -C o -c ak_ecc.ctx 0x81010004 |
337 | 127 | Andreas Steffen | persistent-handle: 0x81010004 |
338 | 127 | Andreas Steffen | action: persisted |
339 | 127 | Andreas Steffen | </pre> |
340 | 127 | Andreas Steffen | The properties of the ECC AK which is a signing key can be displayed with the command |
341 | 127 | Andreas Steffen | <pre> |
342 | 127 | Andreas Steffen | pki --print --type priv --keyid 0x81010004 |
343 | 127 | Andreas Steffen | TPM 2.0 via TSS2 v2 available |
344 | 1 | Andreas Steffen | signature algorithm is ECDSA with SHA256 hash |
345 | 127 | Andreas Steffen | privkey: ECDSA 256 bits |
346 | 1 | Andreas Steffen | keyid: ba:64:37:a4:0e:c8:42:67:8c:55:5a:f9:1b:2a:eb:ff:5f:40:c3:e3 |
347 | 1 | Andreas Steffen | subjkey: cc:83:49:87:2b:9e:f3:cb:b8:35:12:02:87:ff:14:89:28:44:a6:04 |
348 | 127 | Andreas Steffen | </pre> |
349 | 127 | Andreas Steffen | |
350 | 140 | Andreas Steffen | h2. Generate PKCS#10 Certificate Requests |
351 | 1 | Andreas Steffen | |
352 | 128 | Andreas Steffen | h3. RSA Certificate Request |
353 | 128 | Andreas Steffen | |
354 | 140 | Andreas Steffen | The [[IpsecPki|pki]] tool can directly generate a *PKCS#10* certificate request self-signed by the TPM 2.0 private key and containing the corresponding public key as well as the desired end entity identity: |
355 | 127 | Andreas Steffen | <pre> |
356 | 127 | Andreas Steffen | pki --req --type priv --keyid 0x81010003 \ |
357 | 127 | Andreas Steffen | --dn "C=CH, O=strongSec GmbH, OU=AK RSA, CN=edu.strongsec.com" \ |
358 | 127 | Andreas Steffen | --san edu.strongsec.com --outform pem > ak_rsa_req.pem |
359 | 127 | Andreas Steffen | TPM 2.0 via TSS2 v2 available |
360 | 127 | Andreas Steffen | signature algorithm is RSASSA with SHA256 hash |
361 | 127 | Andreas Steffen | Smartcard PIN: <return> |
362 | 1 | Andreas Steffen | </pre> |
363 | 134 | Andreas Steffen | Since we didn't configure a password when creating the AK, just press <return> when prompted for the PIN. With *openssl* we can verify the contents of the generated certificate request: |
364 | 127 | Andreas Steffen | <pre> |
365 | 127 | Andreas Steffen | openssl req -in ak_rsa_req.pem -noout -text |
366 | 127 | Andreas Steffen | Certificate Request: |
367 | 127 | Andreas Steffen | Data: |
368 | 127 | Andreas Steffen | Version: 1 (0x0) |
369 | 127 | Andreas Steffen | Subject: C = CH, O = strongSec GmbH, OU = AK RSA, CN = edu.strongsec.com |
370 | 127 | Andreas Steffen | Subject Public Key Info: |
371 | 127 | Andreas Steffen | Public Key Algorithm: rsaEncryption |
372 | 127 | Andreas Steffen | RSA Public-Key: (2048 bit) |
373 | 127 | Andreas Steffen | Modulus: |
374 | 127 | Andreas Steffen | 00:9e:cc:3c:be:0a:37:86:db:ab:a5:01:49:a4:be: |
375 | 127 | Andreas Steffen | 0f:10:0e:32:50:12:27:64:52:85:0f:21:5e:c7:14: |
376 | 127 | Andreas Steffen | f4:d9:7f:95:0a:22:91:73:9f:60:07:45:d3:8e:4b: |
377 | 127 | Andreas Steffen | 6d:94:00:83:44:ed:9c:f2:c0:14:9c:33:01:46:d0: |
378 | 127 | Andreas Steffen | 78:e4:10:ae:51:3a:9c:c2:b7:a0:c7:04:66:80:bb: |
379 | 127 | Andreas Steffen | c2:bc:02:5b:d6:de:da:93:98:de:a7:cd:a5:5d:c1: |
380 | 127 | Andreas Steffen | 8a:bb:13:8b:d9:21:88:c0:61:40:d2:30:eb:0d:dd: |
381 | 127 | Andreas Steffen | 63:8d:a4:e0:b0:1a:bb:18:7f:6e:62:e1:bf:b3:39: |
382 | 127 | Andreas Steffen | fa:c2:80:32:88:6a:da:f0:24:90:5c:16:b6:bb:30: |
383 | 127 | Andreas Steffen | 5d:96:25:24:cf:f2:03:19:0f:56:58:f2:32:00:51: |
384 | 127 | Andreas Steffen | 8b:0a:c3:15:81:db:34:ee:a4:64:5b:b6:3c:e6:d3: |
385 | 127 | Andreas Steffen | df:e3:16:80:07:0e:13:91:4d:18:9c:b3:fd:ca:72: |
386 | 127 | Andreas Steffen | 78:72:56:e9:13:4c:1d:a2:03:f0:e1:8d:cd:54:1c: |
387 | 127 | Andreas Steffen | 68:ea:46:47:1c:f9:f9:97:7a:f1:59:96:58:6c:d8: |
388 | 127 | Andreas Steffen | 8e:a9:15:fc:4d:93:5d:fa:51:5d:33:5a:bb:77:59: |
389 | 127 | Andreas Steffen | 18:3e:6b:f6:45:f7:92:c2:12:0a:bb:64:af:0b:ff: |
390 | 127 | Andreas Steffen | 0d:08:7a:18:90:d9:10:63:b1:6a:19:78:da:9d:ab: |
391 | 127 | Andreas Steffen | 7a:87 |
392 | 127 | Andreas Steffen | Exponent: 65537 (0x10001) |
393 | 127 | Andreas Steffen | Attributes: |
394 | 127 | Andreas Steffen | Requested Extensions: |
395 | 127 | Andreas Steffen | X509v3 Subject Alternative Name: |
396 | 127 | Andreas Steffen | DNS:edu.strongsec.com |
397 | 127 | Andreas Steffen | Signature Algorithm: sha256WithRSAEncryption |
398 | 127 | Andreas Steffen | 35:89:16:59:fc:ab:64:a9:a1:89:cc:d0:e6:a9:06:19:e1:5e: |
399 | 127 | Andreas Steffen | 11:98:20:ea:ca:f0:5f:06:3c:11:ff:72:98:96:92:08:91:68: |
400 | 127 | Andreas Steffen | d8:bd:e6:05:ed:ef:49:cf:22:6d:da:ab:2c:10:a7:df:59:a3: |
401 | 127 | Andreas Steffen | 0e:e4:bf:f6:8a:62:0b:28:eb:62:89:d0:50:d0:df:2f:5a:2d: |
402 | 127 | Andreas Steffen | 39:c6:7b:ac:34:6c:85:93:be:0d:9b:70:15:47:73:2f:00:da: |
403 | 127 | Andreas Steffen | 52:e3:65:c2:02:f9:88:0f:b8:f5:24:dc:db:43:15:fe:bc:8c: |
404 | 1 | Andreas Steffen | 98:96:81:aa:6d:aa:4c:6e:38:a2:89:27:5c:8d:27:5d:16:1a: |
405 | 1 | Andreas Steffen | fa:3b:e7:81:69:58:db:a9:9a:c7:ea:06:d2:1c:13:ba:ee:92: |
406 | 18 | Andreas Steffen | a4:8a:64:e3:5f:19:2c:d3:54:4f:3c:da:52:fc:9a:35:72:5c: |
407 | 18 | Andreas Steffen | a9:d4:93:7c:e3:69:08:2b:fb:4e:35:84:7e:e3:eb:95:86:2e: |
408 | 1 | Andreas Steffen | 5b:e5:01:c1:69:53:86:f9:6b:38:31:83:97:76:8b:ba:3d:9c: |
409 | 18 | Andreas Steffen | 28:5b:84:b0:9b:e9:91:8b:db:9e:4d:3b:03:db:f4:84:a6:8d: |
410 | 18 | Andreas Steffen | b2:18:9f:3a:3e:f9:36:64:15:98:4f:69:37:6b:9e:b2:92:a0: |
411 | 18 | Andreas Steffen | 9c:ab:05:35:65:28:b8:df:92:4b:fe:d1:40:6d:05:e2:4f:4e: |
412 | 18 | Andreas Steffen | 75:15:8c:22 |
413 | 18 | Andreas Steffen | </pre> |
414 | 18 | Andreas Steffen | |
415 | 128 | Andreas Steffen | h3. ECC Certificate Request |
416 | 18 | Andreas Steffen | |
417 | 135 | Andreas Steffen | We repeat the same for the ECC Attestation Key: |
418 | 18 | Andreas Steffen | <pre> |
419 | 128 | Andreas Steffen | pki --req --type priv --keyid 0x81010004 \ |
420 | 128 | Andreas Steffen | --dn "C=CH, O=strongSec GmbH, OU=AK ECC, CN=edu.strongsec.com" \ |
421 | 128 | Andreas Steffen | --san edu.strongsec.com --outform pem > ak_ecc_req.pem |
422 | 128 | Andreas Steffen | TPM 2.0 via TSS2 v2 available |
423 | 128 | Andreas Steffen | signature algorithm is ECDSA with SHA256 hash |
424 | 128 | Andreas Steffen | Smartcard PIN: <return> |
425 | 1 | Andreas Steffen | </pre> |
426 | 135 | Andreas Steffen | and verify that the certificate request has been self-signed by the ECC AK private-key: |
427 | 128 | Andreas Steffen | <pre> |
428 | 128 | Andreas Steffen | openssl req -in ak_ecc_req.pem -noout -text |
429 | 128 | Andreas Steffen | Certificate Request: |
430 | 128 | Andreas Steffen | Data: |
431 | 128 | Andreas Steffen | Version: 1 (0x0) |
432 | 128 | Andreas Steffen | Subject: C = CH, O = strongSec GmbH, OU = AK ECC, CN = edu.strongsec.com |
433 | 128 | Andreas Steffen | Subject Public Key Info: |
434 | 128 | Andreas Steffen | Public Key Algorithm: id-ecPublicKey |
435 | 128 | Andreas Steffen | Public-Key: (256 bit) |
436 | 128 | Andreas Steffen | pub: |
437 | 128 | Andreas Steffen | 04:80:e7:cd:47:9e:c7:71:08:98:82:22:ed:99:1f: |
438 | 128 | Andreas Steffen | 40:50:bd:44:da:a1:ca:ac:0b:e2:13:7f:f3:ae:63: |
439 | 128 | Andreas Steffen | 99:61:74:a2:b6:15:ae:5c:27:9e:bd:f2:27:91:95: |
440 | 128 | Andreas Steffen | d1:ee:8f:99:93:ca:7b:4e:4e:87:a1:00:9e:94:24: |
441 | 128 | Andreas Steffen | b1:13:d1:11:2c |
442 | 128 | Andreas Steffen | ASN1 OID: prime256v1 |
443 | 128 | Andreas Steffen | NIST CURVE: P-256 |
444 | 128 | Andreas Steffen | Attributes: |
445 | 128 | Andreas Steffen | Requested Extensions: |
446 | 128 | Andreas Steffen | X509v3 Subject Alternative Name: |
447 | 128 | Andreas Steffen | DNS:edu.strongsec.com |
448 | 128 | Andreas Steffen | Signature Algorithm: ecdsa-with-SHA256 |
449 | 128 | Andreas Steffen | 30:46:02:21:00:a0:3a:98:28:79:4b:bf:bd:90:92:d0:86:a2: |
450 | 128 | Andreas Steffen | 69:34:9c:61:6b:87:8e:d0:30:8b:69:b0:94:bd:20:1a:c2:d8: |
451 | 128 | Andreas Steffen | e8:02:21:00:8e:e1:3d:5a:84:69:a1:dc:eb:c3:68:7d:80:7c: |
452 | 128 | Andreas Steffen | 3b:73:c8:40:08:a2:88:56:94:03:9f:49:52:60:40:a1:9a:9f |
453 | 41 | Andreas Steffen | </pre> |
454 | 41 | Andreas Steffen | |
455 | 136 | Andreas Steffen | h2. Issuing Attestion Key Certificates |
456 | 1 | Andreas Steffen | |
457 | 136 | Andreas Steffen | h3. Certification Authority |
458 | 136 | Andreas Steffen | |
459 | 136 | Andreas Steffen | X.509 end entity certificates have to be signed by an in-house or official external __Certification Authority__ (CA). In our example we are using the *strongSec 2016 Root CA* which was generated in 2016 with the [[IpsecPki|pki]] command |
460 | 1 | Andreas Steffen | <pre> |
461 | 136 | Andreas Steffen | pki --gen --type rsa --size 4096 --outform pem > cakey.pem |
462 | 1 | Andreas Steffen | </pre> |
463 | 136 | Andreas Steffen | creating a 4096 bit RSA key pair and then creating a self-signed CA certificate with a lifetime of 10 years |
464 | 136 | Andreas Steffen | <pre> |
465 | 136 | Andreas Steffen | pki --self --ca --type rsa --in cakey.pem --dn="C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" --lifetime 3652 --outform pem > cacert.pem |
466 | 136 | Andreas Steffen | </pre> |
467 | 136 | Andreas Steffen | as the following listing shows: |
468 | 136 | Andreas Steffen | <pre> |
469 | 136 | Andreas Steffen | pki --print --type x509 --in cacert.pem |
470 | 136 | Andreas Steffen | subject: "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
471 | 136 | Andreas Steffen | issuer: "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
472 | 136 | Andreas Steffen | validity: not before Sep 02 10:25:01 2016, ok |
473 | 136 | Andreas Steffen | not after Sep 02 10:25:01 2026, ok (expires in 2067 days) |
474 | 136 | Andreas Steffen | serial: 7c:24:43:4b:b7:dc:ef:7e |
475 | 136 | Andreas Steffen | flags: CA CRLSign self-signed |
476 | 136 | Andreas Steffen | subjkeyId: 6d:c2:af:37:49:41:b9:fd:f4:45:8b:aa:e0:03:3b:b9:e5:7b:9c:b5 |
477 | 136 | Andreas Steffen | pubkey: RSA 4096 bits |
478 | 136 | Andreas Steffen | keyid: 6c:79:f3:7a:b0:df:ac:69:03:b2:ac:6a:ed:82:3a:d2:66:93:b1:21 |
479 | 136 | Andreas Steffen | subjkey: 6d:c2:af:37:49:41:b9:fd:f4:45:8b:aa:e0:03:3b:b9:e5:7b:9c:b5 |
480 | 136 | Andreas Steffen | </pre> |
481 | 1 | Andreas Steffen | |
482 | 1 | Andreas Steffen | h3. RSA Attestation Key Certificate |
483 | 136 | Andreas Steffen | |
484 | 138 | Andreas Steffen | The PKCS#10 certificate request exported from the TPM is used to generate an RSA Attestation Key certificate signed by the Root CA: |
485 | 1 | Andreas Steffen | <pre> |
486 | 137 | Andreas Steffen | pki --issue --cacert cacert.pem --cakey cakey.pem -type pkcs10 --in ak_rsa_req.pem --dn "C=CH, O=strongSec GmbH, OU=AK RSA, CN=edu.strongsec.com" --san "edu.strongsec.com" --crl http://www.strongsec.com/ca/strongsec.crl --flag serverAuth --lifetime 1827 > ak_rsa_cert.der |
487 | 137 | Andreas Steffen | </pre> |
488 | 137 | Andreas Steffen | having the following content |
489 | 137 | Andreas Steffen | <pre> |
490 | 136 | Andreas Steffen | pki --print --type x509 --in ak_rsa_cert.der |
491 | 136 | Andreas Steffen | subject: "C=CH, O=strongSec GmbH, OU=AK RSA, CN=edu.strongsec.com" |
492 | 136 | Andreas Steffen | issuer: "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
493 | 136 | Andreas Steffen | validity: not before Dec 23 15:26:22 2020, ok |
494 | 147 | Andreas Steffen | not after Dec 23 15:26:22 2025, ok (expires in 1814 days) |
495 | 1 | Andreas Steffen | serial: 79:e5:74:2f:a4:df:b8:d2 |
496 | 136 | Andreas Steffen | altNames: edu.strongsec.com |
497 | 136 | Andreas Steffen | flags: serverAuth |
498 | 147 | Andreas Steffen | CRL URIs: http://www.strongsec.com/ca/strongsec.crl |
499 | 136 | Andreas Steffen | authkeyId: 6d:c2:af:37:49:41:b9:fd:f4:45:8b:aa:e0:03:3b:b9:e5:7b:9c:b5 |
500 | 136 | Andreas Steffen | subjkeyId: 48:82:62:15:74:a2:10:c5:75:70:c2:d6:7d:59:9f:22:d9:4f:9c:07 |
501 | 136 | Andreas Steffen | pubkey: RSA 2048 bits |
502 | 136 | Andreas Steffen | keyid: df:b7:8f:95:61:8f:70:84:f4:03:e8:7e:83:a6:dd:5f:c5:ff:72:b5 |
503 | 1 | Andreas Steffen | subjkey: 48:82:62:15:74:a2:10:c5:75:70:c2:d6:7d:59:9f:22:d9:4f:9c:07 |
504 | 1 | Andreas Steffen | </pre> |
505 | 1 | Andreas Steffen | |
506 | 1 | Andreas Steffen | h3. ECC Attestation Key Certificate |
507 | 138 | Andreas Steffen | |
508 | 138 | Andreas Steffen | The second PKCS#10 certificate request exported from the TPM is used to generate an ECC Attestation Key certificate signed by the Root CA: |
509 | 1 | Andreas Steffen | <pre> |
510 | 139 | Andreas Steffen | pki --issue --cacert cacert.pem --cakey cakey.pem -type pkcs10 --in ak_ecc_req.pem --dn "C=CH, O=strongSec GmbH, OU=AK ECC, CN=edu.strongsec.com" --san "edu.strongsec.com" --crl http://www.strongsec.com/ca/strongsec.crl --flag serverAuth --lifetime 1827 > ak_ecc_cert.der |
511 | 137 | Andreas Steffen | </pre> |
512 | 137 | Andreas Steffen | having the following content |
513 | 137 | Andreas Steffen | <pre> |
514 | 136 | Andreas Steffen | pki --print --type x509 --in ak_ecc_cert.der |
515 | 136 | Andreas Steffen | subject: "C=CH, O=strongSec GmbH, OU=AK ECC, CN=edu.strongsec.com" |
516 | 136 | Andreas Steffen | issuer: "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
517 | 136 | Andreas Steffen | validity: not before Dec 23 15:27:40 2020, ok |
518 | 148 | Andreas Steffen | not after Dec 23 15:27:40 2025, ok (expires in 1814 days) |
519 | 49 | Andreas Steffen | serial: 65:fd:5b:98:47:11:f6:45 |
520 | 47 | Andreas Steffen | altNames: edu.strongsec.com |
521 | 49 | Andreas Steffen | flags: serverAuth |
522 | 148 | Andreas Steffen | CRL URIs: http://www.strongsec.com/ca/strongsec.crl |
523 | 47 | Andreas Steffen | authkeyId: 6d:c2:af:37:49:41:b9:fd:f4:45:8b:aa:e0:03:3b:b9:e5:7b:9c:b5 |
524 | 47 | Andreas Steffen | subjkeyId: cc:83:49:87:2b:9e:f3:cb:b8:35:12:02:87:ff:14:89:28:44:a6:04 |
525 | 54 | Andreas Steffen | pubkey: ECDSA 256 bits |
526 | 1 | Andreas Steffen | keyid: ba:64:37:a4:0e:c8:42:67:8c:55:5a:f9:1b:2a:eb:ff:5f:40:c3:e3 |
527 | 1 | Andreas Steffen | subjkey: cc:83:49:87:2b:9e:f3:cb:b8:35:12:02:87:ff:14:89:28:44:a6:04 |
528 | 1 | Andreas Steffen | </pre> |
529 | 54 | Andreas Steffen | |
530 | 138 | Andreas Steffen | h3. Storing Certificates in the NV RAM |
531 | 54 | Andreas Steffen | |
532 | 138 | Andreas Steffen | A TPM 2.0 has a certain amount of Non Volatile Random Access Memory (NV RAM) that can be used to store arbitrary data, e.g. the X.509 certificates matching the persistent keys. If both the certificates and keys are persisted in the TPM then the system disk of the host can be reformatted at any time without loosing the machine or user credentials.As with smartcards the needed amount of memory must be reserved first so we check the size of the X.509 ECC certificate |
533 | 1 | Andreas Steffen | <pre> |
534 | 137 | Andreas Steffen | ls -l ak_ecc_cert.der |
535 | 137 | Andreas Steffen | -rw-rw-r-- 1 andi andi 1001 Dez 23 15:31 ak_ecc_cert.der |
536 | 54 | Andreas Steffen | </pre> |
537 | 54 | Andreas Steffen | |
538 | 140 | Andreas Steffen | The "tpm2_nvdefine":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_nvdefine.1.md command allocates a memory location with a size of 1001 bytes that can be accessed via the handle *0x01800004* which is also called the NV index |
539 | 1 | Andreas Steffen | <pre> |
540 | 137 | Andreas Steffen | tpm2_nvdefine 0x01800004 -C o -s 1001 -a 0x2000A |
541 | 137 | Andreas Steffen | nv-index: 0x1800004 |
542 | 62 | Andreas Steffen | </pre> |
543 | 1 | Andreas Steffen | |
544 | 140 | Andreas Steffen | Then we write the certificate file to the NV RAM destination using the "tpm2_nvwrite":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_nvwrite.1.md command: |
545 | 1 | Andreas Steffen | <pre> |
546 | 1 | Andreas Steffen | tpm2_nvwrite 0x01800004 -C o -i ak_ecc_cert.der |
547 | 137 | Andreas Steffen | </pre> |
548 | 1 | Andreas Steffen | |
549 | 140 | Andreas Steffen | h3. Removing Certificates from NV RAM |
550 | 1 | Andreas Steffen | |
551 | 149 | Andreas Steffen | First we store the RSA AK certificate in the NV RAM under the handle *0x0180003*, again by first determining the size of the object to be persisted: |
552 | 1 | Andreas Steffen | <pre> |
553 | 140 | Andreas Steffen | ls -l ak_rsa_cert.der |
554 | 140 | Andreas Steffen | -rw-rw-r-- 1 andi andi 1204 Dez 23 15:30 ak_rsa_cert.der |
555 | 1 | Andreas Steffen | </pre> |
556 | 141 | Andreas Steffen | allocating space for it |
557 | 140 | Andreas Steffen | <pre> |
558 | 140 | Andreas Steffen | tpm2_nvdefine 0x01800003 -C o -s 1204 -a 0x2000A |
559 | 140 | Andreas Steffen | nv-index: 0x1800003 |
560 | 1 | Andreas Steffen | </pre> |
561 | 141 | Andreas Steffen | and finally storing the certificate |
562 | 140 | Andreas Steffen | <pre> |
563 | 140 | Andreas Steffen | tpm2_nvwrite 0x01800003 -C o -i ak_rsa_cert.der |
564 | 140 | Andreas Steffen | </pre> |
565 | 150 | Andreas Steffen | We decide to use the RSA AK certificate externally, though. Thus we release the memory assigned to NV index *0x01800003* via the "tpm2_nvundefine":https://github.com/tpm2-software/tpm2-tools/blob/5.0/man/tpm2_nvundefine.1.md command: |
566 | 140 | Andreas Steffen | <pre> |
567 | 141 | Andreas Steffen | tpm2_nvundefine 0x01800003 -C o |
568 | 140 | Andreas Steffen | </pre> |
569 | 46 | Andreas Steffen | |
570 | 152 | Andreas Steffen | h2. Using TPM 2.0 Keys with strongSwan |
571 | 1 | Andreas Steffen | |
572 | 152 | Andreas Steffen | h3. Configure Private Key Access |
573 | 1 | Andreas Steffen | |
574 | 151 | Andreas Steffen | Configuration of TPM 2.0 private key access as tokens in the secrets section of *swanctl.conf* |
575 | 151 | Andreas Steffen | |
576 | 1 | Andreas Steffen | secrets { |
577 | 46 | Andreas Steffen | token_ak_rsa { |
578 | 143 | Andreas Steffen | handle = 0x81010003 |
579 | 30 | Andreas Steffen | } |
580 | 30 | Andreas Steffen | token_ak_ecc { |
581 | 30 | Andreas Steffen | handle = 0x81010004 |
582 | 1 | Andreas Steffen | } |
583 | 1 | Andreas Steffen | } |
584 | 30 | Andreas Steffen | |
585 | 151 | Andreas Steffen | h3. Define IPsec Connection |
586 | 30 | Andreas Steffen | |
587 | 1 | Andreas Steffen | This connection configuration in *swanctl.conf* references the ECC AK certificate used for client authentication via its handle, i.e. the NV index |
588 | 1 | Andreas Steffen | <pre> |
589 | 1 | Andreas Steffen | connections { |
590 | 151 | Andreas Steffen | host { |
591 | 151 | Andreas Steffen | remote_addrs = 10.10.1.43 |
592 | 58 | Andreas Steffen | |
593 | 30 | Andreas Steffen | local { |
594 | 1 | Andreas Steffen | auth = pubkey |
595 | 151 | Andreas Steffen | certs-tpm { |
596 | 1 | Andreas Steffen | handle = 0x01800004 |
597 | 30 | Andreas Steffen | } |
598 | 151 | Andreas Steffen | id = edu.strongsec.com |
599 | 1 | Andreas Steffen | } |
600 | 30 | Andreas Steffen | remote { |
601 | 30 | Andreas Steffen | auth = pubkey |
602 | 151 | Andreas Steffen | id = mijas.strongsec.com |
603 | 1 | Andreas Steffen | } |
604 | 1 | Andreas Steffen | children { |
605 | 151 | Andreas Steffen | host { |
606 | 151 | Andreas Steffen | esp_proposals = aes256gcm128-x25519 |
607 | 30 | Andreas Steffen | } |
608 | 30 | Andreas Steffen | } |
609 | 1 | Andreas Steffen | version = 2 |
610 | 151 | Andreas Steffen | proposals = aes256-sha256-x25519 |
611 | 30 | Andreas Steffen | } |
612 | 1 | Andreas Steffen | } |
613 | 1 | Andreas Steffen | </pre> |
614 | 30 | Andreas Steffen | |
615 | 151 | Andreas Steffen | h3. Starting the strongSwan Daemon |
616 | 30 | Andreas Steffen | |
617 | 29 | Andreas Steffen | <pre> |
618 | 151 | Andreas Steffen | sudo systemctl start strongswan-swanctl |
619 | 29 | Andreas Steffen | </pre> |
620 | 44 | Andreas Steffen | |
621 | 44 | Andreas Steffen | <pre> |
622 | 151 | Andreas Steffen | Jan 04 15:18:38 edu systemd[1]: Starting strongSwan IPsec IKEv1/IKEv2 daemon using swanctl... |
623 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: loaded plugins: charon-systemd random nonce drbg x509 revocation constraints pubkey pkcs1 pkcs8 pkcs12 pem openssl curl tpm kernel-netl> |
624 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: spawning 16 worker threads |
625 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: loaded certificate 'C=CH, O=strongSec GmbH, OU=AK RSA, CN=edu.strongsec.com' |
626 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: loaded certificate 'C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA' |
627 | 1 | Andreas Steffen | </pre> |
628 | 1 | Andreas Steffen | |
629 | 151 | Andreas Steffen | The RSA AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 TSS interface |
630 | 1 | Andreas Steffen | <pre> |
631 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: TPM 2.0 via TSS2 v2 available |
632 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: signature algorithm is RSASSA with SHA256 hash |
633 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: loaded RSA private key from token |
634 | 151 | Andreas Steffen | </pre> |
635 | 1 | Andreas Steffen | |
636 | 151 | Andreas Steffen | The ECC AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 TSS interface |
637 | 59 | Andreas Steffen | <pre> |
638 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: TPM 2.0 via TSS2 v2 available |
639 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: signature algorithm is ECDSA with SHA256 hash |
640 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: loaded ECDSA private key from token |
641 | 1 | Andreas Steffen | </pre> |
642 | 44 | Andreas Steffen | |
643 | 151 | Andreas Steffen | The ECC AK certificate is loaded by the *charon-systemd* daemon via the TPM 2.0 TSS interface |
644 | 1 | Andreas Steffen | <pre> |
645 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: TPM 2.0 via TSS2 v2 available |
646 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: loaded certificate from TPM NV index 0x01800004 |
647 | 1 | Andreas Steffen | </pre> |
648 | 1 | Andreas Steffen | |
649 | 154 | Andreas Steffen | The connection definition is received by the *charon-systemd* daemon triggered by the [[Swanctl|swanctl --load-conns]] command via the VICI interface |
650 | 1 | Andreas Steffen | <pre> |
651 | 151 | Andreas Steffen | Jan 04 15:18:38 edu charon-systemd[648407]: added vici connection: host |
652 | 1 | Andreas Steffen | </pre> |
653 | 1 | Andreas Steffen | |
654 | 154 | Andreas Steffen | The [[Swanctl|swanctl]] command line tool reports its actions |
655 | 1 | Andreas Steffen | <pre> |
656 | 151 | Andreas Steffen | Jan 04 15:18:38 edu swanctl[648429]: loaded certificate from '/etc/swanctl/x509/ak_rsa_cert.der' |
657 | 151 | Andreas Steffen | Jan 04 15:18:38 edu swanctl[648429]: loaded certificate from '/etc/swanctl/x509ca/cacert.pem' |
658 | 151 | Andreas Steffen | Jan 04 15:18:38 edu swanctl[648429]: loaded key token_ak_rsa from token [keyid: 4882621574a210c57570c2d67d599f22d94f9c07] |
659 | 151 | Andreas Steffen | Jan 04 15:18:38 edu swanctl[648429]: loaded key token_ak_ecc from token [keyid: cc8349872b9ef3cbb835120287ff14892844a604] |
660 | 151 | Andreas Steffen | Jan 04 15:18:38 edu swanctl[648429]: loaded connection 'host' |
661 | 151 | Andreas Steffen | Jan 04 15:18:38 edu swanctl[648429]: successfully loaded 1 connections, 0 unloaded |
662 | 1 | Andreas Steffen | </pre> |
663 | 1 | Andreas Steffen | |
664 | 1 | Andreas Steffen | <pre> |
665 | 151 | Andreas Steffen | Jan 04 15:18:38 edu systemd[1]: Started strongSwan IPsec IKEv1/IKEv2 daemon using swanctl. |
666 | 1 | Andreas Steffen | </pre> |
667 | 44 | Andreas Steffen | |
668 | 154 | Andreas Steffen | The following [[Swanctl|swanctl]] command shows the loaded connection definition |
669 | 31 | Andreas Steffen | <pre> |
670 | 31 | Andreas Steffen | swanctl --list-conns |
671 | 31 | Andreas Steffen | </pre> |
672 | 31 | Andreas Steffen | |
673 | 31 | Andreas Steffen | <pre> |
674 | 151 | Andreas Steffen | host: IKEv2, no reauthentication, rekeying every 14400s |
675 | 151 | Andreas Steffen | local: %any |
676 | 151 | Andreas Steffen | remote: 10.10.1.43 |
677 | 1 | Andreas Steffen | local public key authentication: |
678 | 151 | Andreas Steffen | id: edu.strongsec.com |
679 | 151 | Andreas Steffen | certs: C=CH, O=strongSec GmbH, OU=AK ECC, CN=edu.strongsec.com |
680 | 32 | Andreas Steffen | remote public key authentication: |
681 | 151 | Andreas Steffen | id: mijas.strongsec.com |
682 | 151 | Andreas Steffen | host: TUNNEL, rekeying every 3600s |
683 | 32 | Andreas Steffen | local: dynamic |
684 | 32 | Andreas Steffen | remote: dynamic |
685 | 32 | Andreas Steffen | </pre> |
686 | 32 | Andreas Steffen | |
687 | 45 | Andreas Steffen | The loaded certificates can also be displayed |
688 | 32 | Andreas Steffen | <pre> |
689 | 40 | Andreas Steffen | swanctl --list-certs |
690 | 40 | Andreas Steffen | </pre> |
691 | 32 | Andreas Steffen | |
692 | 32 | Andreas Steffen | You can clearly see that the connection between the AK certificates and their matching AK private key has been established (..., has private key) |
693 | 32 | Andreas Steffen | <pre> |
694 | 32 | Andreas Steffen | List of X.509 End Entity Certificates |
695 | 32 | Andreas Steffen | |
696 | 151 | Andreas Steffen | subject: "C=CH, O=strongSec GmbH, OU=AK ECC, CN=edu.strongsec.com" |
697 | 151 | Andreas Steffen | issuer: "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
698 | 151 | Andreas Steffen | validity: not before Dec 23 15:27:40 2020, ok |
699 | 151 | Andreas Steffen | not after Dec 23 15:27:40 2025, ok (expires in 1814 days) |
700 | 151 | Andreas Steffen | serial: 65:fd:5b:98:47:11:f6:45 |
701 | 151 | Andreas Steffen | altNames: edu.strongsec.com |
702 | 151 | Andreas Steffen | flags: serverAuth |
703 | 151 | Andreas Steffen | CRL URIs: http://www.strongsec.com/ca/strongsec.crl |
704 | 151 | Andreas Steffen | authkeyId: 6d:c2:af:37:49:41:b9:fd:f4:45:8b:aa:e0:03:3b:b9:e5:7b:9c:b5 |
705 | 151 | Andreas Steffen | subjkeyId: cc:83:49:87:2b:9e:f3:cb:b8:35:12:02:87:ff:14:89:28:44:a6:04 |
706 | 32 | Andreas Steffen | pubkey: ECDSA 256 bits, has private key |
707 | 151 | Andreas Steffen | keyid: ba:64:37:a4:0e:c8:42:67:8c:55:5a:f9:1b:2a:eb:ff:5f:40:c3:e3 |
708 | 151 | Andreas Steffen | subjkey: cc:83:49:87:2b:9e:f3:cb:b8:35:12:02:87:ff:14:89:28:44:a6:04 |
709 | 151 | Andreas Steffen | |
710 | 151 | Andreas Steffen | subject: "C=CH, O=strongSec GmbH, OU=AK RSA, CN=edu.strongsec.com" |
711 | 151 | Andreas Steffen | issuer: "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
712 | 151 | Andreas Steffen | validity: not before Dec 23 15:26:22 2020, ok |
713 | 151 | Andreas Steffen | not after Dec 23 15:26:22 2025, ok (expires in 1813 days) |
714 | 151 | Andreas Steffen | serial: 79:e5:74:2f:a4:df:b8:d2 |
715 | 151 | Andreas Steffen | altNames: edu.strongsec.com |
716 | 151 | Andreas Steffen | flags: serverAuth |
717 | 151 | Andreas Steffen | CRL URIs: http://www.strongsec.com/ca/strongsec.crl |
718 | 151 | Andreas Steffen | authkeyId: 6d:c2:af:37:49:41:b9:fd:f4:45:8b:aa:e0:03:3b:b9:e5:7b:9c:b5 |
719 | 151 | Andreas Steffen | subjkeyId: 48:82:62:15:74:a2:10:c5:75:70:c2:d6:7d:59:9f:22:d9:4f:9c:07 |
720 | 151 | Andreas Steffen | pubkey: RSA 2048 bits, has private key |
721 | 151 | Andreas Steffen | keyid: df:b7:8f:95:61:8f:70:84:f4:03:e8:7e:83:a6:dd:5f:c5:ff:72:b5 |
722 | 151 | Andreas Steffen | subjkey: 48:82:62:15:74:a2:10:c5:75:70:c2:d6:7d:59:9f:22:d9:4f:9c:07 |
723 | 32 | Andreas Steffen | </pre> |
724 | 32 | Andreas Steffen | |
725 | 32 | Andreas Steffen | <pre> |
726 | 32 | Andreas Steffen | List of X.509 CA Certificates |
727 | 32 | Andreas Steffen | |
728 | 151 | Andreas Steffen | subject: "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
729 | 151 | Andreas Steffen | issuer: "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
730 | 151 | Andreas Steffen | validity: not before Sep 02 10:25:01 2016, ok |
731 | 151 | Andreas Steffen | not after Sep 02 10:25:01 2026, ok (expires in 2066 days) |
732 | 151 | Andreas Steffen | serial: 7c:24:43:4b:b7:dc:ef:7e |
733 | 151 | Andreas Steffen | flags: CA CRLSign self-signed |
734 | 151 | Andreas Steffen | subjkeyId: 6d:c2:af:37:49:41:b9:fd:f4:45:8b:aa:e0:03:3b:b9:e5:7b:9c:b5 |
735 | 151 | Andreas Steffen | pubkey: RSA 4096 bits |
736 | 151 | Andreas Steffen | keyid: 6c:79:f3:7a:b0:df:ac:69:03:b2:ac:6a:ed:82:3a:d2:66:93:b1:21 |
737 | 151 | Andreas Steffen | subjkey: 6d:c2:af:37:49:41:b9:fd:f4:45:8b:aa:e0:03:3b:b9:e5:7b:9c:b5 |
738 | 33 | Andreas Steffen | </pre> |
739 | 33 | Andreas Steffen | |
740 | 151 | Andreas Steffen | h3. Initiating IKEv2 Connection |
741 | 33 | Andreas Steffen | |
742 | 151 | Andreas Steffen | Next we initiate the "host" connection |
743 | 33 | Andreas Steffen | <pre> |
744 | 151 | Andreas Steffen | swanctl --initiate --child host |
745 | 33 | Andreas Steffen | </pre> |
746 | 33 | Andreas Steffen | |
747 | 33 | Andreas Steffen | <pre> |
748 | 151 | Andreas Steffen | [IKE] initiating IKE_SA host[1] to 10.10.1.43 |
749 | 151 | Andreas Steffen | [ENC] generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ] |
750 | 151 | Andreas Steffen | [NET] sending packet: from 10.10.1.33[500] to 10.10.1.43[500] (240 bytes) |
751 | 151 | Andreas Steffen | [NET] received packet: from 10.10.1.43[500] to 10.10.1.33[500] (293 bytes) |
752 | 151 | Andreas Steffen | [ENC] parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ] |
753 | 151 | Andreas Steffen | [CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519 |
754 | 151 | Andreas Steffen | [IKE] received cert request for "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
755 | 151 | Andreas Steffen | [IKE] sending cert request for "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
756 | 155 | Andreas Steffen | </pre> |
757 | 33 | Andreas Steffen | |
758 | 151 | Andreas Steffen | The ECC AK private key stored in the TPM 2.0 is used to generate an *ECDSA_WITH_SHA256_DER* signature which is sent in the AUTH payload of the IKE_AUTH request. The matching client certificate is sent int the CERT payload. |
759 | 33 | Andreas Steffen | <pre> |
760 | 151 | Andreas Steffen | [IKE] authentication of 'edu.strongsec.com' (myself) with ECDSA_WITH_SHA256_DER successful |
761 | 151 | Andreas Steffen | [IKE] sending end entity cert "C=CH, O=strongSec GmbH, OU=AK ECC, CN=edu.strongsec.com" |
762 | 33 | Andreas Steffen | </pre> |
763 | 33 | Andreas Steffen | <pre> |
764 | 151 | Andreas Steffen | [IKE] establishing CHILD_SA host{1} |
765 | 151 | Andreas Steffen | [ENC] generating IKE_AUTH request 1 [ IDi CERT N(INIT_CONTACT) CERTREQ IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(ADD_6_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ] |
766 | 151 | Andreas Steffen | [NET] sending packet: from 10.10.1.33[4500] to 10.10.1.43[4500] (1392 bytes) |
767 | 151 | Andreas Steffen | [NET] received packet: from 10.10.1.43[4500] to 10.10.1.33[4500] (1236 bytes) |
768 | 151 | Andreas Steffen | [ENC] parsed IKE_AUTH response 1 [ EF(1/2) ] |
769 | 151 | Andreas Steffen | [ENC] received fragment #1 of 2, waiting for complete IKE message |
770 | 151 | Andreas Steffen | [NET] received packet: from 10.10.1.43[4500] to 10.10.1.33[4500] (132 bytes) |
771 | 151 | Andreas Steffen | [ENC] parsed IKE_AUTH response 1 [ EF(2/2) ] |
772 | 151 | Andreas Steffen | [ENC] received fragment #2 of 2, reassembled fragmented IKE message (1296 bytes) |
773 | 151 | Andreas Steffen | [ENC] parsed IKE_AUTH response 1 [ IDr CERT AUTH SA TSi TSr N(AUTH_LFT) N(MOBIKE_SUP) N(ADD_4_ADDR) N(ADD_6_ADDR) ] |
774 | 151 | Andreas Steffen | [IKE] received end entity cert "C=CH, O=strongSec GmbH, CN=mijas.strongsec.com" |
775 | 151 | Andreas Steffen | [CFG] using certificate "C=CH, O=strongSec GmbH, CN=mijas.strongsec.com" |
776 | 151 | Andreas Steffen | [CFG] using trusted ca certificate "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
777 | 33 | Andreas Steffen | </pre> |
778 | 151 | Andreas Steffen | The status of the received peer certificate is verified using CRLs: |
779 | 33 | Andreas Steffen | <pre> |
780 | 151 | Andreas Steffen | [CFG] checking certificate status of "C=CH, O=strongSec GmbH, CN=mijas.strongsec.com" |
781 | 151 | Andreas Steffen | [CFG] fetching crl from 'http://www.strongsec.com/ca/strongsec.crl' ... |
782 | 151 | Andreas Steffen | [CFG] using trusted certificate "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
783 | 151 | Andreas Steffen | [CFG] crl correctly signed by "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
784 | 151 | Andreas Steffen | [CFG] crl is valid: until Jan 10 10:00:01 2021 |
785 | 151 | Andreas Steffen | [CFG] fetching crl from 'http://www.strongsec.net/ca/strongsec_delta.crl' ... |
786 | 151 | Andreas Steffen | [CFG] using trusted certificate "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
787 | 151 | Andreas Steffen | [CFG] crl correctly signed by "C=CH, O=strongSec GmbH, CN=strongSec 2016 Root CA" |
788 | 151 | Andreas Steffen | [CFG] crl is valid: until Jan 05 10:00:01 2021 |
789 | 151 | Andreas Steffen | [CFG] certificate status is good |
790 | 33 | Andreas Steffen | </pre> |
791 | 39 | Andreas Steffen | <pre> |
792 | 151 | Andreas Steffen | [CFG] reached self-signed root ca with a path length of 0 |
793 | 151 | Andreas Steffen | [IKE] authentication of 'mijas.strongsec.com' with ECDSA_WITH_SHA256_DER successful |
794 | 151 | Andreas Steffen | [IKE] IKE_SA host[1] established between 10.10.1.33[edu.strongsec.com]...10.10.1.43[mijas.strongsec.com] |
795 | 151 | Andreas Steffen | [IKE] scheduling rekeying in 13703s |
796 | 151 | Andreas Steffen | [IKE] maximum IKE_SA lifetime 15143s |
797 | 151 | Andreas Steffen | [CFG] selected proposal: ESP:AES_GCM_16_256/NO_EXT_SEQ |
798 | 151 | Andreas Steffen | [IKE] CHILD_SA host{1} established with SPIs c585d49f_i c1630769_o and TS 10.10.1.33/32 === 10.10.1.43/32 |
799 | 151 | Andreas Steffen | [IKE] received AUTH_LIFETIME of 9777s, scheduling reauthentication in 8337s |
800 | 151 | Andreas Steffen | initiate completed successfully |
801 | 33 | Andreas Steffen | </pre> |
802 | 33 | Andreas Steffen | |
803 | 156 | Andreas Steffen | The established IKE and CHILD SAs can be displayed |
804 | 33 | Andreas Steffen | <pre> |
805 | 1 | Andreas Steffen | swanctl --list-sas |
806 | 1 | Andreas Steffen | </pre> |
807 | 34 | Andreas Steffen | <pre> |
808 | 151 | Andreas Steffen | host: #1, ESTABLISHED, IKEv2, 4ef1452bda258a1b_i* a8508d872adadc84_r |
809 | 151 | Andreas Steffen | local 'edu.strongsec.com' @ 10.10.1.33[4500] |
810 | 151 | Andreas Steffen | remote 'mijas.strongsec.com' @ 10.10.1.43[4500] |
811 | 151 | Andreas Steffen | AES_CBC-256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519 |
812 | 151 | Andreas Steffen | established 60s ago, rekeying in 13643s, reauth in 8277s |
813 | 151 | Andreas Steffen | host: #1, reqid 1, INSTALLED, TUNNEL, ESP:AES_GCM_16-256 |
814 | 151 | Andreas Steffen | installed 62s ago, rekeying in 3271s, expires in 3900s |
815 | 151 | Andreas Steffen | in c585d49f, 15168 bytes, 172 packets, 0s ago |
816 | 151 | Andreas Steffen | out c1630769, 25184 bytes, 113 packets, 60s ago |
817 | 151 | Andreas Steffen | local 10.10.1.33/32 |
818 | 151 | Andreas Steffen | remote 10.10.1.43/32 |
819 | 34 | Andreas Steffen | </pre> |
820 | 34 | Andreas Steffen | |
821 | 151 | Andreas Steffen | h3. Terminating IKEv2 Connection |
822 | 151 | Andreas Steffen | |
823 | 34 | Andreas Steffen | The IKE and CHILD SAs are terminated |
824 | 34 | Andreas Steffen | <pre> |
825 | 151 | Andreas Steffen | swanctl --terminate --ike host |
826 | 34 | Andreas Steffen | </pre> |
827 | 39 | Andreas Steffen | |
828 | 34 | Andreas Steffen | <pre> |
829 | 151 | Andreas Steffen | [IKE] deleting IKE_SA host[1] between 10.10.1.33[edu.strongsec.com]...10.10.1.43[mijas.strongsec.com] |
830 | 151 | Andreas Steffen | [IKE] sending DELETE for IKE_SA host[1] |
831 | 151 | Andreas Steffen | [ENC] generating INFORMATIONAL request 2 [ D ] |
832 | 151 | Andreas Steffen | [NET] sending packet: from 10.10.1.33[4500] to 10.10.1.43[4500] (80 bytes) |
833 | 151 | Andreas Steffen | [NET] received packet: from 10.10.1.43[4500] to 10.10.1.33[4500] (80 bytes) |
834 | 151 | Andreas Steffen | [ENC] parsed INFORMATIONAL response 2 [ ] |
835 | 151 | Andreas Steffen | [IKE] IKE_SA deleted |
836 | 151 | Andreas Steffen | terminate completed successfully |
837 | 1 | Andreas Steffen | </pre> |