pub YouXOR

SSH, OpenSSL, Iptables, RSYNC, RAID, VPN

 Charge moyenne sur 1mn : 0.36 Charge moyenne sur 5mn : 1.08 Charge moyenne sur 15mn : 0.93



How to protect a network, transmission, data?

Use a firewall, an anti-virus, back up your system regularly, use a secure disk system for your data. Use secure protocols such as HTTPs, FTPs, IMAPs, POPs, SMTPs





Site user blocks : Account info / user rights / summary

strongSwan v6.0.x for SWANCTL in IPsec by IKE VICI

  • strongSwan v6.0.x for SWANCTL in IPsec by IKE VICI
Comment configurer un VPN "strongSwan v6.0.x" en utilisant l'interface de contrôle IKE polyvalente moderne (VICI) et l'outil de ligne de commande swanctl dans un réseau IPsec, avec les outils pki et openssl pour une Post-Quantum Cryptography PQC conforme NIST.

Informations :

Dates
  • Publish : : Thursday 20 march 2025
  • Modification : Thursday 03 april 2025

  • 944 views

Share :

My StrongSwan 6.0.1 Configuration files n°7 (Open Quantum Safe OQS - Post-Quantum Cryptography PQC) - strongSwan - Docs - WiKi - GitHub

Je vais vous expliquer comment configurer "strongSwan v6.0.x" en utilisant l'interface de contrôle IKE polyvalente moderne (VICI) et l'outil de ligne de commande swanctl dans un réseau IPsec.

Nous créerons un VPN sûr et fortement sécurisé en utilisant IKEv2 et des échanges de clefs Post-Quantique utilisant de la Cryptographie visant à soutenir une cryptographie résistante aux attaques quantique.

Introduction :

On va commencer par installer le daemon "strongSwan version 6" qui implante les algorithmes ML-KEM (Module-Lattice-Based Key-Encapsulation Mechanism Standard) -- pq-crystals/kyber -- Kyber est un mécanisme d'encapsulation de clés (KEM) conçu pour résister aux attaques cryptanalytiques des futurs ordinateurs quantiques puissants.

Nous allons ensuite configurer un serveur "respondeur" puis des clients "initiateurs" - et cela en utilisant différents mécanismes de connexions et d'authentification. Comme nous le faisions avant, on utilisera l'authentification par certificats et clefs publiques puis en utilisant une paire "utilisateur/mot de passe" pour nos guerriers de la route, nos commerciaux, collaborateurs en déplacement (Road-Warriors) en protégeant leurs itinéraires jusqu'à vos/nos serveurs au travers d'une connexion sûre et sécurisée pour accéder aux ressources et services disponibles.

On n'est jamais sûr de qui peut écouter nos communications -- entre nous ; et la maison Mère, qu'on soit dans notre pays ou dans un autre.

Je vous le rappelle ; les réseaux privés virtuels ont étés conçus pour çà - Faire des liens sécurisés entre une "ambassade" ; un "maison blanche" ; et des participants et autres entités - Et non pas pour acheter des string d'éléphant au magasin des "Halles", en habitant Paris 1er à Chatelet.

Donc, si entre toi et ta chérie, si tu veut un truc sécurisé, stable et sûr pour accéder à tes ressources ; que tu sois en vacances ou non ; suit ce tuto !


Je sais que beaucoup d'entres vous ne sont pas trop orientés IPv6 mais je vais vous expliquer par la même occasion le réseau privé IPv6 que l'on nome "adressages ULA" comme adressage d'Unique Local Adresses, celles du LAN (Local Area Network). Vous connaissez sûrement les adresses GUA qu'on nomme "Global (pour tout internet) UniCast Addresse", celles d'Internet.

Pour une question de sécurité et de garder une/la connectivité des services déjà existant (sans devoir toucher au routage local IPv4) j'utilise des ULA IPv6.

Le réseau IPv6 LAN (Local Areas Network) regroupe différentes tranches d'adresses IP.

  • fc00::/7 : ULA - Unique-Local Unicast (Unique Local Address)
    Network range : fc00:0000:0000:0000:0000:0000:0000:0000-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
    Les adresses IPv6 locales.

  • fe80::/10 : LLU - Link-Local Unicast (Linked-Scoped Unicast)
    Network range : fe80:0000:0000:0000:0000:0000:0000:0000-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff
    Les liens IPv6 locaux entre connexions / liaisons.

  • fec0::/10 : SLA - Site-Local Address
    Network range : fec0:0000:0000:0000:0000:0000:0000:0000-feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
    Les adresses IPv6 locales inter-sites.

Vous pouvez vérifiez et créez vos réseaux (et sous-réseaux - level 1 à 7) en utilisant GestióIP : IPv4/IPv6 subnet calculator.


La tranche d'IPv6 "ff00::/8" à "Multi diffusions" permet d'avoir plusieurs ressources disponibles au sein d'un même réseau, et selon la provenance de la requête la ressource la plus proche répondera en premier.

  • ff00::/8 : Multicast - au sein d'un réseau IPv6::/64 et/ou "seulement" IPv6::/104
    Network range : ff00:0000:0000:0000:0000:0000:0000:0000-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
    En quelque sorte, tout ce qui se trouve sur le réseau local "FFXX:XXXX" accessible via des liens-locaux FE80:XXXX:: ou des machines locales FC00:XXXX ou entre sites locaux FEC0:XXXX

Adressage IP :

Je vais imaginez un réseau privé - simple - je vais le séparer en plusieurs sous-réseaux.

Je vais créer un adressage IPv6 qui ressemble à mon réseau IPv4 :

À la maison par exemple, j'ai mon réseau IPv4 en 192.168.1.0/24 (entre ma boxe ISP et mon ordinateur routeur) et des machines "serveurs" sur le réseau 172.16.0.0/16 et des "containers" sur le réseau 10.0.0.0/8, je vais créer mon réseau ULA de la même manière.

Je représente cela de cette manière :

  • fc01:0000:0000:0000:172:16:0-31:0/XXX : les machines serveurs physiques.
  • fc01:0000:0000:0000:10:0:0:0/XXX : les machines virtuelles et les containers.
  • fc01:0000:0000:0000:192:168:0:0/XXX : les machines physiques connectées directement à la boxe internet.

Sur un serveur, j'ai accès à un block IPv6::/64 GUA, je vais représenter les adresses ULA comme le block GUA :

Le bloc IPv6::/64 GUA Adresses d'OVH Cloud :

  • 2607:5300:0060:9389:0000:0000:0000:0000/64

Un bloc IPv6::/64 ULA Adresses que je choisis pour les adresses locales des "services" :

  • fc00:5300:0060:9389:0000:0000:0000:0000/64

Pour information, dans un seul bloc IPv6::/64 on peut attribuer un maximum de 18,446,744,073,709,551,616 adresses IPv6::/128 dans la range IPv6 fc00:5300:0060:9389:0000:0000:0000:0000 à FC00:5300:0060:9389:FFFF:FFFF:FFFF:FFFF.


Donc comme je vous le signaler plus haut, je vais adapter ma configuration à celle de l'IPv4.

Par exemple :

  • Pour une machine avec l'IPv4 10.6.42.10, elle aura l'IPv6 suivante fc01:0000:0000:0000:10:6:42:10
  • Pour une machine avec l'IPv4 192.168.1.88, elle aura l'IPv6 suivante fc01:0000:0000:0000:192:168:1:88

Je vous laisse configurer votre réseau IPv6 ULA ;)


Installation de strongSwan v6.0.x

On télécharge la dernière version (actuellement la v6.0.1), on la "de-bzip", on la configure, et on l'installe.

Script avec 13 lignes

001root@server:~ # wget -4 https://github.com/strongswan/strongswan/releases/download/6.0.1/strongswan-6.0.1.tar.bz2
002root@server:~ # tar xjf strongswan-6.0.1.tar.bz2
003root@server:~ # cd strongswan-6.0.1
004root@server:~/strongswan-6.0.1 # ./configure --prefix=/usr --sysconfdir=/etc --with-systemdsystemunitdir=/lib/systemd/system --disable-ikev1 --enable-attr --enable-silent-rules --enable-charon --enable-ikev2 --enable-vici --enable-swanctl --enable-nonce --enable-random --enable-drbg --enable-openssl --enable-ml --enable-pem --enable-x509 --enable-certexpire --enable-constraints --enable-whitelist --enable-revocation --enable-pki --enable-pubkey --enable-socket-default --enable-kernel-netlink --enable-resolve --enable-eap-identity --enable-eap-md5 --enable-eap-mschapv2 --enable-eap-dynamic --enable-eap-tls --enable-eap-ttls --enable-eap-radius --enable-eap-peap --enable-xauth-eap  --enable-dhcp --enable-addrblock --enable-eap-tnc --enable-unity --enable-updown --enable-radattr --enable-ha
005
006 strongSwan will be built with the following plugins
007-----------------------------------------------------
008libstrongswan: random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pgp dnskey sshkey pem openssl pkcs8 xcbc cmac kdf ml drbg
009libcharon:     attr kernel-netlink resolve socket-default vici updown eap-identity eap-md5 eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap eap-tnc xauth-eap dhcp ha whitelist certexpire radattr addrblock unity counters
010libtnccs:      tnc-tnccs
011libtpmtss:
012
013root@server:~/strongswan-6.0.1 # make && make install

