Trusted Platform Module 2.0 » History » Version 32
Andreas Steffen, 19.02.2017 10:57
1 | 17 | Andreas Steffen | h1. Trusted Platform Module 2.0 |
---|---|---|---|
2 | 1 | Andreas Steffen | |
3 | 6 | Andreas Steffen | {{>toc}} |
4 | 6 | Andreas Steffen | |
5 | 2 | Andreas Steffen | h2. Connect to a TPM 2.0 device |
6 | 2 | Andreas Steffen | |
7 | 5 | Andreas Steffen | In order to connect to a TPM 2.0 hardware or firmware device, the TSS2 software stack developed by Intel is needed. Because the official Ubuntu *tpm2-tss* package is rather outdated (e.g. since version 0.98 the TCTI interface to the TPM 2.0 resource manager has changed several times), strongSwan is currently based on a recent version directly drawn from the TPM2-TSS git repository https://github.com/01org/TPM2.0-TSS. Avoid any TCTI interface incompatibilities by fetching the latest *tpm2-tools* version from https://github.com/01org/tpm2.0-tools as well. |
8 | 1 | Andreas Steffen | |
9 | 11 | Andreas Steffen | Build and install both the *tpm2-tss* stack and the *tpm2.0-tools*, start the *tpm2-resourcemgr* as a service in the background and try to connect to the TPM 2.0 by listing e.g. the contents of the SHA-1 bank of PCR registers |
10 | 1 | Andreas Steffen | |
11 | 7 | Andreas Steffen | |
12 | 7 | Andreas Steffen | tpm2_listpcrs -g 0x0004 |
13 | 3 | Andreas Steffen | |
14 | 18 | Andreas Steffen | <pre> |
15 | 18 | Andreas Steffen | Bank/Algorithm: TPM_ALG_SHA1(0x0004) |
16 | 3 | Andreas Steffen | PCR_00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
17 | 3 | Andreas Steffen | PCR_01: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
18 | 3 | Andreas Steffen | PCR_02: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
19 | 3 | Andreas Steffen | PCR_03: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
20 | 3 | Andreas Steffen | PCR_04: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
21 | 3 | Andreas Steffen | PCR_05: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
22 | 3 | Andreas Steffen | PCR_06: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
23 | 3 | Andreas Steffen | PCR_07: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
24 | 3 | Andreas Steffen | PCR_08: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
25 | 3 | Andreas Steffen | PCR_09: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
26 | 3 | Andreas Steffen | PCR_10: a9 45 e7 0f 42 a2 79 f0 78 ca d4 64 60 39 39 da 9d 6a d1 a5 |
27 | 3 | Andreas Steffen | PCR_11: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
28 | 3 | Andreas Steffen | PCR_12: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
29 | 3 | Andreas Steffen | PCR_13: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
30 | 3 | Andreas Steffen | PCR_14: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
31 | 3 | Andreas Steffen | PCR_15: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
32 | 3 | Andreas Steffen | PCR_16: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
33 | 3 | Andreas Steffen | PCR_17: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |
34 | 3 | Andreas Steffen | PCR_18: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |
35 | 3 | Andreas Steffen | PCR_19: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |
36 | 3 | Andreas Steffen | PCR_20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |
37 | 1 | Andreas Steffen | PCR_21: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |
38 | 1 | Andreas Steffen | PCR_22: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |
39 | 1 | Andreas Steffen | PCR_23: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
40 | 18 | Andreas Steffen | </pre> |
41 | 1 | Andreas Steffen | |
42 | 7 | Andreas Steffen | A manual showing all *tpm2-tools* functions with their arguments can be found "here":https://github.com/01org/tpm2.0-tools/blob/master/manual. |
43 | 7 | Andreas Steffen | |
44 | 7 | Andreas Steffen | h2. TPM 2.0 Algorithm IDs |
45 | 7 | Andreas Steffen | |
46 | 8 | Andreas Steffen | h3. Hash Algorithms |
47 | 8 | Andreas Steffen | |
48 | 7 | Andreas Steffen | |0x0004 |SHA-1 | |
49 | 7 | Andreas Steffen | |0x000B |SHA-2_256 | |
50 | 7 | Andreas Steffen | |0x000C |SHA-2_384 | |
51 | 1 | Andreas Steffen | |0x000D |SHA-2_512 | |
52 | 7 | Andreas Steffen | |
53 | 28 | Andreas Steffen | Currently available TPM 2.0 devices like the Infineon *Optiga SLB 9670 VQ2.0* hardware TPM or Intel's *PTT* firmware TPM integrated into the Management Engine starting with the 4th generation (Haswell) of the *Core* processor family, support the *SHA-1* and *SHA-2_256* algorithms. |
54 | 1 | Andreas Steffen | |
55 | 8 | Andreas Steffen | h3. Public Key Types |
56 | 8 | Andreas Steffen | |
57 | 8 | Andreas Steffen | |0x0001 |RSA | |
58 | 8 | Andreas Steffen | |0x0023 |ECC | |
59 | 1 | Andreas Steffen | |
60 | 22 | Andreas Steffen | Currently RSA keys have a modulus size of 2048 bits and ECC keys are based on the 256 bit NIST curve. |
61 | 22 | Andreas Steffen | |
62 | 11 | Andreas Steffen | h3. Signature Schemes |
63 | 11 | Andreas Steffen | |
64 | 11 | Andreas Steffen | |0x0014 |RSASSA | |
65 | 11 | Andreas Steffen | |0x0016 |RSAPSS | |
66 | 9 | Andreas Steffen | |0x0018 |ECDSA | |
67 | 9 | Andreas Steffen | |
68 | 20 | Andreas Steffen | h2. Derive a Persistent RSA Endorsement Key |
69 | 1 | Andreas Steffen | |
70 | 25 | Andreas Steffen | The following tpm2-tools 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 0x81010001 |
71 | 11 | Andreas Steffen | |
72 | 24 | Andreas Steffen | tpm2_getpubek -H 0x81010001 -g 0x0001 -f ek_rsa.pub |
73 | 9 | Andreas Steffen | |
74 | 27 | Andreas Steffen | The EK public key stored in the ek_rsa.pub file is encoded in a TPM 2.0 proprietary format but the key can be exported from the TPM in the regular PKCS#1 format using the *pki* tool |
75 | 9 | Andreas Steffen | |
76 | 12 | Andreas Steffen | pki --pub --keyid 81010001 --outform pem > ek_rsa_pub.pem |
77 | 9 | Andreas Steffen | |
78 | 9 | Andreas Steffen | The fingerprint of the RSA EK public key can be displayed with the command |
79 | 9 | Andreas Steffen | |
80 | 9 | Andreas Steffen | pki --print --type pub --in ek_rsa_pub.pem |
81 | 9 | Andreas Steffen | pubkey: RSA 2048 bits |
82 | 9 | Andreas Steffen | keyid: d1:f1:49:84:36:44:e6:8c:d2:a6:69:ee:fd:b5:7d:56:2f:39:ff:58 |
83 | 1 | Andreas Steffen | subjkey: c1:1b:8e:f1:c7:f8:8a:1e:9a:dd:7e:82:2f:7a:a3:f5:c0:e2:4d:7d |
84 | 1 | Andreas Steffen | |
85 | 20 | Andreas Steffen | h2. Generate a Persistent RSA Attestation Key |
86 | 11 | Andreas Steffen | |
87 | 12 | Andreas Steffen | A 2048 bit RSA Attestation Key (AK) bound to the EK with handle 0x81010001 can be created and made persistent under the handle 0x81010002 with the following tpm2-tools command |
88 | 1 | Andreas Steffen | |
89 | 15 | Andreas Steffen | tpm2_getpubak -E 0x81010001 -g 0x0001 -D 0x000B -s 0x0014 -k 0x81010002 -f ak_rsa2.pub -n ak_rsa2.name |
90 | 12 | Andreas Steffen | |
91 | 12 | Andreas Steffen | The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool |
92 | 12 | Andreas Steffen | |
93 | 12 | Andreas Steffen | pki --pub --keyid 81010002 --outform pem > ak_rsa_pub.pem |
94 | 12 | Andreas Steffen | |
95 | 12 | Andreas Steffen | The fingerprint of the RSA AK public key can be displayed with the command |
96 | 12 | Andreas Steffen | |
97 | 12 | Andreas Steffen | pki --print --type pub --in ak_rsa_pub.pem |
98 | 12 | Andreas Steffen | pubkey: RSA 2048 bits |
99 | 12 | Andreas Steffen | keyid: 71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa |
100 | 12 | Andreas Steffen | subjkey: f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66 |
101 | 11 | Andreas Steffen | |
102 | 20 | Andreas Steffen | h2. Derive a Persistent ECC Endorsement Key |
103 | 1 | Andreas Steffen | |
104 | 25 | Andreas Steffen | The following tpm2-tools command derives a 256 bit ECC 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 0x81010003: |
105 | 1 | Andreas Steffen | |
106 | 24 | Andreas Steffen | tpm2_getpubek -H 0x81010003 -g 0x0023 -f ek_ecc.pub |
107 | 9 | Andreas Steffen | |
108 | 11 | Andreas Steffen | The EK public key can be exported in PKCS#1 format from the TPM using the *pki* tool: |
109 | 11 | Andreas Steffen | |
110 | 11 | Andreas Steffen | pki --pub --keyid 81010003 > ek_ecc_pub.der |
111 | 9 | Andreas Steffen | |
112 | 9 | Andreas Steffen | The fingerprint of the ECC EK public key can be displayed with the command |
113 | 9 | Andreas Steffen | |
114 | 10 | Andreas Steffen | pki --print --type pub --in ek_ecc_pub.der |
115 | 9 | Andreas Steffen | pubkey: ECDSA 256 bits |
116 | 9 | Andreas Steffen | keyid: 7f:39:ca:e6:83:9b:a9:06:97:40:27:6a:e1:bf:8f:f5:9f:d3:a5:31 |
117 | 9 | Andreas Steffen | subjkey: 8b:43:4d:5e:5e:7b:ff:c2:54:4d:ef:88:cb:0c:7c:47:75:28:4d:09 |
118 | 9 | Andreas Steffen | |
119 | 20 | Andreas Steffen | h2. Generate a Persistent ECC Attestation Key |
120 | 13 | Andreas Steffen | |
121 | 13 | Andreas Steffen | A 256 bit ECC Attestation Key (AK) bound to the EK with handle 0x81010003 can be created and made persistent under the handle 0x81010004 with the following tpm2-tools command |
122 | 13 | Andreas Steffen | |
123 | 15 | Andreas Steffen | tpm2_getpubak -E 0x81010003 -g 0x0023 -D 0x000B -s 0x0018 -k 0x81010004 -f ak_ecc4.pub -n ak_ecc4.name |
124 | 13 | Andreas Steffen | |
125 | 13 | Andreas Steffen | The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool |
126 | 13 | Andreas Steffen | |
127 | 14 | Andreas Steffen | pki --pub --keyid 81010004 > ak_ecc_pub.der |
128 | 13 | Andreas Steffen | |
129 | 13 | Andreas Steffen | The fingerprint of the RSA AK public key can be displayed with the command |
130 | 13 | Andreas Steffen | |
131 | 14 | Andreas Steffen | pki --print --type pub --in ak_ecc_pub.der |
132 | 1 | Andreas Steffen | pubkey: ECDSA 256 bits |
133 | 1 | Andreas Steffen | keyid: 71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38 |
134 | 1 | Andreas Steffen | subjkey: c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13 |
135 | 15 | Andreas Steffen | |
136 | 20 | Andreas Steffen | h2. Generate Another ECC Attestation Key |
137 | 15 | Andreas Steffen | |
138 | 15 | Andreas Steffen | Multiple AK keys bound to a common EK key can be generated |
139 | 15 | Andreas Steffen | |
140 | 15 | Andreas Steffen | tpm2_getpubak -E 0x81010003 -g 0x0023 -D 0x000B -s 0x0018 -k 0x81010005 -f ak_ecc5.pub -n ak_ecc5.name |
141 | 15 | Andreas Steffen | |
142 | 15 | Andreas Steffen | The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool |
143 | 15 | Andreas Steffen | |
144 | 15 | Andreas Steffen | pki --pub --keyid 81010005 > ak_ecc5_pub.der |
145 | 15 | Andreas Steffen | |
146 | 15 | Andreas Steffen | The fingerprint of the second ECC AK public key can be displayed with the command |
147 | 15 | Andreas Steffen | |
148 | 15 | Andreas Steffen | pki --print --type pub --in ak_ecc5_pub.der |
149 | 15 | Andreas Steffen | pubkey: ECDSA 256 bits |
150 | 15 | Andreas Steffen | keyid: c4:b4:9c:95:27:9e:ce:81:2f:98:42:c8:1b:f0:54:ff:d4:d1:24:34 |
151 | 15 | Andreas Steffen | subjkey: cf:44:f4:f7:9d:97:09:ad:b1:09:3a:8e:6f:23:eb:9f:2c:35:94:c9 |
152 | 15 | Andreas Steffen | |
153 | 19 | Andreas Steffen | h2. Remove a Persistent Key Object |
154 | 15 | Andreas Steffen | |
155 | 15 | Andreas Steffen | Since the non-volatile memory of the TPM is limited any persistent key object can be removed to free storage space. |
156 | 15 | Andreas Steffen | The following tpm2-tools command removes the ECC AK key with persistent handle 0x81010005 |
157 | 15 | Andreas Steffen | |
158 | 1 | Andreas Steffen | tpm2_evictcontrol -A o -H 0x81010005 -S 0x81010005 |
159 | 18 | Andreas Steffen | |
160 | 18 | Andreas Steffen | h2. List Persistent Objects |
161 | 18 | Andreas Steffen | |
162 | 18 | Andreas Steffen | The following tpm2-tools command lists all persistent objects stored by the TPM in non-volatile memory |
163 | 18 | Andreas Steffen | |
164 | 18 | Andreas Steffen | tpm2_listpersistent |
165 | 18 | Andreas Steffen | |
166 | 18 | Andreas Steffen | <pre> |
167 | 18 | Andreas Steffen | 6 persistent objects defined. |
168 | 18 | Andreas Steffen | |
169 | 18 | Andreas Steffen | 0. Persistent handle: 0x81000001 |
170 | 18 | Andreas Steffen | { |
171 | 18 | Andreas Steffen | Type: 0x23 |
172 | 18 | Andreas Steffen | Hash algorithm(nameAlg): 0xb |
173 | 18 | Andreas Steffen | Attributes: 0x30072 |
174 | 18 | Andreas Steffen | } |
175 | 18 | Andreas Steffen | 1. Persistent handle: 0x81000002 |
176 | 18 | Andreas Steffen | { |
177 | 18 | Andreas Steffen | Type: 0x23 |
178 | 18 | Andreas Steffen | Hash algorithm(nameAlg): 0xb |
179 | 18 | Andreas Steffen | Attributes: 0x60072 |
180 | 18 | Andreas Steffen | } |
181 | 18 | Andreas Steffen | 2. Persistent handle: 0x81010001 |
182 | 18 | Andreas Steffen | { |
183 | 18 | Andreas Steffen | Type: 0x1 |
184 | 18 | Andreas Steffen | Hash algorithm(nameAlg): 0xb |
185 | 18 | Andreas Steffen | Attributes: 0x300b2 |
186 | 18 | Andreas Steffen | } |
187 | 18 | Andreas Steffen | 3. Persistent handle: 0x81010002 |
188 | 18 | Andreas Steffen | { |
189 | 18 | Andreas Steffen | Type: 0x1 |
190 | 18 | Andreas Steffen | Hash algorithm(nameAlg): 0xb |
191 | 18 | Andreas Steffen | Attributes: 0x50072 |
192 | 18 | Andreas Steffen | } |
193 | 18 | Andreas Steffen | 4. Persistent handle: 0x81010003 |
194 | 18 | Andreas Steffen | { |
195 | 18 | Andreas Steffen | Type: 0x23 |
196 | 18 | Andreas Steffen | Hash algorithm(nameAlg): 0xb |
197 | 18 | Andreas Steffen | Attributes: 0x300b2 |
198 | 18 | Andreas Steffen | } |
199 | 18 | Andreas Steffen | 5. Persistent handle: 0x81010004 |
200 | 18 | Andreas Steffen | { |
201 | 18 | Andreas Steffen | Type: 0x23 |
202 | 18 | Andreas Steffen | Hash algorithm(nameAlg): 0xb |
203 | 18 | Andreas Steffen | Attributes: 0x50072 |
204 | 18 | Andreas Steffen | } |
205 | 18 | Andreas Steffen | </pre> |
206 | 13 | Andreas Steffen | |
207 | 30 | Andreas Steffen | h2. Configure TPM Private Key Access via VICI Interface |
208 | 1 | Andreas Steffen | |
209 | 23 | Andreas Steffen | Configuration of TPM private key access as tokens in the secrets section of *swanctl.conf* |
210 | 1 | Andreas Steffen | |
211 | 7 | Andreas Steffen | secrets { |
212 | 1 | Andreas Steffen | token_ak_rsa { |
213 | 7 | Andreas Steffen | handle = 81010002 |
214 | 1 | Andreas Steffen | } |
215 | 1 | Andreas Steffen | token_ak_ecc { |
216 | 7 | Andreas Steffen | handle = 81010004 |
217 | 1 | Andreas Steffen | } |
218 | 1 | Andreas Steffen | } |
219 | 30 | Andreas Steffen | |
220 | 30 | Andreas Steffen | h2. Define IPsec Connection with RSA AK Client Key |
221 | 30 | Andreas Steffen | |
222 | 30 | Andreas Steffen | This connection configuration in *swanctl.conf* uses the RSA AK certificate for client authentication |
223 | 30 | Andreas Steffen | <pre> |
224 | 30 | Andreas Steffen | connections { |
225 | 30 | Andreas Steffen | rsa { |
226 | 30 | Andreas Steffen | local_addrs = 10.10.0.105 |
227 | 30 | Andreas Steffen | remote_addrs = 10.10.0.104 |
228 | 30 | Andreas Steffen | |
229 | 30 | Andreas Steffen | local { |
230 | 30 | Andreas Steffen | auth = pubkey |
231 | 30 | Andreas Steffen | certs = raspi5_ak_rsa_Cert.der |
232 | 30 | Andreas Steffen | } |
233 | 30 | Andreas Steffen | remote { |
234 | 30 | Andreas Steffen | auth = pubkey |
235 | 30 | Andreas Steffen | id = raspi4.example.com |
236 | 30 | Andreas Steffen | } |
237 | 30 | Andreas Steffen | children { |
238 | 30 | Andreas Steffen | rsa { |
239 | 30 | Andreas Steffen | mode = transport |
240 | 30 | Andreas Steffen | esp_proposals = aes128-sha256-curve25519 |
241 | 30 | Andreas Steffen | } |
242 | 30 | Andreas Steffen | } |
243 | 30 | Andreas Steffen | version = 2 |
244 | 30 | Andreas Steffen | proposals = aes128-sha256-curve25519 |
245 | 30 | Andreas Steffen | } |
246 | 30 | Andreas Steffen | } |
247 | 30 | Andreas Steffen | </pre> |
248 | 30 | Andreas Steffen | |
249 | 30 | Andreas Steffen | h2. Define IPsec Connection with ECC AK Client Key |
250 | 30 | Andreas Steffen | |
251 | 30 | Andreas Steffen | This connection configuration in *swanctl.conf* uses the ECC AK certificate for client authentication |
252 | 30 | Andreas Steffen | <pre> |
253 | 30 | Andreas Steffen | connections { |
254 | 30 | Andreas Steffen | ecc { |
255 | 30 | Andreas Steffen | local_addrs = 10.10.0.105 |
256 | 30 | Andreas Steffen | remote_addrs = 10.10.0.104 |
257 | 30 | Andreas Steffen | |
258 | 30 | Andreas Steffen | local { |
259 | 30 | Andreas Steffen | auth = pubkey |
260 | 30 | Andreas Steffen | certs = raspi5_ak_ecc_Cert.der |
261 | 30 | Andreas Steffen | } |
262 | 30 | Andreas Steffen | remote { |
263 | 30 | Andreas Steffen | auth = pubkey |
264 | 30 | Andreas Steffen | id = raspi4.example.com |
265 | 30 | Andreas Steffen | } |
266 | 30 | Andreas Steffen | children { |
267 | 30 | Andreas Steffen | ecc { |
268 | 30 | Andreas Steffen | mode = transport |
269 | 30 | Andreas Steffen | esp_proposals = aes128-sha256-curve25519 |
270 | 30 | Andreas Steffen | } |
271 | 30 | Andreas Steffen | } |
272 | 30 | Andreas Steffen | version = 2 |
273 | 30 | Andreas Steffen | proposals = aes128-sha256-curve25519 |
274 | 30 | Andreas Steffen | } |
275 | 30 | Andreas Steffen | } |
276 | 30 | Andreas Steffen | </pre> |
277 | 29 | Andreas Steffen | |
278 | 29 | Andreas Steffen | h2. Starting the strongSwan Daemon |
279 | 29 | Andreas Steffen | |
280 | 29 | Andreas Steffen | <pre> |
281 | 29 | Andreas Steffen | systemctl start strongswan-swanctl |
282 | 29 | Andreas Steffen | </pre> |
283 | 29 | Andreas Steffen | |
284 | 29 | Andreas Steffen | <pre> |
285 | 29 | Andreas Steffen | Feb 19 09:35:14 raspi5 systemd[1]: Starting strongSwan IPsec IKEv1/IKEv2 daemon using swanctl... |
286 | 29 | Andreas Steffen | </pre> |
287 | 29 | Andreas Steffen | |
288 | 29 | Andreas Steffen | The RSA AK private key is attached via the TPM 2.0 resource manager |
289 | 29 | Andreas Steffen | <pre> |
290 | 29 | Andreas Steffen | Feb 19 09:35:14 raspi5 resourcemgr[531]: Accept socket: 0xa |
291 | 29 | Andreas Steffen | Feb 19 09:35:14 raspi5 resourcemgr[531]: Resource Manager Other CMD Server accepted client |
292 | 29 | Andreas Steffen | Feb 19 09:35:14 raspi5 resourcemgr[531]: Accept socket: 0xb |
293 | 29 | Andreas Steffen | Feb 19 09:35:14 raspi5 resourcemgr[531]: Resource Manager TPM CMD Server accepted client |
294 | 29 | Andreas Steffen | Feb 19 09:35:14 raspi5 charon-systemd[20831]: TPM 2.0 - algorithms: RSA SHA1 HMAC AES KEYEDHASH XOR SHA256 RSASSA RSAES RSAPSS OAEP ECDSA ECDH SM2 KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER CFB |
295 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 charon-systemd[20831]: TPM 2.0 - ECC curves: NIST_P256 BN_P256 |
296 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 charon-systemd[20831]: TPM 2.0 via TSS2 available |
297 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 charon-systemd[20831]: AIK signature algorithm is RSASSA with SHA256 hash |
298 | 29 | Andreas Steffen | </pre> |
299 | 29 | Andreas Steffen | |
300 | 29 | Andreas Steffen | The ECC AK private key is attached via the TPM 2.0 resource manager |
301 | 29 | Andreas Steffen | <pre> |
302 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 resourcemgr[531]: Accept socket: 0x6 |
303 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 resourcemgr[531]: Resource Manager Other CMD Server accepted client |
304 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 resourcemgr[531]: Accept socket: 0x7 |
305 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 resourcemgr[531]: Resource Manager TPM CMD Server accepted client |
306 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 charon-systemd[20831]: TPM 2.0 - algorithms: RSA SHA1 HMAC AES KEYEDHASH XOR SHA256 RSASSA RSAES RSAPSS OAEP ECDSA ECDH SM2 KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER CFB |
307 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 charon-systemd[20831]: TPM 2.0 - ECC curves: NIST_P256 BN_P256 |
308 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 charon-systemd[20831]: TPM 2.0 via TSS2 available |
309 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 charon-systemd[20831]: AIK signature algorithm is ECDSA with SHA256 hash |
310 | 29 | Andreas Steffen | </pre> |
311 | 29 | Andreas Steffen | |
312 | 29 | Andreas Steffen | The *swanctl* command line tool loads the RSA and ECC AK certificates as well as the demoCA root certificate and connects to the RSA and ECC private keys residing in the TPM |
313 | 29 | Andreas Steffen | <pre> |
314 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 swanctl[20849]: loaded certificate from '/etc/swanctl/x509/raspi5_ak_rsa_Cert.der' |
315 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 swanctl[20849]: loaded certificate from '/etc/swanctl/x509/raspi5_ak_ecc_Cert.der' |
316 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 swanctl[20849]: loaded certificate from '/etc/swanctl/x509ca/demoCaCert.pem' |
317 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 swanctl[20849]: loaded key token_ak_rsa from token [keyid: f49e857dde4e67f5fb870398673f207cf33f2b66] |
318 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 swanctl[20849]: loaded key token_ak_ecc from token [keyid: c70e63f87f6ff65500e5057f5a3e6b6ce7d2d513] |
319 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 swanctl[20849]: loaded connection 'rsa' |
320 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 swanctl[20849]: loaded connection 'ecc' |
321 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 swanctl[20849]: successfully loaded 2 connections, 0 unloaded |
322 | 29 | Andreas Steffen | </pre> |
323 | 29 | Andreas Steffen | |
324 | 29 | Andreas Steffen | <pre> |
325 | 29 | Andreas Steffen | Feb 19 09:35:15 raspi5 systemd[1]: Started strongSwan IPsec IKEv1/IKEv2 daemon using swanctl. |
326 | 29 | Andreas Steffen | </pre> |
327 | 31 | Andreas Steffen | |
328 | 31 | Andreas Steffen | The following *swanctl* command shows the two loaded connections |
329 | 31 | Andreas Steffen | <pre> |
330 | 31 | Andreas Steffen | swanctl --list-conns |
331 | 31 | Andreas Steffen | </pre> |
332 | 31 | Andreas Steffen | |
333 | 31 | Andreas Steffen | <pre> |
334 | 31 | Andreas Steffen | rsa: IKEv2, reauthentication every 10800s, no rekeying |
335 | 31 | Andreas Steffen | local: 10.10.0.105 |
336 | 31 | Andreas Steffen | remote: 10.10.0.104 |
337 | 31 | Andreas Steffen | local public key authentication: |
338 | 31 | Andreas Steffen | id: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com |
339 | 31 | Andreas Steffen | certs: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com |
340 | 31 | Andreas Steffen | remote public key authentication: |
341 | 31 | Andreas Steffen | id: raspi4.example.com |
342 | 31 | Andreas Steffen | rsa: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets |
343 | 31 | Andreas Steffen | local: dynamic |
344 | 31 | Andreas Steffen | remote: dynamic |
345 | 31 | Andreas Steffen | </pre> |
346 | 31 | Andreas Steffen | |
347 | 31 | Andreas Steffen | <pre> |
348 | 31 | Andreas Steffen | ecc: IKEv2, reauthentication every 10800s, no rekeying |
349 | 31 | Andreas Steffen | local: 10.10.0.105 |
350 | 31 | Andreas Steffen | remote: 10.10.0.104 |
351 | 31 | Andreas Steffen | local public key authentication: |
352 | 31 | Andreas Steffen | id: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com |
353 | 31 | Andreas Steffen | certs: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com |
354 | 31 | Andreas Steffen | remote public key authentication: |
355 | 31 | Andreas Steffen | id: raspi4.example.com |
356 | 31 | Andreas Steffen | ecc: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets |
357 | 31 | Andreas Steffen | local: dynamic |
358 | 31 | Andreas Steffen | remote: dynamic |
359 | 31 | Andreas Steffen | </pre> |
360 | 31 | Andreas Steffen | |
361 | 31 | Andreas Steffen | The loaded certificates can also be displayed |
362 | 31 | Andreas Steffen | <pre> |
363 | 31 | Andreas Steffen | swanctl --list-certs |
364 | 31 | Andreas Steffen | </pre> |
365 | 31 | Andreas Steffen | |
366 | 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) |
367 | 31 | Andreas Steffen | <pre> |
368 | 31 | Andreas Steffen | List of X.509 End Entity Certificates |
369 | 31 | Andreas Steffen | |
370 | 31 | Andreas Steffen | subject: "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com" |
371 | 31 | Andreas Steffen | issuer: "C=US, O=TNC Demo, CN=TNC Demo CA" |
372 | 31 | Andreas Steffen | validity: not before Feb 19 09:33:43 2017, ok |
373 | 31 | Andreas Steffen | not after Aug 29 10:33:43 2026, ok (expires in 3477 days) |
374 | 31 | Andreas Steffen | serial: 11:57:33:3e:2a:8e:8a:32 |
375 | 31 | Andreas Steffen | altNames: raspi5.example.com |
376 | 31 | Andreas Steffen | authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2 |
377 | 31 | Andreas Steffen | subjkeyId: f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66 |
378 | 31 | Andreas Steffen | pubkey: RSA 2048 bits, has private key |
379 | 31 | Andreas Steffen | keyid: 71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa |
380 | 31 | Andreas Steffen | subjkey: f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66 |
381 | 31 | Andreas Steffen | |
382 | 31 | Andreas Steffen | subject: "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com" |
383 | 31 | Andreas Steffen | issuer: "C=US, O=TNC Demo, CN=TNC Demo CA" |
384 | 31 | Andreas Steffen | validity: not before Feb 17 23:17:19 2017, ok |
385 | 31 | Andreas Steffen | not after Aug 30 00:17:19 2026, ok (expires in 3478 days) |
386 | 31 | Andreas Steffen | serial: 52:9d:3e:42:6f:71:63:3d |
387 | 31 | Andreas Steffen | altNames: raspi5.example.com |
388 | 31 | Andreas Steffen | authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2 |
389 | 31 | Andreas Steffen | subjkeyId: c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13 |
390 | 31 | Andreas Steffen | pubkey: ECDSA 256 bits, has private key |
391 | 31 | Andreas Steffen | keyid: 71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38 |
392 | 31 | Andreas Steffen | subjkey: c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13 |
393 | 31 | Andreas Steffen | </pre> |
394 | 31 | Andreas Steffen | |
395 | 31 | Andreas Steffen | <pre> |
396 | 31 | Andreas Steffen | List of X.509 CA Certificates |
397 | 31 | Andreas Steffen | |
398 | 31 | Andreas Steffen | subject: "C=US, O=TNC Demo, CN=TNC Demo CA" |
399 | 31 | Andreas Steffen | issuer: "C=US, O=TNC Demo, CN=TNC Demo CA" |
400 | 31 | Andreas Steffen | validity: not before Aug 31 10:29:27 2016, ok |
401 | 31 | Andreas Steffen | not after Aug 31 10:29:27 2026, ok (expires in 3479 days) |
402 | 31 | Andreas Steffen | serial: 02:c8:85:e1:ef:fa:8f:20 |
403 | 31 | Andreas Steffen | flags: CA CRLSign self-signed |
404 | 31 | Andreas Steffen | subjkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2 |
405 | 31 | Andreas Steffen | pubkey: ECDSA 256 bits |
406 | 31 | Andreas Steffen | keyid: a1:b5:e0:29:d0:4c:a7:62:bd:ca:a3:b4:af:18:42:2c:4a:01:55:9a |
407 | 1 | Andreas Steffen | subjkey: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2 |
408 | 32 | Andreas Steffen | </pre> |
409 | 32 | Andreas Steffen | |
410 | 32 | Andreas Steffen | h2. IKEv2 Authentication with RSA AK Certificate |
411 | 32 | Andreas Steffen | |
412 | 32 | Andreas Steffen | <pre> |
413 | 32 | Andreas Steffen | swanctl --initiate --child rsa |
414 | 32 | Andreas Steffen | </pre> |
415 | 32 | Andreas Steffen | |
416 | 32 | Andreas Steffen | <pre> |
417 | 32 | Andreas Steffen | Feb 19 10:52:21 raspi5 charon-systemd[21165]: initiating IKE_SA rsa[1] to 10.10.0.104 |
418 | 32 | Andreas Steffen | Feb 19 10:52:21 raspi5 charon-systemd[21165]: 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) V ] |
419 | 32 | Andreas Steffen | Feb 19 10:52:21 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[500] to 10.10.0.104[500] (1257 bytes) |
420 | 32 | Andreas Steffen | Feb 19 10:52:21 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[500] to 10.10.0.105[500] (1259 bytes) |
421 | 32 | Andreas Steffen | Feb 19 10:52:21 raspi5 charon-systemd[21165]: parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ N(HASH_ALG) V ] |
422 | 32 | Andreas Steffen | Feb 19 10:52:21 raspi5 charon-systemd[21165]: received strongSwan vendor ID |
423 | 32 | Andreas Steffen | Feb 19 10:52:21 raspi5 charon-systemd[21165]: received cert request for "C=US, O=TNC Demo, CN=TNC Demo CA" |
424 | 32 | Andreas Steffen | Feb 19 10:52:21 raspi5 charon-systemd[21165]: sending cert request for "C=US, O=TNC Demo, CN=TNC Demo CA" |
425 | 32 | Andreas Steffen | </pre> |
426 | 32 | Andreas Steffen | <pre> |
427 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: authentication of 'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com' (myself) with RSA_EMSA_PKCS1_SHA2_256 successful |
428 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: sending end entity cert "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com" |
429 | 32 | Andreas Steffen | </pre> |
430 | 32 | Andreas Steffen | <pre> |
431 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: establishing CHILD_SA rsa |
432 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: generating IKE_AUTH request 1 [ IDi CERT CERTREQ IDr AUTH N(USE_TRANSP) SA TSi TSr N(MOBIKE_SUP) N(ADD_6_ADDR) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ] |
433 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (1296 bytes) |
434 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (752 bytes) |
435 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: parsed IKE_AUTH response 1 [ IDr CERT AUTH N(USE_TRANSP) SA TSi TSr N(AUTH_LFT) N(MOBIKE_SUP) N(NO_ADD_ADDR) ] |
436 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: received end entity cert "C=US, O=TNC Demo, CN=raspi4.example.com" |
437 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: using certificate "C=US, O=TNC Demo, CN=raspi4.example.com" |
438 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: using trusted ca certificate "C=US, O=TNC Demo, CN=TNC Demo CA" |
439 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: reached self-signed root ca with a path length of 0 |
440 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful |
441 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: IKE_SA rsa[1] established between 10.10.0.105[C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com] |
442 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: scheduling reauthentication in 10507s |
443 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11587s |
444 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: CHILD_SA rsa{1} established with SPIs c23deb9d_i ce48d08e_o and TS 10.10.0.105/32 === 10.10.0.104/32 |
445 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 10103s, scheduling reauthentication in 9023s |
446 | 32 | Andreas Steffen | Feb 19 10:52:24 raspi5 charon-systemd[21165]: peer supports MOBIKE |
447 | 32 | Andreas Steffen | </pre> |
448 | 32 | Andreas Steffen | |
449 | 32 | Andreas Steffen | <pre> |
450 | 32 | Andreas Steffen | swanctl --list-sas |
451 | 32 | Andreas Steffen | </pre> |
452 | 32 | Andreas Steffen | <pre> |
453 | 32 | Andreas Steffen | rsa: #1, ESTABLISHED, IKEv2, 7ba3b4d06c051ecb_i* 14e1769a8aeb7f28_r |
454 | 32 | Andreas Steffen | local 'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com' @ 10.10.0.105[4500] |
455 | 32 | Andreas Steffen | remote 'raspi4.example.com' @ 10.10.0.104[4500] |
456 | 32 | Andreas Steffen | AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519 |
457 | 32 | Andreas Steffen | established 252s ago, reauth in 8771s |
458 | 32 | Andreas Steffen | rsa: #1, reqid 1, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128 |
459 | 32 | Andreas Steffen | installed 252s ago, rekeying in 3258s, expires in 3708s |
460 | 32 | Andreas Steffen | in c23deb9d, 640 bytes, 10 packets, 3s ago |
461 | 32 | Andreas Steffen | out ce48d08e, 640 bytes, 10 packets, 3s ago |
462 | 32 | Andreas Steffen | local 10.10.0.105/32 |
463 | 32 | Andreas Steffen | remote 10.10.0.104/32 |
464 | 32 | Andreas Steffen | </pre> |
465 | 32 | Andreas Steffen | |
466 | 32 | Andreas Steffen | h2. IKEv2 Authentication with ECC AK Certificate |
467 | 32 | Andreas Steffen | |
468 | 32 | Andreas Steffen | <pre> |
469 | 32 | Andreas Steffen | swanctl --initiate --child ecc |
470 | 29 | Andreas Steffen | </pre> |