Project

General

Profile

Trusted Platform Module 2.0 » History » Version 96

Andreas Steffen, 01.01.2021 18:06

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 88 Andreas Steffen
h3. Install the tpm2-tss Software Stack and the tpm2-tools Command Set
8 51 Andreas Steffen
9 90 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 which also offers a set of "tpm2-tools":https://github.com/tpm2-software/tpm2-tools which itself uses 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 91 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 93 Andreas Steffen
A manual showing 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 96 Andreas Steffen
With the strongSwan *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 96 Andreas Steffen
TPM 2.0 - manufacturer: INTC (Intel) rev: 01.38 2018 
42 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
43 96 Andreas Steffen
TPM 2.0 - ECC curves: NIST_P256 BN_P256
44 96 Andreas Steffen
TPM 2.0 - PCR banks: SHA1 SHA256
45 96 Andreas Steffen
TPM 2.0 via TSS2 v2 available
46 96 Andreas Steffen
signature algorithm is NULL with ERROR hash
47 96 Andreas Steffen
L0 - subjectPublicKeyInfo:
48 96 Andreas Steffen
L1 - algorithm:
49 96 Andreas Steffen
L2 - algorithmIdentifier:
50 96 Andreas Steffen
L3 - algorithm:
51 96 Andreas Steffen
  'rsaEncryption'
52 96 Andreas Steffen
L1 - subjectPublicKey:
53 96 Andreas Steffen
-- > --
54 96 Andreas Steffen
L0 - RSAPublicKey:
55 96 Andreas Steffen
L1 - modulus:
56 96 Andreas Steffen
L1 - publicExponent:
57 96 Andreas Steffen
-- < --
58 96 Andreas Steffen
  privkey:   RSA 2048 bits
59 96 Andreas Steffen
  keyid:     ee:c7:bf:5a:de:0f:11:84:2c:86:2b:69:84:ba:65:b9:81:d2:a9:45
60 96 Andreas Steffen
  subjkey:   df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79
61 96 Andreas Steffen
With debug level 2 some basic information on the TPM device is shown which is a second generation Intel firmware TPM 
62 7 Andreas Steffen
63 20 Andreas Steffen
h2. Derive a Persistent RSA Endorsement Key
64 1 Andreas Steffen
65 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
66 11 Andreas Steffen
67 82 Andreas Steffen
 tpm2_getpubek -H 0x81010001 -g rsa -f ek_rsa.pub
68 9 Andreas Steffen
69 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
70 9 Andreas Steffen
71 50 Andreas Steffen
 pki --pub --keyid 0x81010001 --outform pem > ek_rsa_pub.pem
72 9 Andreas Steffen
73 9 Andreas Steffen
The fingerprint of the RSA EK public key can be displayed with the command
74 9 Andreas Steffen
75 9 Andreas Steffen
 pki --print --type pub --in ek_rsa_pub.pem
76 9 Andreas Steffen
  pubkey:    RSA 2048 bits
77 9 Andreas Steffen
  keyid:     d1:f1:49:84:36:44:e6:8c:d2:a6:69:ee:fd:b5:7d:56:2f:39:ff:58
78 1 Andreas Steffen
  subjkey:   c1:1b:8e:f1:c7:f8:8a:1e:9a:dd:7e:82:2f:7a:a3:f5:c0:e2:4d:7d
79 1 Andreas Steffen
80 20 Andreas Steffen
h2. Generate a Persistent RSA Attestation Key
81 11 Andreas Steffen
82 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
83 1 Andreas Steffen
84 83 Andreas Steffen
 tpm2_getpubak -E 0x81010001 -g rsa -D sha256 -s rsassa -k 0x81010002 -P 123456 -f ak_rsa2.pub -n ak_rsa2.name
85 12 Andreas Steffen
86 46 Andreas Steffen
This AK key is protected by the PIN (-P parameter) *123456*. The AK public key can now be exported in PKCS#1 format from the TPM using the *pki* tool
87 12 Andreas Steffen
88 50 Andreas Steffen
 pki --pub --keyid 0x81010002 --outform pem > ak_rsa_pub.pem
89 12 Andreas Steffen
90 12 Andreas Steffen
The fingerprint of the RSA AK public key can be displayed with the command
91 12 Andreas Steffen
92 12 Andreas Steffen
 pki --print --type pub --in ak_rsa_pub.pem
93 12 Andreas Steffen
  pubkey:    RSA 2048 bits
