Annotation of embedaddon/strongswan/README, revision 1.1
1.1 ! misho 1: # strongSwan Configuration #
! 2:
! 3: ## Overview ##
! 4:
! 5: strongSwan is an OpenSource IPsec-based VPN solution.
! 6:
! 7: This document is just a short introduction of the strongSwan **swanctl** command
! 8: which uses the modern [**vici**](src/libcharon/plugins/vici/README.md) *Versatile
! 9: IKE Configuration Interface*. The deprecated **ipsec** command using the legacy
! 10: **stroke** configuration interface is described [**here**](README_LEGACY.md).
! 11: For more detailed information consult the man pages and
! 12: [**our wiki**](https://wiki.strongswan.org).
! 13:
! 14:
! 15: ## Quickstart ##
! 16:
! 17: Certificates for users, hosts and gateways are issued by a fictitious
! 18: strongSwan CA. In our example scenarios the CA certificate `strongswanCert.pem`
! 19: must be present on all VPN endpoints in order to be able to authenticate the
! 20: peers. For your particular VPN application you can either use certificates from
! 21: any third-party CA or generate the needed private keys and certificates yourself
! 22: with the strongSwan **pki** tool, the use of which will be explained in one of
! 23: the sections following below.
! 24:
! 25:
! 26: ### Site-to-Site Case ###
! 27:
! 28: In this scenario two security gateways _moon_ and _sun_ will connect the
! 29: two subnets _moon-net_ and _sun-net_ with each other through a VPN tunnel
! 30: set up between the two gateways:
! 31:
! 32: 10.1.0.0/16 -- | 192.168.0.1 | === | 192.168.0.2 | -- 10.2.0.0/16
! 33: moon-net moon sun sun-net
! 34:
! 35: Configuration on gateway _moon_:
! 36:
! 37: /etc/swanctl/x509ca/strongswanCert.pem
! 38: /etc/swanctl/x509/moonCert.pem
! 39: /etc/swanctl/private/moonKey.pem
! 40:
! 41: /etc/swanctl/swanctl.conf:
! 42:
! 43: connections {
! 44: net-net {
! 45: remote_addrs = 192.168.0.2
! 46:
! 47: local {
! 48: auth = pubkey
! 49: certs = moonCert.pem
! 50: }
! 51: remote {
! 52: auth = pubkey
! 53: id = "C=CH, O=strongSwan, CN=sun.strongswan.org"
! 54: }
! 55: children {
! 56: net-net {
! 57: local_ts = 10.1.0.0/16
! 58: remote_ts = 10.2.0.0/16
! 59: start_action = trap
! 60: }
! 61: }
! 62: }
! 63: }
! 64:
! 65: Configuration on gateway _sun_:
! 66:
! 67: /etc/swanctl/x509ca/strongswanCert.pem
! 68: /etc/swanctl/x509/sunCert.pem
! 69: /etc/swanctl/private/sunKey.pem
! 70:
! 71: /etc/swanctl/swanctl.conf:
! 72:
! 73: connections {
! 74: net-net {
! 75: remote_addrs = 192.168.0.1
! 76:
! 77: local {
! 78: auth = pubkey
! 79: certs = sunCert.pem
! 80: }
! 81: remote {
! 82: auth = pubkey
! 83: id = "C=CH, O=strongSwan, CN=moon.strongswan.org"
! 84: }
! 85: children {
! 86: net-net {
! 87: local_ts = 10.2.0.0/16
! 88: remote_ts = 10.1.0.0/16
! 89: start_action = trap
! 90: }
! 91: }
! 92: }
! 93: }
! 94:
! 95: The local and remote identities used in this scenario are the
! 96: *subjectDistinguishedNames* contained in the end entity certificates.
! 97: The certificates and private keys are loaded into the **charon** daemon with
! 98: the command
! 99:
! 100: swanctl --load-creds
! 101:
! 102: whereas
! 103:
! 104: swanctl --load-conns
! 105:
! 106: loads the connections defined in `swanctl.conf`. With `start_action = trap` the
! 107: IPsec connection is automatically set up with the first plaintext payload IP
! 108: packet wanting to go through the tunnel.
! 109:
! 110: ### Host-to-Host Case ###
! 111:
! 112: This is a setup between two single hosts which don't have a subnet behind
! 113: them. Although IPsec transport mode would be sufficient for host-to-host
! 114: connections we will use the default IPsec tunnel mode.
! 115:
! 116: | 192.168.0.1 | === | 192.168.0.2 |
! 117: moon sun
! 118:
! 119: Configuration on host _moon_:
! 120:
! 121: /etc/swanctl/x509ca/strongswanCert.pem
! 122: /etc/swanctl/x509/moonCert.pem
! 123: /etc/swanctl/private/moonKey.pem
! 124:
! 125: /etc/swanctl/swanctl.conf:
! 126:
! 127: connections {
! 128: host-host {
! 129: remote_addrs = 192.168.0.2
! 130:
! 131: local {
! 132: auth=pubkey
! 133: certs = moonCert.pem
! 134: }
! 135: remote {
! 136: auth = pubkey
! 137: id = "C=CH, O=strongSwan, CN=sun.strongswan.org"
! 138: }
! 139: children {
! 140: net-net {
! 141: start_action = trap
! 142: }
! 143: }
! 144: }
! 145: }
! 146:
! 147: Configuration on host _sun_:
! 148:
! 149: /etc/swanctl/x509ca/strongswanCert.pem
! 150: /etc/swanctl/x509/sunCert.pem
! 151: /etc/swanctl/private/sunKey.pem
! 152:
! 153: /etc/swanctl/swanctl.conf:
! 154:
! 155: connections {
! 156: host-host {
! 157: remote_addrs = 192.168.0.1
! 158:
! 159: local {
! 160: auth = pubkey
! 161: certs = sunCert.pem
! 162: }
! 163: remote {
! 164: auth = pubkey
! 165: id = "C=CH, O=strongSwan, CN=moon.strongswan.org"
! 166: }
! 167: children {
! 168: host-host {
! 169: start_action = trap
! 170: }
! 171: }
! 172: }
! 173: }
! 174:
! 175:
! 176: ### Roadwarrior Case ###
! 177:
! 178: This is a very common case where a strongSwan gateway serves an arbitrary
! 179: number of remote VPN clients usually having dynamic IP addresses.
! 180:
! 181: 10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x |
! 182: moon-net moon carol
! 183:
! 184: Configuration on gateway _moon_:
! 185:
! 186: /etc/swanctl/x509ca/strongswanCert.pem
! 187: /etc/swanctl/x509/moonCert.pem
! 188: /etc/swanctl/private/moonKey.pem
! 189:
! 190: /etc/swanctl/swanctl.conf:
! 191:
! 192: connections {
! 193: rw {
! 194: local {
! 195: auth = pubkey
! 196: certs = moonCert.pem
! 197: id = moon.strongswan.org
! 198: }
! 199: remote {
! 200: auth = pubkey
! 201: }
! 202: children {
! 203: net-net {
! 204: local_ts = 10.1.0.0/16
! 205: }
! 206: }
! 207: }
! 208: }
! 209:
! 210: Configuration on roadwarrior _carol_:
! 211:
! 212: /etc/swanctl/x509ca/strongswanCert.pem
! 213: /etc/swanctl/x509/carolCert.pem
! 214: /etc/swanctl/private/carolKey.pem
! 215:
! 216: /etc/swanctl/swanctl.conf:
! 217:
! 218: connections {
! 219: home {
! 220: remote_addrs = moon.strongswan.org
! 221:
! 222: local {
! 223: auth = pubkey
! 224: certs = carolCert.pem
! 225: id = carol@strongswan.org
! 226: }
! 227: remote {
! 228: auth = pubkey
! 229: id = moon.strongswan.org
! 230: }
! 231: children {
! 232: home {
! 233: local_ts = 10.1.0.0/16
! 234: start_action = start
! 235: }
! 236: }
! 237: }
! 238: }
! 239:
! 240: For `remote_addrs` the hostname `moon.strongswan.org` was chosen which will be
! 241: resolved by DNS at runtime into the corresponding IP destination address.
! 242: In this scenario the identity of the roadwarrior `carol` is the email address
! 243: `carol@strongswan.org` which must be included as a *subjectAlternativeName* in
! 244: the roadwarrior certificate `carolCert.pem`.
! 245:
! 246:
! 247: ### Roadwarrior Case with Virtual IP ###
! 248:
! 249: Roadwarriors usually have dynamic IP addresses assigned by the ISP they are
! 250: currently attached to. In order to simplify the routing from _moon-net_ back
! 251: to the remote access client _carol_ it would be desirable if the roadwarrior had
! 252: an inner IP address chosen from a pre-defined pool.
! 253:
! 254: 10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x | -- 10.3.0.1
! 255: moon-net moon carol virtual IP
! 256:
! 257: In our example the virtual IP address is chosen from the address pool
! 258: `10.3.0.0/16` which can be configured by adding the section
! 259:
! 260: pools {
! 261: rw_pool {
! 262: addrs = 10.3.0.0/16
! 263: }
! 264: }
! 265:
! 266: to the gateway's `swanctl.conf` from where they are loaded into the **charon**
! 267: daemon using the command
! 268:
! 269: swanctl --load-pools
! 270:
! 271: To request an IP address from this pool a roadwarrior can use IKEv1 mode config
! 272: or IKEv2 configuration payloads. The configuration for both is the same
! 273:
! 274: vips = 0.0.0.0
! 275:
! 276: Configuration on gateway _moon_:
! 277:
! 278: /etc/swanctl/x509ca/strongswanCert.pem
! 279: /etc/swanctl/x509/moonCert.pem
! 280: /etc/swanctl/private/moonKey.pem
! 281:
! 282: /etc/swanctl/swanctl.conf:
! 283:
! 284: connections {
! 285: rw {
! 286: pools = rw_pool
! 287:
! 288: local {
! 289: auth = pubkey
! 290: certs = moonCert.pem
! 291: id = moon.strongswan.org
! 292: }
! 293: remote {
! 294: auth = pubkey
! 295: }
! 296: children {
! 297: net-net {
! 298: local_ts = 10.1.0.0/16
! 299: }
! 300: }
! 301: }
! 302: }
! 303:
! 304: pools {
! 305: rw_pool {
! 306: addrs = 10.30.0.0/16
! 307: }
! 308: }
! 309:
! 310: Configuration on roadwarrior _carol_:
! 311:
! 312: /etc/swanctl/x509ca/strongswanCert.pem
! 313: /etc/swanctl/x509/carolCert.pem
! 314: /etc/swanctl/private/carolKey.pem
! 315:
! 316: /etc/swanctl/swanctl.conf:
! 317:
! 318: connections {
! 319: home {
! 320: remote_addrs = moon.strongswan.org
! 321: vips = 0.0.0.0
! 322:
! 323: local {
! 324: auth = pubkey
! 325: certs = carolCert.pem
! 326: id = carol@strongswan.org
! 327: }
! 328: remote {
! 329: auth = pubkey
! 330: id = moon.strongswan.org
! 331: }
! 332: children {
! 333: home {
! 334: local_ts = 10.1.0.0/16
! 335: start_action = start
! 336: }
! 337: }
! 338: }
! 339: }
! 340:
! 341:
! 342: ### Roadwarrior Case with EAP Authentication ###
! 343:
! 344: This is a very common case where a strongSwan gateway serves an arbitrary
! 345: number of remote VPN clients which authenticate themselves via a password
! 346: based *Extended Authentication Protocol* as e.g. *EAP-MD5* or *EAP-MSCHAPv2*.
! 347:
! 348: 10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x |
! 349: moon-net moon carol
! 350:
! 351: Configuration on gateway _moon_:
! 352:
! 353: /etc/swanctl/x509ca/strongswanCert.pem
! 354: /etc/swanctl/x509/moonCert.pem
! 355: /etc/swanctl/private/moonKey.pem
! 356:
! 357: /etc/swanctl/swanctl.conf:
! 358:
! 359: connections {
! 360: rw {
! 361: local {
! 362: auth = pubkey
! 363: certs = moonCert.pem
! 364: id = moon.strongswan.org
! 365: }
! 366: remote {
! 367: auth = eap-md5
! 368: }
! 369: children {
! 370: net-net {
! 371: local_ts = 10.1.0.0/16
! 372: }
! 373: }
! 374: send_certreq = no
! 375: }
! 376: }
! 377:
! 378: The `swanctl.conf` file additionally contains a `secrets` section defining all
! 379: client credentials
! 380:
! 381: secrets {
! 382: eap-carol {
! 383: id = carol@strongswan.org
! 384: secret = Ar3etTnp
! 385: }
! 386: eap-dave {
! 387: id = dave@strongswan.org
! 388: secret = W7R0g3do
! 389: }
! 390: }
! 391:
! 392: Configuration on roadwarrior _carol_:
! 393:
! 394: /etc/swanctl/x509ca/strongswanCert.pem
! 395:
! 396: /etc/swanctl/swanctl.conf:
! 397:
! 398: connections {
! 399: home {
! 400: remote_addrs = moon.strongswan.org
! 401:
! 402: local {
! 403: auth = eap
! 404: id = carol@strongswan.org
! 405: }
! 406: remote {
! 407: auth = pubkey
! 408: id = moon.strongswan.org
! 409: }
! 410: children {
! 411: home {
! 412: local_ts = 10.1.0.0/16
! 413: start_action = start
! 414: }
! 415: }
! 416: }
! 417: }
! 418:
! 419: secrets {
! 420: eap-carol {
! 421: id = carol@strongswan.org
! 422: secret = Ar3etTnp
! 423: }
! 424: }
! 425:
! 426:
! 427: ### Roadwarrior Case with EAP Identity ###
! 428:
! 429: Often a client EAP identity is exchanged via EAP which differs from the
! 430: external IKEv2 identity. In this example the IKEv2 identity defaults to
! 431: the IPv4 address of the client.
! 432:
! 433: 10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x |
! 434: moon-net moon carol
! 435:
! 436: Configuration on gateway _moon_:
! 437:
! 438: /etc/swanctl/x509ca/strongswanCert.pem
! 439: /etc/swanctl/x509/moonCert.pem
! 440: /etc/swanctl/private/moonKey.pem
! 441:
! 442: /etc/swanctl/swanctl.conf:
! 443:
! 444: connections {
! 445: rw {
! 446: local {
! 447: auth = pubkey
! 448: certs = moonCert.pem
! 449: id = moon.strongswan.org
! 450: }
! 451: remote {
! 452: auth = eap-md5
! 453: eap_id = %any
! 454: }
! 455: children {
! 456: net-net {
! 457: local_ts = 10.1.0.0/16
! 458: }
! 459: }
! 460: send_certreq = no
! 461: }
! 462: }
! 463:
! 464: secrets {
! 465: eap-carol {
! 466: id = carol
! 467: secret = Ar3etTnp
! 468: }
! 469: eap-dave {
! 470: id = dave
! 471: secret = W7R0g3do
! 472: }
! 473: }
! 474:
! 475: Configuration on roadwarrior _carol_:
! 476:
! 477: /etc/swanctl/x509ca/strongswanCert.pem
! 478:
! 479: /etc/swanctl/swanctl.conf:
! 480:
! 481: connections {
! 482: home {
! 483: remote_addrs = moon.strongswan.org
! 484:
! 485: local {
! 486: auth = eap
! 487: eap_id = carol
! 488: }
! 489: remote {
! 490: auth = pubkey
! 491: id = moon.strongswan.org
! 492: }
! 493: children {
! 494: home {
! 495: local_ts = 10.1.0.0/16
! 496: start_action = start
! 497: }
! 498: }
! 499: }
! 500: }
! 501:
! 502: secrets {
! 503: eap-carol {
! 504: id = carol
! 505: secret = Ar3etTnp
! 506: }
! 507: }
! 508:
! 509:
! 510: ## Generating Certificates and CRLs ##
! 511:
! 512: This section is not a full-blown tutorial on how to use the strongSwan **pki**
! 513: tool. It just lists a few points that are relevant if you want to generate your
! 514: own certificates and CRLs for use with strongSwan.
! 515:
! 516:
! 517: ### Generating a CA Certificate ###
! 518:
! 519: The pki statement
! 520:
! 521: pki --gen --type ed25519 --outform pem > strongswanKey.pem
! 522:
! 523: generates an elliptic Edwards-Curve key with a cryptographic strength of 128
! 524: bits. The corresponding public key is packed into a self-signed CA certificate
! 525: with a lifetime of 10 years (3652 days)
! 526:
! 527: pki --self --ca --lifetime 3652 --in strongswanKey.pem \
! 528: --dn "C=CH, O=strongSwan, CN=strongSwan Root CA" \
! 529: --outform pem > strongswanCert.pem
! 530:
! 531: which can be listed with the command
! 532:
! 533: pki --print --in strongswanCert.pem
! 534:
! 535: subject: "C=CH, O=strongSwan, CN=strongSwan Root CA"
! 536: issuer: "C=CH, O=strongSwan, CN=strongSwan Root CA"
! 537: validity: not before May 18 08:32:06 2017, ok
! 538: not after May 18 08:32:06 2027, ok (expires in 3651 days)
! 539: serial: 57:e0:6b:3a:9a:eb:c6:e0
! 540: flags: CA CRLSign self-signed
! 541: subjkeyId: 2b:95:14:5b:c3:22:87:de:d1:42:91:88:63:b3:d5:c1:92:7a:0f:5d
! 542: pubkey: ED25519 256 bits
! 543: keyid: a7:e1:6a:3f:e7:6f:08:9d:89:ec:23:92:a9:a1:14:3c:78:a8:7a:f7
! 544: subjkey: 2b:95:14:5b:c3:22:87:de:d1:42:91:88:63:b3:d5:c1:92:7a:0f:5d
! 545:
! 546: If you prefer the CA private key and X.509 certificate to be in binary DER format
! 547: then just omit the `--outform pem` option. The directory `/etc/swanctl/x509ca`
! 548: contains all required CA certificates either in binary DER or in Base64 PEM
! 549: format. Irrespective of the file suffix the correct format will be determined
! 550: by strongSwan automagically.
! 551:
! 552:
! 553: ### Generating a Host or User End Entity Certificate ###
! 554:
! 555: Again we are using the command
! 556:
! 557: pki --gen --type ed25519 --outform pem > moonKey.pem
! 558:
! 559: to generate an Ed25519 private key for the host `moon`. Alternatively you could
! 560: type
! 561:
! 562: pki --gen --type rsa --size 3072 > moonKey.der
! 563:
! 564: to generate a traditional 3072 bit RSA key and store it in binary DER format.
! 565: As an alternative a **TPM 2.0** *Trusted Platform Module* available on every
! 566: recent Intel platform could be used as a virtual smartcard to securely store an
! 567: RSA or ECDSA private key. For details, refer to the TPM 2.0
! 568: [HOWTO](https://wiki.strongswan.org/projects/strongswan/wiki/TpmPlugin).
! 569:
! 570: In a next step the command
! 571:
! 572: pki --req --type priv --in moonKey.pem \
! 573: --dn "C=CH, O=strongswan, CN=moon.strongswan.org \
! 574: --san moon.strongswan.org --outform pem > moonReq.pem
! 575:
! 576: creates a PKCS#10 certificate request that has to be signed by the CA.
! 577: Through the [multiple] use of the `--san` parameter any number of desired
! 578: *subjectAlternativeNames* can be added to the request. These can be of the
! 579: form
! 580:
! 581: --san sun.strongswan.org # fully qualified host name
! 582: --san carol@strongswan.org # RFC822 user email address
! 583: --san 192.168.0.1 # IPv4 address
! 584: --san fec0::1 # IPv6 address
! 585:
! 586: Based on the certificate request the CA issues a signed end entity certificate
! 587: with the following command
! 588:
! 589: pki --issue --cacert strongswanCert.pem --cakey strongswanKey.pem \
! 590: --type pkcs10 --in moonReq.pem --serial 01 --lifetime 1826 \
! 591: --outform pem > moonCert.pem
! 592:
! 593: If the `--serial` parameter with a hexadecimal argument is omitted then a random
! 594: serial number is generated. Some third party VPN clients require that a VPN
! 595: gateway certificate contains the *TLS Server Authentication* Extended Key Usage
! 596: (EKU) flag which can be included with the following option
! 597:
! 598: --flag serverAuth
! 599:
! 600: If you want to use the dynamic CRL fetching feature described in one of the
! 601: following sections then you may include one or several *crlDistributionPoints*
! 602: in your end entity certificates using the `--crl` parameter
! 603:
! 604: --crl http://crl.strongswan.org/strongswan.crl
! 605: --crl "ldap://ldap.strongswan.org/cn=strongSwan Root CA, o=strongSwan,c=CH?certificateRevocationList"
! 606:
! 607: The issued host certificate can be listed with
! 608:
! 609: pki --print --in moonCert.pem
! 610:
! 611: subject: "C=CH, O=strongSwan, CN=moon.strongswan.org"
! 612: issuer: "C=CH, O=strongSwan, CN=strongSwan Root CA"
! 613: validity: not before May 19 10:28:19 2017, ok
! 614: not after May 19 10:28:19 2022, ok (expires in 1825 days)
! 615: serial: 01
! 616: altNames: moon.strongswan.org
! 617: flags: serverAuth
! 618: CRL URIs: http://crl.strongswan.org/strongswan.crl
! 619: authkeyId: 2b:95:14:5b:c3:22:87:de:d1:42:91:88:63:b3:d5:c1:92:7a:0f:5d
! 620: subjkeyId: 60:9d:de:30:a6:ca:b9:8e:87:bb:33:23:61:19:18:b8:c4:7e:23:8f
! 621: pubkey: ED25519 256 bits
! 622: keyid: 39:1b:b3:c2:34:72:1a:01:08:40:ce:97:75:b8:be:ce:24:30:26:29
! 623: subjkey: 60:9d:de:30:a6:ca:b9:8e:87:bb:33:23:61:19:18:b8:c4:7e:23:8f
! 624:
! 625: Usually, a Windows, OSX, Android or iOS based VPN client needs its private key,
! 626: its host or user certificate and the CA certificate. The most convenient way
! 627: to load this information is to put everything into a PKCS#12 container:
! 628:
! 629: openssl pkcs12 -export -inkey carolKey.pem \
! 630: -in carolCert.pem -name "carol" \
! 631: -certfile strongswanCert.pem -caname "strongSwan Root CA" \
! 632: -out carolCert.p12
! 633:
! 634: The strongSwan **pki** tool currently is not able to create PKCS#12 containers
! 635: so that **openssl** must be used.
! 636:
! 637:
! 638: ### Generating a CRL ###
! 639:
! 640: An empty CRL that is signed by the CA can be generated with the command
! 641:
! 642: pki --signcrl --cacert strongswanCert.pem --cakey strongswanKey.pem \
! 643: --lifetime 30 > strongswan.crl
! 644:
! 645: If you omit the `--lifetime` option then the default value of 15 days is used.
! 646: CRLs can either be uploaded to a HTTP or LDAP server or put in binary DER or
! 647: Base64 PEM format into the `/etc/swanctl/x509crl` directory from where they are
! 648: loaded into the **charon** daemon with the command
! 649:
! 650: swanctl --load-creds
! 651:
! 652:
! 653: ### Revoking a Certificate ###
! 654:
! 655: A specific end entity certificate is revoked with the command
! 656:
! 657: pki --signcrl --cacert strongswanCert.pem --cakey strongswanKey.pem \
! 658: --lifetime 30 --lastcrl strongswan.crl \
! 659: --reason key-compromise --cert moonCert.pem > new.crl
! 660:
! 661: Instead of the certificate file (in our example moonCert.pem), the serial number
! 662: of the certificate to be revoked can be indicated using the `--serial`
! 663: parameter. The `pki --signcrl --help` command documents all possible revocation
! 664: reasons but the `--reason` parameter can also be omitted. The content of the new
! 665: CRL file can be listed with the command
! 666:
! 667: pki --print --type crl --in new.crl
! 668:
! 669: issuer: "C=CH, O=strongSwan, CN=strongSwan Root CA"
! 670: update: this on May 19 11:13:01 2017, ok
! 671: next on Jun 18 11:13:01 2017, ok (expires in 29 days)
! 672: serial: 02
! 673: authKeyId: 2b:95:14:5b:c3:22:87:de:d1:42:91:88:63:b3:d5:c1:92:7a:0f:5d
! 674: 1 revoked certificate:
! 675: 01: May 19 11:13:01 2017, key compromise
! 676:
! 677:
! 678: ### Local Caching of CRLs ###
! 679:
! 680: The `strongswan.conf` option
! 681:
! 682: charon {
! 683: cache_crls = yes
! 684: }
! 685:
! 686: activates the local caching of CRLs that were dynamically fetched from an
! 687: HTTP or LDAP server. Cached copies are stored in `/etc/swanctl/x509crl` using a
! 688: unique filename formed from the issuer's *subjectKeyIdentifier* and the
! 689: suffix `.crl`.
! 690:
! 691: With the cached copy the CRL is immediately available after startup. When the
! 692: local copy has become stale, an updated CRL is automatically fetched from one of
! 693: the defined CRL distribution points during the next IKEv2 authentication.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>