À default, je fais un script personnel d'init sur le "binaire" :

Script avec 99 lignes

001root@server:~/strongswan-6.0.1 # cat /root/strongSwan-v6.sh
002#!/bin/bash
003### BEGIN INIT INFO
004# Provides:          charon
005# Required-Start:    $remote_fs $syslog
006# Required-Stop:     $remote_fs $syslog
007# Default-Start:     2 3 4 5
008# Default-Stop:      0 1 6
009# Short-Description: Start daemon at boot time
010# Description:       Enable service provided by daemon.
011### END INIT INFO
012#####-------------------------- VARIABLES ----------------------------######
013
014# Author : O.Romain.Jaillet-ramey (orj at lab3w dot fr)
015# Date : 2025/03/15
016# Desc : My script strongSwan 6.x.x for status|start|stop|restart
017
018
019#####-------------------------- START / STOP ----------------------------######
020case "$1" in
021
022start|restart)
023$0 stop
024echo "$0 Starting"
025        /usr/libexec/ipsec/charon 1>>/var/log/syslog 2>/dev/null 2>&1 &
026;;
027
028stop)
029        echo "$0 Stop"
030
031                /usr/sbin/ip -6 route flush table 220
032                /usr/sbin/ip -4 route flush table 220
033
034                /usr/sbin/ip -6 xfrm policy flush
035                /usr/sbin/ip -4 xfrm policy flush
036
037                /usr/sbin/ip -6 xfrm state flush
038                /usr/sbin/ip -4 xfrm state flush
039
040                pkill charon
041        ;;
042status)
043        echo "$0 Status"
044                echo "# -------------------------"
045                echo "# Security Association"
046                echo "# -------"
047                echo ""
048
049                swanctl --list-sas
050
051                echo ""
052                echo "# -------"
053                echo ""
054
055                echo "# -------------------------"
056                echo "# Route show"
057                echo "# -------"
058                echo ""
059
060                /usr/sbin/ip -6 route show table 220
061                /usr/sbin/ip -4 route show table 220
062
063                echo ""
064                echo "# -------"
065                echo ""
066
067                echo "# -------------------------"
068                echo "# XFRM Policy"
069                echo "# -------"
070                echo ""
071
072                /usr/sbin/ip -6 xfrm policy
073                /usr/sbin/ip -4 xfrm policy
074
075                echo ""
076                echo "# -------"
077                echo ""
078
079                echo "# -------------------------"
080                echo "# XFRM State"
081                echo "# -------"
082                echo ""
083
084                /usr/sbin/ip -6 xfrm state
085                /usr/sbin/ip -4 xfrm state
086
087                echo ""
088                echo "# -------"
089                echo ""
090
091        ;;
092
093*)
094echo "usage : $0 (status|start|stop|restart)"
095;;
096
097esac
098
099#####-------------------------- START / STOP ----------------------------######

Script avec 7 lignes

001root@server:~/strongswan-6.0.1 # chmod u+x /root/strongSwan-v6.sh
002root@server:~/strongswan-6.0.1 # ls -l /root/strongSwan-v6.sh
003-rwxr--r-- 1 root root 1303 26 févr. 17:21 /root/strongSwan-v6.sh
004
005root@server:~/strongswan-6.0.1 # /root/strongSwan-v6.sh restart
006/root/strongSwan-v6.sh Stop
007/root/strongSwan-v6.sh Starting

Script avec 2 lignes

001root@server:~/strongswan-6.0.1 # swanctl --version
002strongSwan swanctl 6.0.1

Un fois le démon "strongSwan v6.0.x" installé, on se retrouve avec cette arborescence et le fichier "/etc/strongswan.conf" :

Script avec 20 lignes

001root@server:~/strongswan-6.0.1 # cd /etc/swanctl
002root@server:/etc/swanctl # tree
003.
004├── conf.d
005├── ecdsa
006├── p12
007├── pkcs12
008├── pkcs8
009├── private
010├── pubkey
011├── rsa
012├── syslog
013├── x509
014├── x509aa
015├── x509ac
016├── x509ca
017├── x509crl
018└── x509ocsp
019
02014 directories, 0 file

On vérifie les algorithmes de cryptographies ; on s'appercoit que les algorithmes d'encryption de clefs ML-KEM sont présents --enable-ml dans les options d'installation :

Script avec 107 lignes

001root@server:/etc/swanctl # swanctl --list-algs
002encryption:
003  AES_CBC[openssl]
004  AES_CTR[openssl]
005  AES_ECB[openssl]
006  AES_CFB[openssl]
007  CAMELLIA_CBC[openssl]
008  CAMELLIA_CTR[openssl]
009  CAST_CBC[openssl]
010  BLOWFISH_CBC[openssl]
011  3DES_CBC[openssl]
012  DES_CBC[openssl]
013  DES_ECB[openssl]
014  NULL[openssl]
015integrity:
016  HMAC_MD5_96[openssl]
017  HMAC_MD5_128[openssl]
018  HMAC_SHA1_96[openssl]
019  HMAC_SHA1_128[openssl]
020  HMAC_SHA1_160[openssl]
021  HMAC_SHA2_256_128[openssl]
022  HMAC_SHA2_256_256[openssl]
023  HMAC_SHA2_384_192[openssl]
024  HMAC_SHA2_384_384[openssl]
025  HMAC_SHA2_512_256[openssl]
026  HMAC_SHA2_512_512[openssl]
027  CAMELLIA_XCBC_96[xcbc]
028  AES_XCBC_96[xcbc]
029  AES_CMAC_96[cmac]
030aead:
031  AES_GCM_16[openssl]
032  AES_GCM_12[openssl]
033  AES_GCM_8[openssl]
034  AES_CCM_16[openssl]
035  AES_CCM_12[openssl]
036  AES_CCM_8[openssl]
037  CHACHA20_POLY1305[openssl]
038hasher:
039  HASH_SHA1[openssl]
040  HASH_MD5[openssl]
041  HASH_MD4[openssl]
042  HASH_SHA2_224[openssl]
043  HASH_SHA2_256[openssl]
044  HASH_SHA2_384[openssl]
045  HASH_SHA2_512[openssl]
046  HASH_SHA3_224[openssl]
047  HASH_SHA3_256[openssl]
048  HASH_SHA3_384[openssl]
049  HASH_SHA3_512[openssl]
050  HASH_IDENTITY[openssl]
051prf:
052  PRF_KEYED_SHA1[openssl]
053  PRF_HMAC_MD5[openssl]
054  PRF_HMAC_SHA1[openssl]
055  PRF_HMAC_SHA2_256[openssl]
056  PRF_HMAC_SHA2_384[openssl]
057  PRF_HMAC_SHA2_512[openssl]
058  PRF_AES128_XCBC[xcbc]
059  PRF_CAMELLIA128_XCBC[xcbc]
060  PRF_AES128_CMAC[cmac]
061xof:
062  XOF_SHAKE128[openssl]
063  XOF_SHAKE256[openssl]
064kdf:
065  KDF_PRF[kdf]
066  KDF_PRF_PLUS[kdf]
067drbg:
068  DRBG_CTR_AES128[drbg]
069  DRBG_CTR_AES192[drbg]
070  DRBG_CTR_AES256[drbg]
071  DRBG_HMAC_SHA1[drbg]
072  DRBG_HMAC_SHA256[drbg]
073  DRBG_HMAC_SHA384[drbg]
074  DRBG_HMAC_SHA512[drbg]
075ke:
076  MODP_3072[openssl]
077  MODP_4096[openssl]
078  MODP_6144[openssl]
079  MODP_8192[openssl]
080  MODP_2048[openssl]
081  MODP_2048_224[openssl]
082  MODP_2048_256[openssl]
083  MODP_1536[openssl]
084  MODP_1024[openssl]
085  MODP_1024_160[openssl]
086  MODP_768[openssl]
087  MODP_CUSTOM[openssl]
088  ECP_256[openssl]
089  ECP_384[openssl]
090  ECP_521[openssl]
091  ECP_224[openssl]
092  ECP_192[openssl]
093  ECP_256_BP[openssl]
094  ECP_384_BP[openssl]
095  ECP_512_BP[openssl]
096  ECP_224_BP[openssl]
097  CURVE_25519[openssl]
098  CURVE_448[openssl]
099  ML_KEM_512[ml]
100  ML_KEM_768[ml]
101  ML_KEM_1024[ml]
102rng:
103  RNG_WEAK[openssl]
104  RNG_STRONG[random]
105  RNG_TRUE[random]
106nonce-gen:
107  NONCE_GEN[nonce]