94 12 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
95 12 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
96 11 Andreas Steffen
97 20 Andreas Steffen
h2. Derive a Persistent ECC Endorsement Key
98 1 Andreas Steffen
99 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:
100 1 Andreas Steffen
101 82 Andreas Steffen
 tpm2_getpubek -H 0x81010003 -g ecc -f ek_ecc.pub
102 9 Andreas Steffen
103 67 Andreas Steffen
Without exporting the public key first the fingerprint of the ECC EK private key can be directly displayed with the command
104 9 Andreas Steffen
105 67 Andreas Steffen
 pki --print --type priv --keyid 0x81010003
106 9 Andreas Steffen
  pubkey:    ECDSA 256 bits
107 9 Andreas Steffen
  keyid:     7f:39:ca:e6:83:9b:a9:06:97:40:27:6a:e1:bf:8f:f5:9f:d3:a5:31
108 9 Andreas Steffen
  subjkey:   8b:43:4d:5e:5e:7b:ff:c2:54:4d:ef:88:cb:0c:7c:47:75:28:4d:09
109 9 Andreas Steffen
110 20 Andreas Steffen
h2. Generate a Persistent ECC Attestation Key
111 13 Andreas Steffen
112 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
113 13 Andreas Steffen
114 84 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g ecc -D sha256 -s ecdsa -k 0x81010004 -f ak_ecc4.pub -n ak_ecc4.name
115 13 Andreas Steffen
116 13 Andreas Steffen
The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool
117 13 Andreas Steffen
118 50 Andreas Steffen
 pki --pub --keyid 0x81010004 > ak_ecc_pub.der
119 13 Andreas Steffen
120 52 Andreas Steffen
The fingerprint of the ECC AK public key can be displayed with the command
121 13 Andreas Steffen
122 14 Andreas Steffen
 pki --print --type pub --in ak_ecc_pub.der
123 1 Andreas Steffen
  pubkey:    ECDSA 256 bits
124 1 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
125 1 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
126 15 Andreas Steffen
127 20 Andreas Steffen
h2. Generate Another ECC Attestation Key
128 15 Andreas Steffen
129 15 Andreas Steffen
Multiple AK keys bound to a common EK key can be generated
130 15 Andreas Steffen
131 85 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g ecc -D sha256 -s ecdsa -k 0x81010005 -f ak_ecc5.pub -n ak_ecc5.name
132 15 Andreas Steffen
133 68 Andreas Steffen
The fingerprint of the second ECC AK private key can be displayed with the command
134 15 Andreas Steffen
135 68 Andreas Steffen
 pki --print --type priv --in 0x81010005
136 15 Andreas Steffen
  pubkey:    ECDSA 256 bits
137 15 Andreas Steffen
  keyid:     c4:b4:9c:95:27:9e:ce:81:2f:98:42:c8:1b:f0:54:ff:d4:d1:24:34
138 15 Andreas Steffen
  subjkey:   cf:44:f4:f7:9d:97:09:ad:b1:09:3a:8e:6f:23:eb:9f:2c:35:94:c9
139 15 Andreas Steffen
140 19 Andreas Steffen
h2. Remove a Persistent Key Object
141 15 Andreas Steffen
142 15 Andreas Steffen
Since the non-volatile memory of the TPM is limited any persistent key object can be removed to free storage space.
143 15 Andreas Steffen
The following tpm2-tools command removes the ECC AK key with persistent handle 0x81010005
144 15 Andreas Steffen
145 1 Andreas Steffen
 tpm2_evictcontrol -A o -H 0x81010005 -S 0x81010005
146 18 Andreas Steffen
147 18 Andreas Steffen
h2. List Persistent Objects
148 18 Andreas Steffen
149 18 Andreas Steffen
The following tpm2-tools command lists all persistent objects stored by the TPM in non-volatile memory
150 18 Andreas Steffen
151 18 Andreas Steffen
 tpm2_listpersistent