Il existe plusieurs options "swanctl" pour "lire" ou "charger" etc. des éléments du démon (service) strongSwan.

  • swanctl --list-sas : Liste les SA (Security Associations)
  • swanctl --list-conns : Liste les Connexions - çà permet de vérifier les modes d'authentification.
  • swanctl --list-certs : Liste les certificats SSL/TLS
  • swanctl --list-pools : Liste les piscines networks
  • swanctl --reload-settings : (Re)charger le "service entier" et le fichier "/etc/strongswan.conf"
  • swanctl --load-conns : (Re)charger les fichiers des connexions.
  • swanctl --load-pools : (Re)charger les piscines (adresses IP des clients).
  • swanctl --load-creds : (Re)charger les paires "utilisateurs/mots de passe" etc.

Et d'autres options "swanctl" :

Script avec 30 lignes

001root@server:/etc/swanctl # swanctl --help
002strongSwan 6.0.1 swanctl
003loaded plugins: random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pgp dnskey sshkey pem openssl pkcs8 xcbc cmac kdf ml drbg
004usage:
005  swanctl --counters         (-C)  list or reset IKE event counters
006  swanctl --initiate         (-i)  initiate a connection
007  swanctl --terminate        (-t)  terminate a connection
008  swanctl --rekey            (-R)  rekey an SA
009  swanctl --redirect         (-d)  redirect an IKE_SA
010  swanctl --uninstall        (-u)  uninstall a trap or shunt policy
011  swanctl --install          (-p)  install a trap or shunt policy
012  swanctl --list-sas         (-l)  list currently active IKE_SAs
013  swanctl --monitor-sa       (-m)  monitor for IKE_SA and CHILD_SA changes
014  swanctl --list-pols        (-P)  list currently installed policies
015  swanctl --list-authorities (-B)  list loaded authority configurations
016  swanctl --list-conns       (-L)  list loaded configurations
017  swanctl --list-certs       (-x)  list stored certificates
018  swanctl --list-pools       (-A)  list loaded pool configurations
019  swanctl --list-algs        (-g)  show loaded algorithms
020  swanctl --flush-certs      (-f)  flush cached certificates
021  swanctl --load-all         (-q)  load credentials, authorities, pools and connections
022  swanctl --load-authorities (-b)  (re-)load authority configuration
023  swanctl --load-conns       (-c)  (re-)load connection configuration
024  swanctl --load-creds       (-s)  (re-)load credentials
025  swanctl --load-pools       (-a)  (re-)load pool configuration
026  swanctl --log              (-T)  trace logging output
027  swanctl --version          (-v)  show version information
028  swanctl --stats            (-S)  show daemon stats information
029  swanctl --reload-settings  (-r)  reload daemon strongswan.conf
030  swanctl --help             (-h)  show usage information

Pour démarer ou terminer une SA (Association de Securité entre sites) :

  • swanctl --initiate : Pour démarer une Association de Securité ; soit d'une "IKE", soit d'une association "enfant" selon le type d'authentification ESP.
  • swanctl --terminate : Pour terminer une Association de Securité ; soit d'une "IKE", soit d'une association "enfant" selon le type d'authentification ESP.

Maintenant que vous avez un apercus de la commande "swanctl" ; nous allons configurer le "service" pour qu'il fonctionne :

Configuration de strongSwan v6.0.x

On va commencer par le fichier "/etc/strongswan.conf" qui permet de configurer les logs et le level des logs ; entre autres.

Je vous colle la configuration de mon serveur ; c'est plus simple pour la compréhension ; en cas de mise à jour future (au cas où ; je changerais de valeurs etc).

Script avec 144 lignes