152 18 Andreas Steffen
153 18 Andreas Steffen
<pre>
154 18 Andreas Steffen
6 persistent objects defined.
155 18 Andreas Steffen
156 18 Andreas Steffen
0. Persistent handle: 0x81000001
157 18 Andreas Steffen
{
158 18 Andreas Steffen
        Type: 0x23
159 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
160 18 Andreas Steffen
        Attributes: 0x30072
161 18 Andreas Steffen
}
162 18 Andreas Steffen
1. Persistent handle: 0x81000002
163 18 Andreas Steffen
{
164 18 Andreas Steffen
        Type: 0x23
165 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
166 18 Andreas Steffen
        Attributes: 0x60072
167 18 Andreas Steffen
}
168 18 Andreas Steffen
2. Persistent handle: 0x81010001
169 18 Andreas Steffen
{
170 18 Andreas Steffen
        Type: 0x1
171 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
172 18 Andreas Steffen
        Attributes: 0x300b2
173 18 Andreas Steffen
}
174 18 Andreas Steffen
3. Persistent handle: 0x81010002
175 18 Andreas Steffen
{
176 18 Andreas Steffen
        Type: 0x1
177 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
178 18 Andreas Steffen
        Attributes: 0x50072
179 18 Andreas Steffen
}
180 18 Andreas Steffen
4. Persistent handle: 0x81010003
181 18 Andreas Steffen
{
182 18 Andreas Steffen
        Type: 0x23
183 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
184 18 Andreas Steffen
        Attributes: 0x300b2
185 18 Andreas Steffen
}
186 18 Andreas Steffen
5. Persistent handle: 0x81010004
187 18 Andreas Steffen
{
188 18 Andreas Steffen
        Type: 0x23
189 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
190 18 Andreas Steffen
        Attributes: 0x50072
191 18 Andreas Steffen
}
192 18 Andreas Steffen
</pre>
193 13 Andreas Steffen
194 41 Andreas Steffen
h2. Create a Demo Root CA
195 41 Andreas Steffen
196 41 Andreas Steffen
The following *pki* command creates a 256 bit ECDSA private key for the Demo CA
197 41 Andreas Steffen
<pre>
198 41 Andreas Steffen
pki --gen --type ecdsa --size 256 --outform pem > demoCaKey.pem
199 41 Andreas Steffen
</pre>
200 41 Andreas Steffen
201 41 Andreas Steffen
Next we create a self-signed Root CA certificate
202 41 Andreas Steffen
<pre>
203 41 Andreas Steffen
pki --self --ca --type ecdsa --in demoCaKey.pem --dn="C=US, O=TNC Demo, CN=TNC Demo CA" --lifetime 3652 --outform pem > demoCaCert.pem
204 41 Andreas Steffen
</pre>
205 41 Andreas Steffen
206 42 Andreas Steffen
h2. Issue an RSA AIK Certificate
207 41 Andreas Steffen
208 42 Andreas Steffen
Based on the RSA AK public key exported from the TPM, the following *pki* command generates an Attestation Identity Key (AIK) certificate signed by the Demo CA
209 41 Andreas Steffen
<pre>
210 41 Andreas Steffen
pki --issue --cacert demoCaCert.pem --cakey demoCaKey.pem --type pub --in ak_rsa_pub.der --dn "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com" --san raspi5.example.com --lifetime 3651 > raspi5_ak_rsa_Cert.der
211 41 Andreas Steffen
</pre>
212 41 Andreas Steffen
213 42 Andreas Steffen
h2. Issue an ECC AIK Certificate
214 41 Andreas Steffen
215 42 Andreas Steffen
Based on the ECC AK public key exported from the TPM, the following *pki* command generates an Attestation Identity Key (AIK) certificate signed by the Demo CA
216 41 Andreas Steffen
<pre>
217 41 Andreas Steffen
pki --issue --cacert demoCaCert.pem --cakey demoCaKey.pem --type pub --in ak_ecc_pub.der --dn "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com" --san raspi5.example.com --lifetime 3651 > raspi5_ak_ecc_Cert.der
218 41 Andreas Steffen
</pre>
219 47 Andreas Steffen
220 49 Andreas Steffen
Many certification authorities issue certificates based on PKCS#10 certificate requests. This approach is also possible. First a certificate request is generated on the host the TPM resides on
221 47 Andreas Steffen
<pre>
222 50 Andreas Steffen
 pki --req --keyid 0x81010004 --dn "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com" --san raspi5.example.com > ak_ecc_req.der