001root@server:/etc/swanctl # cat /etc/strongswan.conf
002# strongSwan configuration file
003#filelog {
004#  charon-debug-log {
005#    path = /var/log/charon_debug.log
006#    time_format = %a, %Y-%m-%d, %H:%M:%S
007#    default = 2
008#    net = 1
009#    enc = 1
010#    asn = 1
011#    job = 1
012#    ike_name = yes
013#    append = no
014#    flush_line = yes
015#  }
016#}
017
018charon {
019
020#       load_modular = yes
021        plugins {
022               include strongswan.d/charon/*.conf
023
024                eap-dynamic {
025#                       prefer_user = yes
026#                       preferred = eap-ttls, eap-tls, eap-mschapv2, eap-md5, psk
027                        preferred = eap-mschapv2, eap-tls, eap-ttls
028                }
029                eap-tls {
030                        fragment_size = 512
031                }
032        }
033
034        start-scripts {
035                creds = swanctl --load-creds
036                conns = swanctl --load-conns
037                pools = swanctl --load-pools
038        }
039
040#        eap-dynamic {
041#                prefer_user = yes
042#                preferred = tls, mschapv2
043#        }
044
045        send_vendor_id = yes
046        prefer_configured_proposals = yes
047        fragment_size = 1480
048        max_packet = 30000
049
050#        install_routes = no
051#        install_virtual_ip = yes
052#       install_virtual_ip_on = vti1
053#       interfaces_use = vti0
054#       interfaces_ignore = enp3s0
055
056  # two defined file loggers
057  filelog {
058    charon {
059      # path to the log file, specify this as section name in versions prior to 5.7.0
060      path = /var/log/charon.log
061      # add a timestamp prefix
062      time_format = %b %e %T
063      # prepend connection name, simplifies grepping
064      ike_name = yes
065      # overwrite existing files
066      append = no
067      # increase default loglevel for all daemon subsystems
068      default = 1 #2
069      # flush each line to disk
070      flush_line = yes
071    }
072    stderr {
073        # more detailed loglevel for a specific subsystem, overriding the
074        # default loglevel.
075
076        # applications other than daemons
077        app = -1
078        # Low-level encoding/decoding (ASN.1, X.509 etc.)
079        asn = -1
080        # Configuration management and plugins
081        cfg = -1
082        # CHILD_SA/IPsec SA
083        chd = -1
084        # Main daemon setup/cleanup/signal handling
085        dmn = -1
086        # Packet encoding/decoding encryption/decryption operations
087        enc = -1
088        # libipsec library messages
089        esp = 2
090        # IKE_SA/ISAKMP SA
091        ike = 2 # 2
092        # Integrity Measurement Collector
093        imc = -1
094        # Integrity Measurement Verifier
095        imv = -1
096        # Jobs queuing/processing and thread pool management
097        job = -1
098        # IPsec/Networking kernel interface
099        knl = -1
100        # libstrongswan library messages
101        lib = -1
102        # IKE_SA manager, handling synchronization for IKE_SA access
103        mgr = -1
104        # IKE network communication
105        net = -1
106        # Platform Trust Service
107        pts = -1
108        # libtls library messages
109        tls = -1
110        # Trusted Network Connect
111        tnc = -1
112    }
113  }
114
115  # and two loggers using syslog
116  syslog {
117    # prefix for each log message
118    identifier = charon-custom
119    # use default settings to log to the LOG_DAEMON facility
120    daemon {
121    }
122    # very minimalistic IKE auditing logs to LOG_AUTHPRIV
123    auth {
124      default = -1
125      ike = 0
126    }
127  }
128 # ...
129
130}
131
132include strongswan.d/*.conf
133
134pki {
135#       load = plugins: random drbg x509 pubkey pkcs1 pkcs8 pkcs12 pem openssl oqs
136#       load = plugins: random nonce aes sha1 sha2 pem pkcs1 curve25519 gmp x509 curl revocation hmac kdf stroke kernel-netlink socket-default updown
137#       load = plugins: random nonce aes sha1 sha2 pem pubkey pkcs1 pkcs8 pkcs12 curve25519 drbg oqs gmp x509 curl revocation hmac kdf stroke kernel-netlink socket-default updown
138}
139
140# for strongSwan 5.9
141#libtls {
142#        version_max = 1.3
143#        suites = TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384
144#}
  • strongSwan Docs / Configuration / Configuration Files / strongswan.conf
  • strongSwan Docs / Configuration / Configuration Files / swanctl.conf
  • strongSwan Docs / Configuration / Logging
  • strongSwan Docs / Configuration / TLS Options

On va continuer par le fichier "/etc/swanctl/swanctl.conf" qui permet de configurer les connexions, les pools, les authoritées ; entre autres.

Je vous colle la configuration de mon serveur ; c'est plus simple pour la compréhension ; en cas de mise à jour future (au cas où ; j'ajouterais des "connexions" etc).

Script avec 72 lignes

001root@server:/etc/swanctl # cat swanctl.conf
002connections {
003
004        include conf.d/ca-fr.conf
005        include conf.d/ca-uk.conf
006        include conf.d/ca-de.conf
007
008        include conf.d/ikev2-pubkey.conf
009        include conf.d/ikev2-eap.conf
010        include conf.d/ikev2-eap-mschapv2.conf
011        include conf.d/ikev2-eap-tls-symmetric.conf
012        include conf.d/ikev2-eap-tls-asymmetric.conf
013
014}
015
016authorities {
017        ZW3BCyberRootCA_rsa_3072 {
018                cacert = LAB3W_ZW3B-caCert-rsa_3072.pem
019#               crl_uris = http://ip6-winnetou.strongswan.org/strongswan.crl
020        }
021}
022
023pools {
024
025        rw_pool {
026                addrs = 172.16.8.100-172.16.8.110
027                dns = 10.105.150.1, 8.8.4.4
028        }
029        rw_pool-v6 {
030                addrs = fec0::eeee:1ab3:00ca:d000-fec0::eeee:1ab3:00ca:d0ff
031                dns =   fc00:5300:60:9389:15:2:a:1000, 2001:4860:4860::8844
032        }
033
034        # IP HOME
035        v6-lab3w_2home {
036                addrs = fec1::1/16
037        }
038
039        # IP VPS
040        v6_vps-uk {
041                addrs = fec2::1/128
042        }
043        v6_vps-de {
044                addrs = fec3::1/128
045        }
046
047}
048
049secrets {
050#       private-orj {
051#               file = private/orj-Key-rsa_3072.pem
052#       }
053        # Pre-Shared Key
054        ike-0 {
055                id = nomade
056                secret = 1234
057        }
058        eap-0 {
059                id = nomade
060                secret = 1234
061        }
062
063        # Extensible Authentication Protocol
064        eap-1 {
065                id = orj@lab3w.fr
066                secret = 1234
067        }
068
069}
070
071# Include config snippets
072include conf.d/*.conf

Pour vous expliquer ; j'ai 3 connexions entre sites "CA <*> FR" ; "CA <*> UK" ; "CA <*> DE" et des connexions de type "nomades/voyageurs" (Road-Warriors) sur lesquelles n'importent qui peut se connecter et utiliser une des méthodes d'authentification spécifiques.

Script avec 13 lignes

001connections {
002
003        include conf.d/ca-fr.conf
004        include conf.d/ca-uk.conf
005        include conf.d/ca-de.conf
006
007        include conf.d/ikev2-pubkey.conf
008        include conf.d/ikev2-eap.conf
009        include conf.d/ikev2-eap-mschapv2.conf
010        include conf.d/ikev2-eap-tls-symmetric.conf
011        include conf.d/ikev2-eap-tls-asymmetric.conf
012
013}

Les "connections {}"

Les "connections {}" permettent de "configurer" différentes "connexions" selon une IP ou un type d'authentification pour créer une SA (Association de Sécurité entre 2 entités).

Les fichiers "ca-fr.conf", "ca-uk.conf" et "ca-de.conf" sont identiques, mise à part l'adresse IP autorisée à se connecter, le certificat et les "réseaux disponibles".

Les fichiers "ikev2-*.conf" sont différents, selon la méthode d'authentifications. Ils permettent de pouvoir accéder au SLAN (Secure LAN) ; et à Internet depuis le serveur.

Les "authorities {}"

Les "authorities {}" permettent de "valider" que les Certificats SSL/TLS clients sont fiables, liées à cette AC justement, les CTRL permettent de vérifier en temps réel qu'un certificat est obsolète (révoquer ou expirer) .

Les "pools {}"

Les "pools {}" d'adresses réseaux, permettent de déclarer les adresses IP allouées aux clients.

Vous remarquez que j'ai déclaré l'adresse IP "fec2::1/128" pour mon "VPS de Grande-Bretagne" ; l'adresse IP "fec3::1/128" pour mon "VPS d'Allemagne" et l'adresse IP "fec1::1/16" pour chez moi (j'ai plusieurs machines et/ou possibilité d'avoir plusieurs IPv6::/128 dans ce bloc "fec1::/16".

Vous remarquez aussi que pour les connexions RW (Road-Warriors), j'envoie des adresses automatique sur un réseau IPv6::/120 - Entre fec0::eeee:1ab3:00ca:d000 et fec0::eeee:1ab3:00ca:d0ff dans le bloc du serveur qui est donc ; fec0::1/16 (il faudra configurer manuellement l'interface réseau avec cette IPv6 SLA).

Les "secrets {}"

Les "secrets {}" permettent de "configurer" des paires "utilisateur/mot de passe".

Configuration d'une connexion "auth = pubkey" sur le serveur CA (respondeur) :

Je vais vous détailler le fichier "conf.d/ca-fr.conf" qui permet de rallier le "CAnada" à la "France".

Je vous colle la configuration de mon serveur ; c'est plus simple pour la compréhension ; en cas de mise à jour future (au cas où ; je changerais des "valeurs" etc).

Script avec 72 lignes

001root@server:/etc/swanctl # cat conf.d/ca-fr.conf
002ca-fr {
003        remote_addrs = 90.5.102.244
004
005        # Addresses (pools) to declare for this connection
006        pools = v6-lab3w_2home
007
008        local {
009                auth = pubkey
010                id = srv.ca.lab3w.com
011#                certs = srv.ca.lab3w.com-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
012                pubkeys = srv.ca.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
013        }
014        remote {
015                auth = pubkey
016                id = gate.fr.lab3w.com
017#               certs = gate.fr.lab3w.com-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
018                pubkeys = gate.fr.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
019        }
020        children {
021                ca-fr {
022#                       mode = transport
023
024                        # All networks available by this server except of course those of this client (remote_ts)
025                        local_ts = fec0::1/16, fc00:5300:60:9389::/64, fec2::1/128, fc00:41d0:801:2000::/64, fec3::1/128, fc00:41d0:701:1100::/64
026
027                        remote_ts = fec1::1/16, fc01::10:106:42:0/104, fc01::10:126:42:0/112, fc01::172:16:0:0/104, fc01::192:168:8:0/104
028
029                        start_action = trap
030
031                        #--------------------------------
032                        # ESP
033                        #-------
034
035                        # Integrity Protection Only
036#                       esp_proposals = aes256gmac-ecp384
037
038                        # Integrity Protection and Confidentiality
039#                       esp_proposals = aes256gcm16-ecp384
040#                       esp_proposals = aes256-prfsha384-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024
041                        esp_proposals = aes256gcm16-prfsha384-x25519-x448-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024
042
043                        #---------------------------------
044
045                        rekey_time = 5400 # 90min
046#                        rekey_time = 180 # 3min
047                        rekey_bytes = 500000000
048                        rekey_packets = 1000000
049
050                }
051        }
052
053        #--------------------------------
054        # IKE
055        #-------
056
057        version = 2
058        dpd_delay = 60s
059
060        # AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256
061#       proposals = default
062
063        # Integrity Protection Only
064#       proposals = aes256-sha384-ecp384
065
066        # Integrity Protection and Confidentiality
067#       proposals = aes256gcm16-prfsha384-ecp384
068        proposals = aes256gcm16-prfsha384-x25519-x448-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024
069
070        #--------------------------------
071
072}

Dans le fichier "conf.d/ca-fr.conf" j'ai le nom de ma connexion "IKE" qui se nomme "ca-fr {}" avec l'adresse distante autorisée à se connecter "remote_addrs" sur laquelle j'attribue une adresse IPv4 et/ou IPv6 "pools" en utilisant IKE version 2 et en utilisant les algorithmes "proposals" suivant : aes256gcm16-prfsha384-x25519-x448-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024 pour l'intégrité des données et leur confidentialités.

Dans le fichier "conf.d/ca-fr.conf" j'ai pour les 2 parties "local" et "remote" le mode d'authentification IKE qui est ici en "clef publique" ; "auth = pubkey" où il faut obligatoirement un "id" (CN - Nom Commun) et une "pubkeys" (clef publique de certificat).

Dans le fichier "conf.d/ca-fr.conf" j'ai une Association de Sécurité enfant (children) par une ESP (children {}) qui porte le même nom que ma connexion "IKE" qui se nomme "ca-fr {}" où je peut configurer les réseaux locaux "local_ts" et les réseaux clients "remote_ts" ; et bien entendu les types d'algorithmes de cryptographie "esp_proposals" souhaitable pour cette connexion.

Configuration d'une connexion "auth = pubkey" sur le serveur FR (initiateur) :

Sur un initiateur mon répertoire "/etc/swanctl/" ressemble à cela - J'ai dû envoyer du "server" à "l'initiator" par scp les certificats et la clef publique - La private Key n'est pas obligatoire sur cette machine.

Script avec 25 lignes

001root@initiator:/etc/swanctl # tree
002.
003├── conf.d
004│   └── fr-ca.conf
005├── ecdsa
006├── pkcs12
007├── pkcs8
008├── private
009│   └── gate.fr.lab3w.com-Key-ed448.pem
010├── pubkey
011│   ├── gate.fr.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
012│   └── srv.ca.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
013├── rsa
014├── swanctl.conf
015├── syslog
016├── x509
017│   └── gate.fr.lab3w.com-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
018├── x509aa
019├── x509ac
020├── x509ca
021│   └── LAB3W_ZW3B-caCert-rsa_3072.pem
022├── x509crl
023└── x509ocsp
024
02514 directories, 8 files

Sans vous décrire les détails à l'écris ; c'est le même fichier que celui ci-dessus ; en inversant les valeurs de "local_ts" et "remote_ts" avec en plus "vips = ::0" puisque je souhaite attraper/configurer le "pools = v6-lab3w_2home" sur la connexion automatiquement.

Je vous colle la configuration de mon serveur Français ; c'est plus simple pour la compréhension ; en cas de mise à jour future (au cas où ; je changerais des "valeurs" etc).

Script avec 69 lignes

001root@initiator:/etc/swanctl # cat conf.d/fr-ca.conf
002fr-ca {
003        remote_addrs = 158.69.126.137
004        
005        # Request to receive the IPv6 address of the pool configured on the server (responder) on this machine (on the network interface)
006        vips = ::0
007
008        local {
009                auth = pubkey
010                id = gate.fr.lab3w.com
011                certs = gate.fr.lab3w.com-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
012#               pubkeys = gate.fr.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
013        }
014        remote {
015                auth = pubkey
016                id = srv.ca.lab3w.com
017                pubkeys = srv.ca.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
018        }
019        children {
020                 fr-ca {
021#                       mode = transport
022
023                        # All networks available by server « global »
024                        remote_ts = fec0::1/16, fc00:5300:60:9389::/64, fec2::1/128, fc00:41d0:801:2000::/64, fec3::1/128, fc00:41d0:701:1100::/64
025
026                        # IPs on this client
027                        local_ts  = fec1::1/16, fc01::172:16:0:0/104, fc01::10:106:42:0/104, fc01::10:126:42:0/112, fc01::192:168:8:0/104
028
029                        start_action = trap
030
031                        #--------------------------------
032                        # ESP
033                        #-------
034
035                        # Integrity Protection Only
036#                       esp_proposals = aes256gmac-ecp384
037
038                        # Integrity Protection and Confidentiality
039#                       esp_proposals = aes256gcm16-ecp384
040#                       esp_proposals = aes256-prfsha384-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024
041                        esp_proposals = aes256gcm16-prfsha384-x25519-x448-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024
042
043                        #---------------------------------
044
045                        rekey_time = 5400 # 90min
046#                        rekey_bytes = 500000000
047#                        rekey_packets = 1000000
048                }
049        }
050
051        #--------------------------------
052        # IKE
053        #-------
054
055        version = 2
056        dpd_delay = 60s
057
058        rekey_time = 0s
059
060        # Integrity Protection Only
061#       proposals = aes256-sha384-ecp384
062
063        # Integrity Protection and Confidentiality
064#       proposals = aes256gcm16-prfsha384-ecp384
065        proposals = aes256gcm16-prfsha384-x25519-x448-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024
066
067        #--------------------------------
068
069}

Pour précision ; sur la machine de FRance (initiator) j'ai le même fichier "/etc/strongswan.conf" et le fichier "/etc/swanctl/swanctl.conf" qui ressemble à çà - avec une seule connexion vers le serveur CAnadien - Personne ne se connecte sur cette machine dirais-je :

Script avec 23 lignes

001root@initiator:/etc/swanctl # cat swanctl.conf
002connections {
003
004        include conf.d/fr-ca.conf
005}
006
007authorities {
008        strongswan {
009                cacert = LAB3W_ZW3B-caCert-rsa_3072.pem
010#               crl_uris = http://ip6-winnetou.strongswan.org/strongswan.crl
011        }
012}
013
014pools {
015
016
017}
018secrets {
019
020}
021
022# Include config snippets
023include conf.d/*.conf

Avec ceci ; je pense que vous arriverez à vous créer une connexion "inter-sites" ; il ne manque plus qu'à créer les certificats SSL pour que çà fonctionne ; Nous allons utiliser la commande "pki" (fournit avec strongSwan v6) et/ou "openssl".

J'ai mis l'ensemble de mes fichiers de configurations n°7 de strongSwan v6.0.x ; du serveur CA ; FR ; DE ; UK - Sur cette page c'est difficile.

Création des certificats SSL/TLS - de l'Autorité de certification et des certificats pour les clients.

Nous allons créer une AC (Autorité de Certifications), un certificat SSL client Linux, puis un certificat SSL pour des clients Smartphones ou Windows -- Il faut faire en sorte que d'anciens OS (Systèmes d'exploitation) puissent valider le certificats de notre AC et ceux de nos clients "nomade" ; pour les serveurs on peut configurer de puissant algorithmes ; tout va pour le mieux.

Créer une Autorité de Certificats auto-signé (sans intermédiaire)

Je vais me créais une AC (Autorité de Certifications) en RSA 3072 bits ; on pourrait aussi bien la faire en 4096 bits.

Création de la clef de l'autorité de certificats

Instructions sur la documentation strongSwan : pki --gen - https://docs.strongswan.org/docs/latest/pki/pkiGen.html

Script avec 1 ligne

001root@server:/etc/swanctl # pki --gen --type rsa --size 3072 --outform pem > private/CAkey_LAB3W-RSA3072.pem

Script avec 7 lignes

001# D'autres exemples : 
002#pki --gen --type rsa --size 4096 --outform pem > private/caKey-rsa_4096.pem
003#pki --gen --type ecdsa --size 384 --outform pem > private/caKey-ecdsa_384.pem
004#pki --gen --type ed25519 --outform pem > private/caKey-ed25519.pem
005#pki --gen --type ed448 --outform pem > private/caKey-ed448.pem
006#algo non valider NIST dans la version 6 beta6 de strongswan
007#pki --gen --type falcon1024 --outform pem > private/caKey-falcon1024.pem
Création du certificat de l'autorité (certificat auto-signé)

Instructions sur la documentation strongSwan : pki --self - https://docs.strongswan.org/docs/latest/pki/pkiSelf.html

Script avec 1 ligne

001root@server:/etc/swanctl # pki --self --ca --type rsa --in private/CAkey_LAB3W-RSA3072.pem --lifetime 3652 --dn "C=FR, O=LAB3W, CN=LAB3W Cyber Root CA : RSA3072" --outform pem > x509ca/CAcert_LAB3W-RSA3072.pem

Script avec 7 lignes

001# D'autres exemples : 
002#pki --self --ca --type rsa --in private/caKey-rsa_4096.pem --lifetime 3652 --dn "C=FR, O=LAB3W, CN=LAB3W Cyber Root CA : RSA4096" --outform pem > x509ca/caCert-rsa_4096.pem
003#pki --self --ca --type ecdsa --in private/caKey-ecdsa_384.pem --lifetime 3652 --dn "C=FR, O=LAB3W, CN=LAB3W Cyber Root CA : ECDSA384" --outform pem > x509ca/caCert-ecdsa_384.pem
004#pki --self --ca --type ed25519 --in private/caKey-ed25519.pem --lifetime 3652 --dn "C=FR, O=LAB3W, CN=LAB3W Cyber Root CA : ED25519" --outform pem > x509ca/caCert-ed25519.pem
005#pki --self --ca --type ed448 --in private/caKey-ed448.pem --lifetime 3652 --dn "C=FR, O=LAB3W, CN=LAB3W Cyber Root CA : ED25519" --outform pem > x509ca/caCert-ed448.pem
006#algo non valider NIST dans la version 6 beta6 de strongswan
007#pki --self --ca --type priv --in private/caKey-falcon1024.pem --lifetime 3652 --dn "C=FR, O=LAB3W, CN=LAB3W Cyber Root CA : FALCON1024" --outform pem > x509ca/caCert-falcon1024.pem

En passant, j'oublié, je n'ai pas fait de contrôle de l'AC sur les certificats clients - c'est mal "crl_uris" etc.

StrongSwan (Infrastructure à clés publiques ou Public Key Infrastructure) pki Tool
  • pki --acert : https://docs.strongswan.org/docs/latest/pki/pkiAcert.html
    Cette sous-commande pki émet un certificat d'attribut X.509 lié à un certificat de titulaire.

  • pki --dn : https://docs.strongswan.org/docs/latest/pki/pkiDn.html
    Cette sous-commande pki extrait le nom distinctif (DN) du sujet codé en ASN.1 d'un certificat X.509 et l'exporte dans différents formats. Cela peut être utile lorsque l'analyseur d'identité strongSwan ne parvient pas à produire le codage binaire correct à partir d'une chaîne.

  • pki --est : https://docs.strongswan.org/docs/latest/pki/pkiEst.html
    Cette sous-commande pki envoie une demande de certificat PKCS#10 via HTTPS à un serveur utilisant le protocole EST (Enrollment over Secure Transport) (RFC 7030). Après une autorisation réussie, nécessitant une interrogation périodique du client d'inscription en cas d'authentification manuelle, le serveur EST renvoie un certificat X.509 signé par l'autorité de certification.
    Avant l'expiration du certificat actuel, un nouveau certificat client basé sur une nouvelle clé privée peut être demandé, en utilisant l'ancien certificat et l'ancienne clé pour l'authentification TLS automatique du client auprès du serveur EST.

  • pki --estca : https://docs.strongswan.org/docs/latest/pki/pkiEstCa.html
    Cette sous-commande pki obtient des certificats CA via https à partir d'un serveur EST à l'aide de l'opération /cacerts du protocole d'inscription sur transport sécurisé (RFC 7030).

  • pki --ocsp : https://docs.strongswan.org/docs/latest/pki/pkiOcsp.html
    Cette sous-commande pki analyse une requête OCSP (Online Certificate Status Protocol) telle que définie par la RFC 6960 et, avec l'option --respond, génère une réponse OCSP basée sur cette requête. L'état du certificat peut être fourni par des plugins. Par conséquent, si l'option --index n'est pas utilisée, les plugins openxpki et mysql sont nécessaires pour accéder directement à la base de données de certificats d'un serveur OpenXPKI.

  • pki --scep : https://docs.strongswan.org/docs/latest/pki/pkiAcert.html
    Cette sous-commande pki envoie une demande de certificat PKCS#10 dans un conteneur PKCS#7 chiffré et signé via HTTP à un serveur SCEP utilisant le protocole d'inscription de certificats simple (RFC 8894). Après une autorisation réussie, qui nécessite une interrogation périodique du client d'inscription avec l'authentification manuelle, le serveur SCEP renvoie un certificat X.509 signé par l'autorité de certification.
    Avant l'expiration du certificat actuel, un nouveau certificat client basé sur une nouvelle clé privée RSA peut être demandé, en utilisant l'ancien certificat et l'ancienne clé pour l'authentification automatique auprès du serveur SCEP.

  • pki --scepca : https://docs.strongswan.org/docs/latest/pki/pkiScepCa.html
    Cette sous-commande pki obtient les certificats CA et RA via http à partir d'un serveur SCEP à l'aide de la commande GetCACert du protocole d'inscription de certificat simple (RFC 8894).

  • pki --signcrl : https://docs.strongswan.org/docs/latest/pki/pkiSignCrl.html
    Cette sous-commande pki génère une liste de révocation de certificats X.509 (CRL) signée par une clé privée CA.

  • pki --verify : https://docs.strongswan.org/docs/latest/pki/pkiVerify.html
    Cette sous-commande pki vérifie et statut la signature d'un certificat X.509.


Ok, nous allons pouvoir nous occuper des certificats SSL/TLS pour nos clients.

Créer un dossier "tmp/" dans le répertoire "/etc/swanctl/" pour les demandes à faire signer.

Création de la clé pour le client « gate.fr.lab3w.com »

Il nous faut, un certificat pour le serveur « srv.ca.lab3w.com » et un autre pour le serveur « gate.fr.lab3w.com ».

Par exemple pour le serveur « gate.fr.lab3w.com » :

Instructions sur la documentation strongSwan : pki --gen - https://docs.strongswan.org/docs/latest/pki/pkiGen.html

Script avec 1 ligne

001root@server:/etc/swanctl # pki --gen --type ed448 --outform pem > private/gate.fr.lab3w.com-Key-ed448.pem

Création de la demande à signer

Instructions sur la documentation strongSwan : pki --req - https://docs.strongswan.org/docs/latest/pki/pkiReq.html

Script avec 1 ligne

001root@server:/etc/swanctl # pki --req --type priv --in private/gate.fr.lab3w.com-Key-ed448.pem --dn "C=FR, O=LAB3W, CN=gate.fr.lab3w.com" --san gate.fr.lab3w.com --san gate.fr.ipv10.net --outform pem > tmp/gate.fr.lab3w.com-Req-XXX.pem

Création du certificat client « gate.fr.lab3w.com »

Instructions sur la documentation strongSwan : pki --issue - https://docs.strongswan.org/docs/latest/pki/pkiIssue.html

Script avec 1 ligne

001root@server:/etc/swanctl # pki --issue --cacert x509ca/CAcert_LAB3W-RSA3072.pem --cakey private/CAkey_LAB3W-RSA3072.pem --type pkcs10 --in tmp/gate.fr.lab3w.com-Req-XXX.pem --serial 01 --lifetime 1826 --outform pem > x509/gate.fr.lab3w.com-Cert-ed448-signed-by-CA_LAB3W-RSA3072.pem
Création de la clé publique du client « gate.fr.lab3w.com »

Instructions sur la documentation strongSwan : pki --pub - https://docs.strongswan.org/docs/latest/pki/pkiPub.html

Depuis le certificat :

Script avec 1 ligne

001root@server:/etc/swanctl # openssl x509 -in x509/gate.fr.lab3w.com-Cert-ed448-signed-by-CA_LAB3W-RSA3072.pem -noout -pubkey -out pubkey/gate.fr.lab3w.com-PubKey-ed448-signed-by-CA_LAB3W-RSA3072.pem

Depuis la clef privée :

Script avec 1 ligne

001root@server:/etc/swanctl # pki --pub --in private/gate.fr.lab3w.com-Key-ed448.pem --type priv --outform pem > pubkey/gate.fr.lab3w.com-PubKey-ed448-signed-by-CA_LAB3W-RSA3072.pem

Création d'un certificat pour un client de type Windows ou Smartphone - OK in Android 12

Script avec 13 lignes


001root@server:/etc/swanctl # pki --gen --type rsa --size 3072 --outform pem > private/orj-Key-rsa_3072.pem
002root@server:/etc/swanctl # pki --req --type priv --in private/orj-Key-rsa_3072.pem 
003          --dn "C=FR, O=LAB3W, CN=orj@lab3w.fr" 
004          --san orj@lab3w.fr --san orj@lab3w.com --outform pem > tmp/orj-Req.pem
005
006root@server:/etc/swanctl # pki --issue --cacert x509ca/LAB3W_ZW3B-caCert-rsa_3072.pem --cakey private/LAB3W_ZW3B-caKey-rsa_3072.pem 
007            --type pkcs10 --in tmp/orj-Req.pem --serial 01 --lifetime 1826 
008            --outform pem > x509/orj-Cert-rsa_3072-sign_ca-rsa_3072.pem
009
010root@server:/etc/swanctl # openssl pkcs12 -export -inkey private/orj-Key-rsa3072.pem 
011               -in x509/orjCert-rsa_3072-sign_ca-rsa_3072.pem -name "O.Romain.Jaillet-ramey" 
012               -certfile x509ca/caCert-rsa_3072.pem -caname "ZW3B Cyber Root CA" 
013               -out pkcs12/orj-Cert-rsa_3072-sign_ca-rsa_3072.p12

Lire un certificat SSL/TLS

Instructions sur la documentation strongSwan : pki --print - https://docs.strongswan.org/docs/latest/pki/pkiPrint.html

Script avec 13 lignes

001root@machin:/etc/swanctl # pki --print --type x509 --in x509/vps.de.ipv10.net-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
002  subject:  "C=FR, O=LAB3W, CN=vps.de.ipv10.net"
003  issuer:   "C=FR, O=LAB3W, CN=ZW3B Cyber Root CA : rsa_3072"
004  validity:  not before Mar 05 21:40:17 2025, ok
005             not after  Mar 05 21:40:17 2030, ok (expires in 1813 days)
006  serial:    01
007  altNames:  vps.de.lab3w.com, vps.de.zw3b.net
008  flags:
009  authkeyId: 95:66:e0:e9:97:2d:7b:cb:ee:3d:7b:e3:95:5f:10:19:bc:6e:71:d5
010  subjkeyId: 68:74:88:06:9c:cb:b0:07:8f:0e:d7:bf:b3:af:61:ef:91:59:e7:58
011  pubkey:    ED448 456 bits
012  keyid:     7e:9c:cf:d3:0c:6c:e9:70:04:77:f2:e0:8b:e9:be:54:75:cd:42:20
013  subjkey:   68:74:88:06:9c:cb:b0:07:8f:0e:d7:bf:b3:af:61:ef:91:59:e7:58

Ou avec la commande "openssl" :

Script avec 66 lignes

001root@machin:/etc/swanctl # openssl x509 --text --in x509/vps.de.ipv10.net-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
002Certificate:
003    Data:
004        Version: 3 (0x2)
005        Serial Number: 1 (0x1)
006        Signature Algorithm: sha256WithRSAEncryption
007        Issuer: C = FR, O = LAB3W, CN = ZW3B Cyber Root CA : rsa_3072
008        Validity
009            Not Before: Mar  5 20:40:17 2025 GMT
010            Not After : Mar  5 20:40:17 2030 GMT
011        Subject: C = FR, O = LAB3W, CN = vps.de.ipv10.net
012        Subject Public Key Info:
013            Public Key Algorithm: ED448
014                ED448 Public-Key:
015                pub:
016                    a4:28:97:d3:f6:b1:81:ca:0b:6e:4e:60:86:64:9e:
017                    50:d5:40:95:b1:e6:f9:e0:a4:fe:db:be:80:4c:fb:
018                    45:80:72:15:2f:40:ca:be:0c:0a:5d:17:af:d5:41:
019                    a0:e7:60:35:12:fb:66:30:d3:53:f6:80
020        X509v3 extensions:
021            X509v3 Authority Key Identifier:
022                keyid:95:66:E0:E9:97:2D:7B:CB:EE:3D:7B:E3:95:5F:10:19:BC:6E:71:D5
023
024            X509v3 Subject Alternative Name:
025                DNS:vps.de.lab3w.com, DNS:vps.de.zw3b.net
026    Signature Algorithm: sha256WithRSAEncryption
027         d1:8a:3e:48:b6:e1:0c:b5:01:1d:c3:ee:ba:84:ce:96:43:da:
028         55:2d:9b:57:eb:c6:37:f1:78:f0:86:11:e3:a0:39:63:0c:78:
029         e0:10:e2:e9:69:d0:42:bf:f9:e3:5c:8f:3e:02:2b:89:a8:dc:
030         8c:ce:55:b5:9f:10:2c:17:b2:21:a0:46:61:67:33:b5:15:aa:
031         bb:fb:03:fe:09:8f:d7:18:7c:61:33:07:7f:01:5c:62:c0:d7:
032         c0:a8:2d:cb:bf:0f:69:bf:e6:72:5f:cc:94:99:a8:a1:a7:48:
033         36:be:21:69:06:5b:24:33:9d:43:af:36:c4:a9:15:4c:a6:c3:
034         85:de:e4:ce:35:87:47:90:e1:72:70:74:55:c9:da:75:3d:6b:
035         db:48:3c:b9:43:9d:dd:43:3f:1a:5f:46:b1:26:fa:2f:1c:09:
036         1b:9e:eb:c6:2a:90:c0:6d:9c:f5:3b:9f:34:7c:fb:ca:23:4a:
037         b4:e3:cd:45:85:cd:58:63:9a:4c:e7:77:b9:b5:d8:a4:74:29:
038         a4:d5:75:df:96:c3:71:50:fc:8d:bf:9c:6e:af:ff:e4:88:73:
039         7e:7e:bd:7c:fa:80:07:6c:da:73:dc:bc:15:3f:33:f2:5b:6a:
040         3c:d0:0d:2d:16:8a:c7:df:66:39:bb:ce:ec:bf:52:28:76:4e:
041         fc:13:ab:e0:af:3a:6d:51:ea:6b:22:b0:53:f4:51:8b:b2:b3:
042         78:9e:3d:91:d1:47:f2:2b:02:2d:a5:16:1a:e5:84:65:44:a5:
043         f4:0c:c4:78:58:bc:60:c5:76:da:a2:5d:d1:73:03:d8:23:8d:
044         6a:59:bc:a6:8b:3a:5c:e9:0e:6c:0c:3b:17:6a:38:87:b3:f0:
045         0c:10:b5:eb:df:10:db:44:d9:8a:4e:12:55:a9:f3:4e:61:55:
046         57:55:8e:3e:35:92:f4:59:37:a8:39:00:e5:c9:fe:7f:c2:00:
047         d3:78:48:aa:5b:c1:15:23:39:f6:51:24:28:f5:dc:0b:61:16:
048         cf:ad:8a:36:23:0f
049-----BEGIN CERTIFICATE-----
050MIIC6DCCAVCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJGUjEO
051MAwGA1UEChMFTEFCM1cxJjAkBgNVBAMMHVpXM0IgQ3liZXIgUm9vdCBDQSA6IHJz
052YV8zMDcyMB4XDTI1MDMwNTIwNDAxN1oXDTMwMDMwNTIwNDAxN1owODELMAkGA1UE
053BhMCRlIxDjAMBgNVBAoTBUxBQjNXMRkwFwYDVQQDExB2cHMuZGUuaXB2MTAubmV0
054MEMwBQYDK2VxAzoApCiX0/axgcoLbk5ghmSeUNVAlbHm+eCk/tu+gEz7RYByFS9A
055yr4MCl0Xr9VBoOdgNRL7ZjDTU/aAo1EwTzAfBgNVHSMEGDAWgBSVZuDply17y+49
056e+OVXxAZvG5x1TAsBgNVHREEJTAjghB2cHMuZGUubGFiM3cuY29tgg92cHMuZGUu
057enczYi5uZXQwDQYJKoZIhvcNAQELBQADggGBANGKPki24Qy1AR3D7rqEzpZD2lUt
058m1frxjfxePCGEeOgOWMMeOAQ4ulp0EK/+eNcjz4CK4mo3IzOVbWfECwXsiGgRmFn
059M7UVqrv7A/4Jj9cYfGEzB38BXGLAADCoLcu/D2m/5nJfzJSZqKGnSDa+IWkGWyQz
060nUOvNsSpFUymw4Xe5M41h0eQ4XJwdFXJ2nU9a9tIPLlDnd1DPxpfRrEm+i8cCRue
06168YqkMBtnPU7nzR8+8ojSrTjzUWFzVhjmkznd7m12KR0KaTVdd+Ww3FQ/I2/nG6v
062/+SIc35+vXz6gAds2nPcvBU/M/JbajzQDS0WisffZjm7zuy/Uih2TvwTq+CvOm1R
0636msisFP0UYuys3iePZHRR/IrAi2lFhrlhGVEpfQMxHhYvGDFdtqiXdFzA9gjjWpZ
064vKaLOlzpDmwMOxdqOIez8AwQtevfENtE2YpOElWp805hVVdVjj41kvRZN6g5AOXJ
065/n/CANN4SKpbwRUjOfZRJCj13AthFs+tijYjDw==
066-----END CERTIFICATE-----

Others example

Script avec 9 lignes

001# create pubkey 
002openssl x509 -in x509/vps_uk-Cert-ed25519-sign_ca-ed25519.pem -noout -pubkey -out pubkey/vps_uk-PubKey-ed25519.pem
003
004# create PEM to DER (binaire)
005openssl x509 -in x509/vps_uk-Cert-ed25519-sign_ca-ed25519.pem -out x509/vps_uk-Cert-ed25519-sign_ca-ed25519.der -outform DER
006
007# read
008openssl x509 -in x509/vps_uk-Cert-ed25519-sign_ca-ed25519.der -noout -text -inform der 
009openssl x509 -in x509/vps_uk-Cert-ed25519-sign_ca-ed25519.pem -noout -text -inform pem 

Initialiser une connexion

Depuis l'initiateur (on peut exécuter la commande depuis le récepteur aussi).

Script avec 1 ligne

001# swanctl --initiate --child fr-ca

Lister les Associations de Sécurité

Depuis le recepteur (on peut exécuter la commande depuis l'initiateur aussi).

Script avec 36 lignes

001root@server:/etc/swanctl # swanctl --list-sas
002ca-de: #79, ESTABLISHED, IKEv2, 109b0e829cf6efe5_i* 2ebee4563f7533ab_r
003  local  'srv.ca.lab3w.com' @ 158.69.126.137[4500]
004  remote 'vps.de.ipv10.net' @ 135.125.133.51[4500] [fec3::1]
005  AES_GCM_16-256/PRF_HMAC_SHA2_384/CURVE_25519/KE1_ML_KEM_512/KE2_ML_KEM_768/KE3_ML_KEM_1024
006  established 717s ago, rekeying in 13156s
007  ca-de: #799, reqid 3, INSTALLED, TUNNEL, ESP:AES_GCM_16-256/CURVE_25519/KE1_ML_KEM_512/KE2_ML_KEM_768/KE3_ML_KEM_1024
008    installed 2126s ago, rekeying in 3079s, expires in 3814s
009    in  ce91f6ac, 4709233 bytes, 62320 packets,     0s ago
010    out cbacc7f0, 5454048 bytes, 34569 packets,     0s ago
011    local  fc00:41d0:801:2000::/64 fc00:5300:60:9389::/64 fc01::10:106:0:0/104 fc01::10:126:42:0/112 fc01::172:16:0:0/104 fc01::192:168:0:0/104 fec0::/16 fec1::/16 fec2::1/128
012    remote fc00:41d0:701:1100::/64 fec3::1/128
013
014ca-uk: #78, ESTABLISHED, IKEv2, 88e1b6418709f450_i* 27f0d6ec099929bd_r
015  local  'srv.ca.lab3w.com' @ 158.69.126.137[4500]
016  remote 'vps.uk.ipv10.net' @ 57.128.171.43[4500] [fec2::1]
017  AES_GCM_16-256/PRF_HMAC_SHA2_384/CURVE_25519/KE1_ML_KEM_512/KE2_ML_KEM_768/KE3_ML_KEM_1024
018  established 6376s ago, rekeying in 6735s
019  ca-uk: #812, reqid 5, INSTALLED, TUNNEL, ESP:AES_GCM_16-256/CURVE_25519/KE1_ML_KEM_512/KE2_ML_KEM_768/KE3_ML_KEM_1024
020    installed 121s ago, rekeying in 52s, expires in 77s
021    in  c83f9111, 258480 bytes,  3493 packets,     0s ago
022    out cc1f3b0f, 138816 bytes,  1831 packets,     0s ago
023    local  fc00:41d0:701:1100::/64 fc00:5300:60:9389::/64 fc01::10:106:0:0/104 fc01::10:126:42:0/112 fc01::172:16:0:0/104 fc01::192:168:0:0/104 fec0::/16 fec1::/16 fec3::1/128
024    remote fc00:41d0:801:2000::/64 fec2::1/128
025
026ca-fr: #76, ESTABLISHED, IKEv2, f3d91915c5e3c5e4_i* f89ee25d69bdb2c1_r
027  local  'srv.ca.lab3w.com' @ 158.69.126.137[4500]
028  remote 'gate.fr.lab3w.com' @ 90.5.102.244[4500]
029  AES_GCM_16-256/PRF_HMAC_SHA2_384/CURVE_25519/KE1_ML_KEM_512/KE2_ML_KEM_768/KE3_ML_KEM_1024
030  established 13259s ago, rekeying in 907s
031  ca-fr: #798, reqid 1, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-256/CURVE_25519/KE1_ML_KEM_512/KE2_ML_KEM_768/KE3_ML_KEM_1024
032    installed 2216s ago, rekeying in 2676s, expires in 3725s
033    in  c97b7a62, 3169602 bytes, 36390 packets,     0s ago
034    out c7eab254, 13699815 bytes, 57894 packets,     0s ago
035    local  fc00:41d0:701:1100::/64 fc00:41d0:801:2000::/64 fc00:5300:60:9389::/64 fec0::/16 fec2::1/128 fec3::1/128
036    remote fc01::10:106:0:0/104 fc01::10:126:42:0/112 fc01::172:16:0:0/104 fc01::192:168:0:0/104 fec1::/16

Terminer une connexion

Depuis le récepteur (on peut exécuter la commande depuis l'initiateur aussi).

Script avec 1 ligne

001# swanctl --terminate --ike ca-fr

Ou en terminant la connexion par rapport à son IKE ou CHILD ID :

Script avec 1 ligne

001# swanctl --terminate --ike-id 76



Afficher les routes du VPN strongSwan v6

Et pour finir ; les valeurs "local_ts" et "remote_ts" des 3 connexions ci-dessus.

Par exemple :

strongSwan se réserve la table de routage 220 : https://docs.strongswan.org/docs/latest/features/routeBasedVpn.html (Route-based VPN)

Script avec 10 lignes

001root@server:/etc/swanctl # ip -6 route show table 220
002fc00:41d0:701:1100::/64 dev vmbr0 proto static src fec0::1 metric 1024 pref medium
003fc00:41d0:801:2000::/64 dev vmbr0 proto static src fec0::1 metric 1024 pref medium
004fc01::10:106:0:0/104 dev vmbr0 proto static src fec0::1 metric 1024 pref medium
005fc01::10:126:42:0/112 dev vmbr0 proto static src fec0::1 metric 1024 pref medium
006fc01::172:16:0:0/104 dev vmbr0 proto static src fec0::1 metric 1024 pref medium
007fc01::192:168:0:0/104 dev vmbr0 proto static src fec0::1 metric 1024 pref medium
008fec1::/16 dev vmbr0 proto static src fec0::1 metric 1024 pref medium
009fec2::1 dev vmbr0 proto static src fec0::1 metric 1024 pref medium
010fec3::1 dev vmbr0 proto static src fec0::1 metric 1024 pref medium

Script avec 7 lignes

001root@initiator:/etc/swanctl # ip -6 route show table 220
002fc00:41d0:701:1100::/64 dev netbr0 proto static src fec1::1 metric 1024 pref medium
003fc00:41d0:801:2000::/64 dev netbr0 proto static src fec1::1 metric 1024 pref medium
004fc00:5300:60:9389::/64 dev netbr0 proto static src fec1::1 metric 1024 pref medium
005fec0::/16 dev netbr0 proto static src fec1::1 metric 1024 pref medium
006fec2::1 dev netbr0 proto static src fec1::1 metric 1024 pref medium
007fec3::1 dev netbr0 proto static src fec1::1 metric 1024 pref medium




Article à compléter et à peaufiner. Lisez le fichier INFOS.txt dans ma configuration n°7 de strongSwan v6 ; il y a des infos sympats.

Faire des tests ; les afficher - tcpdump, ping, nmap, traceroute6, tracert, scan6, ip, iperf3 etc.

Tester les documentations suivantes :
Expliquer les connexions EAP (Extensible Authentication Protocol) pour les "nomades/voyageurs" Road-Warriors, et les algorithmes cryptographiques.

Faire un exemple de connexions clientes depuis Windows 7/10/11 et Android.



La dernière discussion que j'ai lancé sur le GitHub de strongSwan : 🔑 How to configure strongSwan v6 Post-Quantum Cryptography NIST compliant #2731 pour celles et ceux que çà intéresse.



Romain.




Liens Externes :


  • Open Quantum Safe (OQS)
    Le projet Open Quantum Safe (OQS) est un projet open source visant à soutenir la transition vers une cryptographie résistante aux attaques quantiques. OQS fait partie de la Post-Quantum Cryptography (PQC) Alliance de la Fondation Linux.

    OQS s'articule autour de deux axes principaux : liboqs, une bibliothèque C open source pour les algorithmes cryptographiques résistants aux attaques quantiques, et l'intégration de prototypes dans des protocoles et des applications, notamment la bibliothèque OpenSSL, largement utilisée. Ces outils soutiennent nos recherches et celles d'autres chercheurs.

  • CRYSTALS : Cryptographic Suite for Algebraic Lattices
    La suite cryptographique pour réseaux algébriques (CRYSTALS) comprend deux primitives cryptographiques : Kyber, un mécanisme d'encapsulation de clés (KEM) sécurisé par IND-CCA2 ; et Dilithium, un algorithme de signature numérique fortement sécurisé par EUF-CMA. Ces deux algorithmes reposent sur des problèmes complexes sur des réseaux de modules, sont conçus pour résister aux attaques des grands ordinateurs quantiques et ont été soumis au projet de cryptographie post-quantique du NIST.
  • WikipediA : Kyber
    Kyber is a key encapsulation mechanism (KEM) designed to be resistant to cryptanalytic attacks with future powerful quantum computers.



  • OpenSSL Certificate Authority
    Ce guide explique comment agir comme votre propre autorité de certification (CA) à l'aide des outils de ligne de commande OpenSSL. Ceci est utile dans de nombreuses situations, comme l'émission de certificats de serveur pour sécuriser un site intranet ou l'émission de certificats aux clients pour leur permettre de s'authentifier auprès d'un serveur.


Liens GitHub - Disucssions strongSwan

Les sujets que j'ai ouvert :


D'autres liens que j'ai ouvert en utilisant PQ strongSwan v6.0beta Post-Quantum IKEv2 Daemon de strongX509 (Github).


Keywords :

linux لينكس IPSec OpenSSL PKI SWANCtl PUBKEY ESP VPN Customer Cliente de VPN عميل VPN KEM EAP PUBKEY MSCHAPv2 IKEv2 CURVE_25519 PRF_HMAC_SHA2_384 CHACHA20_POLY1305 KE1_ML_KEM_1024 ed448 PQC Post Quantum Cryptography


Author of the page

O.Romain.Jaillet-ramey

O.Romain.Jaillet-ramey

  • Firstname : Olivier Romain Luc
  • Lastname : : Jaillet-ramey
  • Arrived on tuesday 19 october 1976 (1976/10/19 00:00)
    48 years activity !

Translate this page with Google



ZW3B.Net



Load page: 2,487270116806