223 47 Andreas Steffen
</pre>
224 49 Andreas Steffen
When you are prompted for a smartcard PIN just press <enter> since this TPM private key is not protected by a PIN. In a second step the CA issues the AIK certificate based on the PKCS#10 certificate request
225 49 Andreas Steffen
<pre>
226 47 Andreas Steffen
pki --issue --cacert demoCaCert.pem --cakey demoCaKey.pem --type pkcs10 --in ak_ecc_req.der --lifetime 3651 > raspi5_ak_ecc_Cert.der
227 47 Andreas Steffen
</pre>
228 47 Andreas Steffen
229 54 Andreas Steffen
h2. Store the ECC AIK Certificate in the NV RAM of the TPM
230 54 Andreas Steffen
231 55 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
232 54 Andreas Steffen
<pre>
233 54 Andreas Steffen
ls -l raspi5_ak_ecc_Cert.der
234 63 Andreas Steffen
-rw-r--r-- 1 root root 449 Feb 17  2017 raspi5_ak_ecc_Cert.der
235 54 Andreas Steffen
</pre>
236 54 Andreas Steffen
237 54 Andreas Steffen
We then define a memory location with a size of 449 bytes that can be accessed via the handle 0x01800004 which is also called the NV index
238 54 Andreas Steffen
<pre>
239 54 Andreas Steffen
tpm2_nvdefine -x 0x01800004 -a 0x40000001 -s 449 -t 0x2000A
240 54 Andreas Steffen
</pre>
241 54 Andreas Steffen
242 54 Andreas Steffen
Then we write the certificate file to the NV RAM destination
243 54 Andreas Steffen
<pre>
244 70 Andreas Steffen
tpm2_nvwrite -x 0x01800004 -a 0x40000001 raspi5_ak_ecc_Cert.der
245 54 Andreas Steffen
</pre>
246 54 Andreas Steffen
247 62 Andreas Steffen
h2. List of NV Indexes
248 54 Andreas Steffen
249 62 Andreas Steffen
A list of all defined NV indexes can be obtained with
250 57 Andreas Steffen
251 57 Andreas Steffen
 tpm2_nvlist
252 57 Andreas Steffen
253 55 Andreas Steffen
<pre>
254 54 Andreas Steffen
2 NV indexes defined.
255 54 Andreas Steffen
256 54 Andreas Steffen
  0. NV Index: 0x1500015
257 54 Andreas Steffen
  {
258 54 Andreas Steffen
	Hash algorithm(nameAlg):4
259 54 Andreas Steffen
 	The Index attributes(attributes):0x44040004
260 54 Andreas Steffen
 	The size of the data area(dataSize):4
261 54 Andreas Steffen
   }
262 54 Andreas Steffen
  1. NV Index: 0x1800004
263 54 Andreas Steffen
  {
264 54 Andreas Steffen
	Hash algorithm(nameAlg):11
265 54 Andreas Steffen
 	The Index attributes(attributes):0x2002000a
266 1 Andreas Steffen
 	The size of the data area(dataSize):449
267 1 Andreas Steffen
   }
268 62 Andreas Steffen
</pre>
269 62 Andreas Steffen
270 62 Andreas Steffen
h2. Remove NV Index
271 62 Andreas Steffen
272 62 Andreas Steffen
The memory assigned to a given NV index can be released with the command
273 62 Andreas Steffen
<pre>
274 62 Andreas Steffen
tpm2_nvrelease -x 0x01800001 -a 0x40000001
275 54 Andreas Steffen
</pre>
276 54 Andreas Steffen
277 30 Andreas Steffen
h2. Configure TPM Private Key Access via VICI Interface
278 1 Andreas Steffen
279 23 Andreas Steffen
Configuration of TPM private key access as tokens in the secrets section of *swanctl.conf*
280 1 Andreas Steffen
281 7 Andreas Steffen
 secrets {
282 1 Andreas Steffen
    token_ak_rsa {
283 1 Andreas Steffen
       handle = 81010002
284 46 Andreas Steffen
       pin = 123456
285 1 Andreas Steffen
    }
286 1 Andreas Steffen
    token_ak_ecc {
287 7 Andreas Steffen
       handle = 81010004
288 1 Andreas Steffen
    }
289 1 Andreas Steffen
}
290 46 Andreas Steffen
Since the use of the RSA AK private key is password-protected, the PIN *123456* is added.
291 30 Andreas Steffen
292 30 Andreas Steffen
h2. Define IPsec Connection with RSA AK Client Key
293 30 Andreas Steffen
294 30 Andreas Steffen
This connection configuration in *swanctl.conf* uses the RSA AK certificate for client authentication
295 30 Andreas Steffen
<pre>
296 30 Andreas Steffen
connections {
297 30 Andreas Steffen
   rsa {
298 30 Andreas Steffen
      local_addrs  = 10.10.0.105
299 30 Andreas Steffen
      remote_addrs = 10.10.0.104
300 30 Andreas Steffen
301 30 Andreas Steffen
      local {
302 30 Andreas Steffen
         auth = pubkey 
303 30 Andreas Steffen
         certs = raspi5_ak_rsa_Cert.der
304 30 Andreas Steffen
      }
305 30 Andreas Steffen
      remote {
306 30 Andreas Steffen
         auth = pubkey 
307 30 Andreas Steffen
         id = raspi4.example.com
308 30 Andreas Steffen
      }
309 30 Andreas Steffen
      children {
310 30 Andreas Steffen
         rsa {
311 30 Andreas Steffen
            mode = transport
312 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
313 30 Andreas Steffen
         }
314 30 Andreas Steffen
      }
315 30 Andreas Steffen
      version = 2
316 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
317 30 Andreas Steffen
   }
318 30 Andreas Steffen
}
319 30 Andreas Steffen
</pre>
320 30 Andreas Steffen
321 30 Andreas Steffen
h2. Define IPsec Connection with ECC AK Client Key
322 30 Andreas Steffen
323 58 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
324 30 Andreas Steffen
<pre>
325 30 Andreas Steffen
connections {
326 30 Andreas Steffen
   ecc {
327 30 Andreas Steffen
      local_addrs  = 10.10.0.105
328 30 Andreas Steffen
      remote_addrs = 10.10.0.104
329 30 Andreas Steffen
330 30 Andreas Steffen
      local {
331 1 Andreas Steffen
         auth = pubkey
332 58 Andreas Steffen
         cert-tpm {
333 58 Andreas Steffen
            handle = 0x01800004
334 58 Andreas Steffen
         }
335 30 Andreas Steffen
      }
336 30 Andreas Steffen
      remote {
337 30 Andreas Steffen
         auth = pubkey
338 30 Andreas Steffen
         id = raspi4.example.com
339 30 Andreas Steffen
      }
340 30 Andreas Steffen
      children {
341 30 Andreas Steffen
         ecc {
342 30 Andreas Steffen
            mode = transport
343 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
344 30 Andreas Steffen
         }
345 30 Andreas Steffen
      }
346 30 Andreas Steffen
      version = 2
347 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
348 30 Andreas Steffen
   }
349 30 Andreas Steffen
}
350 30 Andreas Steffen
</pre>
351 29 Andreas Steffen
352 29 Andreas Steffen
h2. Starting the strongSwan Daemon
353 29 Andreas Steffen
354 29 Andreas Steffen
<pre>
355 29 Andreas Steffen
systemctl start strongswan-swanctl
356 29 Andreas Steffen
</pre>
357 29 Andreas Steffen
358 29 Andreas Steffen
<pre>
359 44 Andreas Steffen
Feb 19 10:52:01 raspi5 systemd[1]: Starting strongSwan IPsec IKEv1/IKEv2 daemon using swanctl...
360 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded plugins: charon-systemd charon-systemd random nonce x509 constraints openssl pem pkcs1 pkcs8 pkcs12 pubkey mgf1 ntru curve25519 eap-identity eap-ttls eap-tnc tnc-tnccs tnc-imc tnccs-20 socket-default kernel-netlink vici tpm
361 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: spawning 16 worker threads
362 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded certificate 'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com'
363 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded certificate 'C=US, O=TNC Demo, CN=TNC Demo CA'
364 1 Andreas Steffen
</pre>
365 1 Andreas Steffen
366 59 Andreas Steffen
The RSA AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
367 1 Andreas Steffen
<pre>
368 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
369 53 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: 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
370 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
371 73 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
372 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: AIK signature algorithm is RSASSA with SHA256 hash
373 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded RSA private key from token
374 1 Andreas Steffen
F</pre>
375 1 Andreas Steffen
376 1 Andreas Steffen
The ECC AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
377 44 Andreas Steffen
<pre>
378 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
379 53 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: 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
380 44 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
381 73 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
382 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: AIK signature algorithm is ECDSA with SHA256 hash
383 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded ECDSA private key from token
384 1 Andreas Steffen
</pre>
385 59 Andreas Steffen
386 59 Andreas Steffen
The ECC AIK certificate is loaded by the *charon-systemd* daemon via the TPM 2.0 resource manager
387 59 Andreas Steffen
<pre>
388 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
389 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: 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
390 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
391 73 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
392 60 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded certificate from TPM NV index 0x01800004
393 59 Andreas Steffen
</pre>
394 59 Andreas Steffen
395 59 Andreas Steffen
The two connection definitions are received by the *charon-systemd* daemon from the *swanctl* command line tool via the VICI interface
396 59 Andreas Steffen
<pre>
397 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]:   id not specified, defaulting to cert subject 'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com'
398 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: rsa
399 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]:   id not specified, defaulting to cert subject 'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com'
400 44 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: ecc
401 59 Andreas Steffen
</pre>
402 59 Andreas Steffen
403 59 Andreas Steffen
The *swanctl* command line tool reports its actions
404 59 Andreas Steffen
<pre>
405 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509/raspi5_ak_rsa_Cert.der'
406 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509ca/demoCaCert.pem'
407 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_rsa from token [keyid: f49e857dde4e67f5fb870398673f207cf33f2b66]
408 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_ecc from token [keyid: c70e63f87f6ff65500e5057f5a3e6b6ce7d2d513]
409 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'rsa'
410 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'ecc'
411 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: successfully loaded 2 connections, 0 unloaded
412 31 Andreas Steffen
</pre>
413 31 Andreas Steffen
414 31 Andreas Steffen
<pre>
415 44 Andreas Steffen
Feb 19 10:52:02 raspi5 systemd[1]: Started strongSwan IPsec IKEv1/IKEv2 daemon using swanctl.
416 31 Andreas Steffen
</pre>
417 31 Andreas Steffen
418 31 Andreas Steffen
The following *swanctl* command shows the two loaded connections
419 31 Andreas Steffen
<pre>
420 31 Andreas Steffen
swanctl --list-conns
421 31 Andreas Steffen
</pre>
422 31 Andreas Steffen
423 31 Andreas Steffen
<pre>
424 31 Andreas Steffen
rsa: IKEv2, reauthentication every 10800s, no rekeying
425 31 Andreas Steffen
  local:  10.10.0.105
426 31 Andreas Steffen
  remote: 10.10.0.104
427 31 Andreas Steffen
  local public key authentication:
428 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
429 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
430 31 Andreas Steffen
  remote public key authentication:
431 31 Andreas Steffen
    id: raspi4.example.com
432 31 Andreas Steffen
  rsa: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
433 31 Andreas Steffen
    local:  dynamic
434 31 Andreas Steffen
    remote: dynamic
435 31 Andreas Steffen
</pre>
436 31 Andreas Steffen
437 31 Andreas Steffen
<pre>
438 31 Andreas Steffen
ecc: IKEv2, reauthentication every 10800s, no rekeying
439 31 Andreas Steffen
  local:  10.10.0.105
440 31 Andreas Steffen
  remote: 10.10.0.104
441 31 Andreas Steffen
  local public key authentication:
442 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
443 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
444 31 Andreas Steffen
  remote public key authentication:
445 31 Andreas Steffen
    id: raspi4.example.com
446 31 Andreas Steffen
  ecc: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
447 31 Andreas Steffen
    local:  dynamic
448 32 Andreas Steffen
    remote: dynamic
449 31 Andreas Steffen
</pre>
450 31 Andreas Steffen
451 31 Andreas Steffen
The loaded certificates can also be displayed
452 31 Andreas Steffen
<pre>
453 31 Andreas Steffen
swanctl --list-certs
454 31 Andreas Steffen
</pre>
455 31 Andreas Steffen
456 31 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)
457 31 Andreas Steffen
<pre>
458 31 Andreas Steffen
List of X.509 End Entity Certificates
459 31 Andreas Steffen
460 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com"
461 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
462 31 Andreas Steffen
  validity:  not before Feb 19 09:33:43 2017, ok
463 31 Andreas Steffen
             not after  Aug 29 10:33:43 2026, ok (expires in 3477 days)
464 31 Andreas Steffen
  serial:    11:57:33:3e:2a:8e:8a:32
465 31 Andreas Steffen
  altNames:  raspi5.example.com
466 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
467 31 Andreas Steffen
  subjkeyId: f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
468 31 Andreas Steffen
  pubkey:    RSA 2048 bits, has private key
469 31 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
470 31 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
471 31 Andreas Steffen
472 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com"
473 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
474 31 Andreas Steffen
  validity:  not before Feb 17 23:17:19 2017, ok
475 31 Andreas Steffen
             not after  Aug 30 00:17:19 2026, ok (expires in 3478 days)
476 31 Andreas Steffen
  serial:    52:9d:3e:42:6f:71:63:3d
477 31 Andreas Steffen
  altNames:  raspi5.example.com
478 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
479 31 Andreas Steffen
  subjkeyId: c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
480 31 Andreas Steffen
  pubkey:    ECDSA 256 bits, has private key
481 31 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
482 31 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
483 31 Andreas Steffen
</pre>
484 31 Andreas Steffen
485 31 Andreas Steffen
<pre>
486 31 Andreas Steffen
List of X.509 CA Certificates
487 31 Andreas Steffen
488 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, CN=TNC Demo CA"
489 1 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
490 32 Andreas Steffen
  validity:  not before Aug 31 10:29:27 2016, ok
491 32 Andreas Steffen
             not after  Aug 31 10:29:27 2026, ok (expires in 3479 days)
492 43 Andreas Steffen
  serial:    02:c8:85:e1:ef:fa:8f:20
493 32 Andreas Steffen
  flags:     CA CRLSign self-signed 
494 38 Andreas Steffen
  subjkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
495 32 Andreas Steffen
  pubkey:    ECDSA 256 bits
496 32 Andreas Steffen
  keyid:     a1:b5:e0:29:d0:4c:a7:62:bd:ca:a3:b4:af:18:42:2c:4a:01:55:9a
497 32 Andreas Steffen
  subjkey:   21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
498 32 Andreas Steffen
</pre>
499 32 Andreas Steffen
500 32 Andreas Steffen
h2. IKEv2 Authentication with RSA AIK Certificate
501 32 Andreas Steffen
502 32 Andreas Steffen
With the following *swanctl* command the "rsa" connection is established
503 32 Andreas Steffen
<pre>
504 32 Andreas Steffen
swanctl --initiate --child rsa
505 32 Andreas Steffen
</pre>
506 32 Andreas Steffen
507 32 Andreas Steffen
<pre>
508 45 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: vici initiate 'rsa'
509 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: initiating IKE_SA rsa[1] to 10.10.0.104
510 40 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 ]
511 40 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)
512 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)
513 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 ]
514 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: received strongSwan vendor ID
515 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"
516 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"
517 32 Andreas Steffen
</pre>
518 32 Andreas Steffen
519 32 Andreas Steffen
The RSA AK private key stored in the TPM 2.0 is used to generate an *RSA_EMSA_PKCS1_SHA2_256* signature which is sent in the AUTH payload of the IKE_AUTH request. The matching client certificate is sent int the CERT payload.
520 32 Andreas Steffen
<pre>
521 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
522 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"
523 32 Andreas Steffen
</pre>
524 32 Andreas Steffen
<pre>
525 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: establishing CHILD_SA rsa
526 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) ]
527 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)
528 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)
529 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) ]
530 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"
531 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
532 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"
533 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
534 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
535 38 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]
536 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: scheduling reauthentication in 10507s
537 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11587s
538 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
539 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 10103s, scheduling reauthentication in 9023s
540 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: peer supports MOBIKE
541 32 Andreas Steffen
</pre>
542 32 Andreas Steffen
543 32 Andreas Steffen
The following *swanctl* command shows the established IPsec connection
544 32 Andreas Steffen
<pre>
545 32 Andreas Steffen
 swanctl --list-sas
546 32 Andreas Steffen
</pre>
547 32 Andreas Steffen
<pre>
548 32 Andreas Steffen
rsa: #1, ESTABLISHED, IKEv2, 7ba3b4d06c051ecb_i* 14e1769a8aeb7f28_r
549 32 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com' @ 10.10.0.105[4500]
550 32 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
551 32 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
552 32 Andreas Steffen
  established 252s ago, reauth in 8771s
553 38 Andreas Steffen
  rsa: #1, reqid 1, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
554 33 Andreas Steffen
    installed 252s ago, rekeying in 3258s, expires in 3708s
555 33 Andreas Steffen
    in  c23deb9d,    640 bytes,    10 packets,     3s ago
556 33 Andreas Steffen
    out ce48d08e,    640 bytes,    10 packets,     3s ago
557 33 Andreas Steffen
    local  10.10.0.105/32
558 33 Andreas Steffen
    remote 10.10.0.104/32
559 33 Andreas Steffen
</pre>
560 33 Andreas Steffen
561 33 Andreas Steffen
With this *swanctl* command the "rsa" connection is terminated
562 33 Andreas Steffen
<pre>
563 33 Andreas Steffen
swanctl --terminate --ike rsa
564 33 Andreas Steffen
</pre>
565 33 Andreas Steffen
566 33 Andreas Steffen
<pre>
567 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'rsa'
568 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: deleting IKE_SA rsa[1] between 10.10.0.105[C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com]
569 43 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA rsa[1]
570 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
571 38 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (80 bytes)
572 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (80 bytes)
573 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
574 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: IKE_SA deleted
575 33 Andreas Steffen
</pre>
576 33 Andreas Steffen
577 33 Andreas Steffen
h2. IKEv2 Authentication with ECC AIK Certificate
578 33 Andreas Steffen
579 33 Andreas Steffen
Next we initiate the "ecc" connection
580 33 Andreas Steffen
<pre>
581 33 Andreas Steffen
swanctl --initiate --child ecc
582 33 Andreas Steffen
</pre>
583 33 Andreas Steffen
584 33 Andreas Steffen
<pre>
585 45 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: vici initiate 'ecc'
586 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: initiating IKE_SA ecc[2] to 10.10.0.104
587 40 Andreas Steffen
Feb 19 11:00:32 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 ]
588 40 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[500] to 10.10.0.104[500] (1257 bytes)
589 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[500] to 10.10.0.105[500] (1259 bytes)
590 33 Andreas Steffen
Feb 19 11:00:32 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 ]
591 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received strongSwan vendor ID
592 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received cert request for "C=US, O=TNC Demo, CN=TNC Demo CA"
593 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: sending cert request for "C=US, O=TNC Demo, CN=TNC Demo CA"
594 33 Andreas Steffen
</pre>
595 33 Andreas Steffen
596 33 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.
597 33 Andreas Steffen
<pre>
598 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: authentication of 'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com' (myself) with ECDSA_WITH_SHA256_DER successful
599 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: sending end entity cert "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com"
600 33 Andreas Steffen
</pre>
601 33 Andreas Steffen
<pre>
602 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: establishing CHILD_SA ecc
603 33 Andreas Steffen
Feb 19 11:00:34 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) ]
604 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (912 bytes)
605 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (752 bytes)
606 33 Andreas Steffen
Feb 19 11:00:34 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) ]
607 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received end entity cert "C=US, O=TNC Demo, CN=raspi4.example.com"
608 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
609 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   using trusted ca certificate "C=US, O=TNC Demo, CN=TNC Demo CA"
610 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
611 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
612 39 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: IKE_SA ecc[2] established between 10.10.0.105[C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com]
613 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: scheduling reauthentication in 10180s
614 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11260s
615 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: CHILD_SA ecc{2} established with SPIs c2c16cd0_i c47ea6f6_o and TS 10.10.0.105/32 === 10.10.0.104/32
616 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 9880s, scheduling reauthentication in 8800s
617 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: peer supports MOBIKE
618 33 Andreas Steffen
</pre>
619 33 Andreas Steffen
620 33 Andreas Steffen
The establed IKE and CHILD SAs are displayed
621 33 Andreas Steffen
<pre>
622 33 Andreas Steffen
 swanctl --list-sas
623 33 Andreas Steffen
</pre>
624 33 Andreas Steffen
<pre>
625 33 Andreas Steffen
ecc: #2, ESTABLISHED, IKEv2, b7f2652777b0996a_i* 12282b5964ff0658_r
626 1 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com' @ 10.10.0.105[4500]
627 1 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
628 34 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
629 34 Andreas Steffen
  established 126s ago, reauth in 8674s
630 39 Andreas Steffen
  ecc: #2, reqid 2, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
631 34 Andreas Steffen
    installed 126s ago, rekeying in 3252s, expires in 3834s
632 34 Andreas Steffen
    in  c2c16cd0,    320 bytes,     5 packets,     2s ago
633 34 Andreas Steffen
    out c47ea6f6,    320 bytes,     5 packets,     2s ago
634 34 Andreas Steffen
    local  10.10.0.105/32
635 34 Andreas Steffen
    remote 10.10.0.104/32
636 34 Andreas Steffen
</pre>
637 34 Andreas Steffen
638 34 Andreas Steffen
The IKE and CHILD SAs are terminated
639 34 Andreas Steffen
<pre>
640 34 Andreas Steffen
swanctl --terminate --ike ecc
641 34 Andreas Steffen
</pre>
642 34 Andreas Steffen
643 34 Andreas Steffen
<pre>
644 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'ecc'
645 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: deleting IKE_SA ecc[2] between 10.10.0.105[C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com]
646 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA ecc[2]
647 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
648 39 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (80 bytes)
649 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (80 bytes)
650 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
651 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: IKE_SA deleted
652 1 Andreas Steffen
</pre>