Informations :
Dates
- Publish : : Thursday 20 march 2025
- Modification : Wednesday 29 october 2025
- 1804 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 suivantefc01:0000:0000:0000:10:6:42:10 - Pour une machine avec l'IPv4
192.168.1.88, elle aura l'IPv6 suivantefc01: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.
- strongSwan Docs / Installation / Autoconf Options
Script avec 14 lignes
001root@server:~ # apt install wget unzip bzip2 make gcc libssl-dev cmake ninja-build tree002root@server:~ # wget -4 https://github.com/strongswan/strongswan/releases/download/6.0.3/strongswan-6.0.3.tar.bz2003root@server:~ # tar xjf strongswan-6.0.3.tar.bz2004root@server:~ # cd strongswan-6.0.3005root@server:~/strongswan-6.0.3 # ./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-ha006 007strongSwan will be built with the following plugins008-----------------------------------------------------009libstrongswan: random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pgp dnskey sshkey pem openssl pkcs8 xcbc cmac kdf ml drbg010libcharon: 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 counters011libtnccs: tnc-tnccs012libtpmtss:013 014root@server:~/strongswan-6.0.3 # make && make install
À default, je fais un script personnel d'init sur le "binaire" :
Script avec 99 lignes
001root@server:~/strongswan-6.0.3 # cat /root/strongSwan-v6.sh002#!/bin/bash003### BEGIN INIT INFO004# Provides: charon005# Required-Start: $remote_fs $syslog006# Required-Stop: $remote_fs $syslog007# Default-Start: 2 3 4 5008# Default-Stop: 0 1 6009# Short-Description: Start daemon at boot time010# Description: Enable service provided by daemon.011### END INIT INFO012#####-------------------------- VARIABLES ----------------------------######013 014# Author : O.Romain.Jaillet-ramey (orj at lab3w dot fr)015# Date : 2025/03/15016# Desc : My script strongSwan 6.x.x for status|start|stop|restart017 018 019#####-------------------------- START / STOP ----------------------------######020case "$1" in021 022start|restart)023$0 stop024echo "$0 Starting"025/usr/libexec/ipsec/charon 1>>/var/log/syslog 2>/dev/null 2>&1 &026;;027 028stop)029echo "$0 Stop"030 031/usr/sbin/ip -6 route flush table 220032/usr/sbin/ip -4 route flush table 220033 034/usr/sbin/ip -6 xfrm policy flush035/usr/sbin/ip -4 xfrm policy flush036 037/usr/sbin/ip -6 xfrm state flush038/usr/sbin/ip -4 xfrm state flush039 040pkill charon041;;042status)043echo "$0 Status"044echo "# -------------------------"045echo "# Security Association"046echo "# -------"047echo ""048 049swanctl --list-sas050 051echo ""052echo "# -------"053echo ""054 055echo "# -------------------------"056echo "# Route show"057echo "# -------"058echo ""059 060/usr/sbin/ip -6 route show table 220061/usr/sbin/ip -4 route show table 220062 063echo ""064echo "# -------"065echo ""066 067echo "# -------------------------"068echo "# XFRM Policy"069echo "# -------"070echo ""071 072/usr/sbin/ip -6 xfrm policy073/usr/sbin/ip -4 xfrm policy074 075echo ""076echo "# -------"077echo ""078 079echo "# -------------------------"080echo "# XFRM State"081echo "# -------"082echo ""083 084/usr/sbin/ip -6 xfrm state085/usr/sbin/ip -4 xfrm state086 087echo ""088echo "# -------"089echo ""090 091;;092 093*)094echo "usage : $0 (status|start|stop|restart)"095;;096 097esac098 099#####-------------------------- START / STOP ----------------------------######
Script avec 7 lignes
001root@server:~/strongswan-6.0.3 # chmod u+x /root/strongSwan-v6.sh002root@server:~/strongswan-6.0.1 # ls -l /root/strongSwan-v6.sh003-rwxr--r-- 1 root root 1303 26 févr. 17:21 /root/strongSwan-v6.sh004 005root@server:~/strongswan-6.0.3 # /root/strongSwan-v6.sh restart006/root/strongSwan-v6.sh Stop007/root/strongSwan-v6.sh Starting
Script avec 2 lignes
001root@server:~/strongswan-6.0.1 # swanctl --version002strongSwan swanctl 6.0.3
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.3 # cd /etc/swanctl002root@server:/etc/swanctl # tree003.004├── conf.d005├── ecdsa006├── p12007├── pkcs12008├── pkcs8009├── private010├── pubkey011├── rsa012├── syslog013├── x509014├── x509aa015├── x509ac016├── x509ca017├── x509crl018└── x509ocsp019 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-algs002encryption:003AES_CBC[openssl]004AES_CTR[openssl]005AES_ECB[openssl]006AES_CFB[openssl]007CAMELLIA_CBC[openssl]008CAMELLIA_CTR[openssl]009CAST_CBC[openssl]010BLOWFISH_CBC[openssl]0113DES_CBC[openssl]012DES_CBC[openssl]013DES_ECB[openssl]014NULL[openssl]015integrity:016HMAC_MD5_96[openssl]017HMAC_MD5_128[openssl]018HMAC_SHA1_96[openssl]019HMAC_SHA1_128[openssl]020HMAC_SHA1_160[openssl]021HMAC_SHA2_256_128[openssl]022HMAC_SHA2_256_256[openssl]023HMAC_SHA2_384_192[openssl]024HMAC_SHA2_384_384[openssl]025HMAC_SHA2_512_256[openssl]026HMAC_SHA2_512_512[openssl]027CAMELLIA_XCBC_96[xcbc]028AES_XCBC_96[xcbc]029AES_CMAC_96[cmac]030aead:031AES_GCM_16[openssl]032AES_GCM_12[openssl]033AES_GCM_8[openssl]034AES_CCM_16[openssl]035AES_CCM_12[openssl]036AES_CCM_8[openssl]037CHACHA20_POLY1305[openssl]038hasher:039HASH_SHA1[openssl]040HASH_MD5[openssl]041HASH_MD4[openssl]042HASH_SHA2_224[openssl]043HASH_SHA2_256[openssl]044HASH_SHA2_384[openssl]045HASH_SHA2_512[openssl]046HASH_SHA3_224[openssl]047HASH_SHA3_256[openssl]048HASH_SHA3_384[openssl]049HASH_SHA3_512[openssl]050HASH_IDENTITY[openssl]051prf:052PRF_KEYED_SHA1[openssl]053PRF_HMAC_MD5[openssl]054PRF_HMAC_SHA1[openssl]055PRF_HMAC_SHA2_256[openssl]056PRF_HMAC_SHA2_384[openssl]057PRF_HMAC_SHA2_512[openssl]058PRF_AES128_XCBC[xcbc]059PRF_CAMELLIA128_XCBC[xcbc]060PRF_AES128_CMAC[cmac]061xof:062XOF_SHAKE128[openssl]063XOF_SHAKE256[openssl]064kdf:065KDF_PRF[kdf]066KDF_PRF_PLUS[kdf]067drbg:068DRBG_CTR_AES128[drbg]069DRBG_CTR_AES192[drbg]070DRBG_CTR_AES256[drbg]071DRBG_HMAC_SHA1[drbg]072DRBG_HMAC_SHA256[drbg]073DRBG_HMAC_SHA384[drbg]074DRBG_HMAC_SHA512[drbg]075ke:076MODP_3072[openssl]077MODP_4096[openssl]078MODP_6144[openssl]079MODP_8192[openssl]080MODP_2048[openssl]081MODP_2048_224[openssl]082MODP_2048_256[openssl]083MODP_1536[openssl]084MODP_1024[openssl]085MODP_1024_160[openssl]086MODP_768[openssl]087MODP_CUSTOM[openssl]088ECP_256[openssl]089ECP_384[openssl]090ECP_521[openssl]091ECP_224[openssl]092ECP_192[openssl]093ECP_256_BP[openssl]094ECP_384_BP[openssl]095ECP_512_BP[openssl]096ECP_224_BP[openssl]097CURVE_25519[openssl]098CURVE_448[openssl]099ML_KEM_512[ml]100ML_KEM_768[ml]101ML_KEM_1024[ml]102rng:103RNG_WEAK[openssl]104RNG_STRONG[random]105RNG_TRUE[random]106nonce-gen:107NONCE_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/TLSswanctl --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 --help002strongSwan 6.0.1 swanctl003loaded plugins: random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pgp dnskey sshkey pem openssl pkcs8 xcbc cmac kdf ml drbg004usage:005swanctl --counters (-C) list or reset IKE event counters006swanctl --initiate (-i) initiate a connection007swanctl --terminate (-t) terminate a connection008swanctl --rekey (-R) rekey an SA009swanctl --redirect (-d) redirect an IKE_SA010swanctl --uninstall (-u) uninstall a trap or shunt policy011swanctl --install (-p) install a trap or shunt policy012swanctl --list-sas (-l) list currently active IKE_SAs013swanctl --monitor-sa (-m) monitor for IKE_SA and CHILD_SA changes014swanctl --list-pols (-P) list currently installed policies015swanctl --list-authorities (-B) list loaded authority configurations016swanctl --list-conns (-L) list loaded configurations017swanctl --list-certs (-x) list stored certificates018swanctl --list-pools (-A) list loaded pool configurations019swanctl --list-algs (-g) show loaded algorithms020swanctl --flush-certs (-f) flush cached certificates021swanctl --load-all (-q) load credentials, authorities, pools and connections022swanctl --load-authorities (-b) (re-)load authority configuration023swanctl --load-conns (-c) (re-)load connection configuration024swanctl --load-creds (-s) (re-)load credentials025swanctl --load-pools (-a) (re-)load pool configuration026swanctl --log (-T) trace logging output027swanctl --version (-v) show version information028swanctl --stats (-S) show daemon stats information029swanctl --reload-settings (-r) reload daemon strongswan.conf030swanctl --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.conf002# strongSwan configuration file003#filelog {004# charon-debug-log {005# path = /var/log/charon_debug.log006# time_format = %a, %Y-%m-%d, %H:%M:%S007# default = 2008# net = 1009# enc = 1010# asn = 1011# job = 1012# ike_name = yes013# append = no014# flush_line = yes015# }016#}017 018charon {019 020# load_modular = yes021plugins {022include strongswan.d/charon/*.conf023 024eap-dynamic {025# prefer_user = yes026# preferred = eap-ttls, eap-tls, eap-mschapv2, eap-md5, psk027preferred = eap-mschapv2, eap-tls, eap-ttls028}029eap-tls {030fragment_size = 512031}032}033 034start-scripts {035creds = swanctl --load-creds036conns = swanctl --load-conns037pools = swanctl --load-pools038}039 040# eap-dynamic {041# prefer_user = yes042# preferred = tls, mschapv2043# }044 045send_vendor_id = yes046prefer_configured_proposals = yes047fragment_size = 1480048max_packet = 30000049 050# install_routes = no051# install_virtual_ip = yes052# install_virtual_ip_on = vti1053# interfaces_use = vti0054# interfaces_ignore = enp3s0055 056# two defined file loggers057filelog {058charon {059# path to the log file, specify this as section name in versions prior to 5.7.0060path = /var/log/charon.log061# add a timestamp prefix062time_format = %b %e %T063# prepend connection name, simplifies grepping064ike_name = yes065# overwrite existing files066append = no067# increase default loglevel for all daemon subsystems068default = 1 #2069# flush each line to disk070flush_line = yes071}072stderr {073# more detailed loglevel for a specific subsystem, overriding the074# default loglevel.075 076# applications other than daemons077app = -1078# Low-level encoding/decoding (ASN.1, X.509 etc.)079asn = -1080# Configuration management and plugins081cfg = -1082# CHILD_SA/IPsec SA083chd = -1084# Main daemon setup/cleanup/signal handling085dmn = -1086# Packet encoding/decoding encryption/decryption operations087enc = -1088# libipsec library messages089esp = 2090# IKE_SA/ISAKMP SA091ike = 2 # 2092# Integrity Measurement Collector093imc = -1094# Integrity Measurement Verifier095imv = -1096# Jobs queuing/processing and thread pool management097job = -1098# IPsec/Networking kernel interface099knl = -1100# libstrongswan library messages101lib = -1102# IKE_SA manager, handling synchronization for IKE_SA access103mgr = -1104# IKE network communication105net = -1106# Platform Trust Service107pts = -1108# libtls library messages109tls = -1110# Trusted Network Connect111tnc = -1112}113}114 115# and two loggers using syslog116syslog {117# prefix for each log message118identifier = charon-custom119# use default settings to log to the LOG_DAEMON facility120daemon {121}122# very minimalistic IKE auditing logs to LOG_AUTHPRIV123auth {124default = -1125ike = 0126}127}128# ...129 130}131 132include strongswan.d/*.conf133 134pki {135# load = plugins: random drbg x509 pubkey pkcs1 pkcs8 pkcs12 pem openssl oqs136# load = plugins: random nonce aes sha1 sha2 pem pkcs1 curve25519 gmp x509 curl revocation hmac kdf stroke kernel-netlink socket-default updown137# 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 updown138}139 140# for strongSwan 5.9141#libtls {142# version_max = 1.3143# suites = TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384144#}
- 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.conf002connections {003 004include conf.d/ca-fr.conf005include conf.d/ca-uk.conf006include conf.d/ca-de.conf007 008include conf.d/ikev2-pubkey.conf009include conf.d/ikev2-eap.conf010include conf.d/ikev2-eap-mschapv2.conf011include conf.d/ikev2-eap-tls-symmetric.conf012include conf.d/ikev2-eap-tls-asymmetric.conf013 014}015 016authorities {017ZW3BCyberRootCA_rsa_3072 {018cacert = LAB3W_ZW3B-caCert-rsa_3072.pem019# crl_uris = http://ip6-winnetou.strongswan.org/strongswan.crl020}021}022 023pools {024 025rw_pool {026addrs = 172.16.8.100-172.16.8.110027dns = 10.105.150.1, 8.8.4.4028}029rw_pool-v6 {030addrs = fec0::eeee:1ab3:00ca:d000-fec0::eeee:1ab3:00ca:d0ff031dns = fc00:5300:60:9389:15:2:a:1000, 2001:4860:4860::8844032}033 034# IP HOME035v6-lab3w_2home {036addrs = fec1::1/16037}038 039# IP VPS040v6_vps-uk {041addrs = fec2::1/128042}043v6_vps-de {044addrs = fec3::1/128045}046 047}048 049secrets {050# private-orj {051# file = private/orj-Key-rsa_3072.pem052# }053# Pre-Shared Key054ike-0 {055id = nomade056secret = 1234057}058eap-0 {059id = nomade060secret = 1234061}062 063# Extensible Authentication Protocol064eap-1 {065id = orj@lab3w.fr066secret = 1234067}068 069}070 071# Include config snippets072include 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.
- Wiki strongSwan Usable Examples configurations
001connections {002 003include conf.d/ca-fr.conf004include conf.d/ca-uk.conf005include conf.d/ca-de.conf006 007include conf.d/ikev2-pubkey.conf008include conf.d/ikev2-eap.conf009include conf.d/ikev2-eap-mschapv2.conf010include conf.d/ikev2-eap-tls-symmetric.conf011include conf.d/ikev2-eap-tls-asymmetric.conf012 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.conf002ca-fr {003remote_addrs = 90.5.102.244004 005# Addresses (pools) to declare for this connection006pools = v6-lab3w_2home007 008local {009auth = pubkey010id = srv.ca.lab3w.com011# certs = srv.ca.lab3w.com-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem012pubkeys = srv.ca.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem013}014remote {015auth = pubkey016id = gate.fr.lab3w.com017# certs = gate.fr.lab3w.com-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem018pubkeys = gate.fr.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem019}020children {021ca-fr {022# mode = transport023 024# All networks available by this server except of course those of this client (remote_ts)025local_ts = fec0::1/16, fc00:5300:60:9389::/64, fec2::1/128, fc00:41d0:801:2000::/64, fec3::1/128, fc00:41d0:701:1100::/64026 027remote_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/104028 029start_action = trap030 031#--------------------------------032# ESP033#-------034 035# Integrity Protection Only036# esp_proposals = aes256gmac-ecp384037 038# Integrity Protection and Confidentiality039# esp_proposals = aes256gcm16-ecp384040# esp_proposals = aes256-prfsha384-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024041esp_proposals = aes256gcm16-prfsha384-x25519-x448-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024042 043#---------------------------------044 045rekey_time = 5400 # 90min046# rekey_time = 180 # 3min047rekey_bytes = 500000000048rekey_packets = 1000000049 050}051}052 053#--------------------------------054# IKE055#-------056 057version = 2058dpd_delay = 60s059 060# AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256061# proposals = default062 063# Integrity Protection Only064# proposals = aes256-sha384-ecp384065 066# Integrity Protection and Confidentiality067# proposals = aes256gcm16-prfsha384-ecp384068proposals = aes256gcm16-prfsha384-x25519-x448-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024069 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 # tree002.003├── conf.d004│ └── fr-ca.conf005├── ecdsa006├── pkcs12007├── pkcs8008├── private009│ └── gate.fr.lab3w.com-Key-ed448.pem010├── pubkey011│ ├── gate.fr.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem012│ └── srv.ca.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem013├── rsa014├── swanctl.conf015├── syslog016├── x509017│ └── gate.fr.lab3w.com-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem018├── x509aa019├── x509ac020├── x509ca021│ └── LAB3W_ZW3B-caCert-rsa_3072.pem022├── x509crl023└── x509ocsp024 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.conf002fr-ca {003remote_addrs = 158.69.126.137004005# Request to receive the IPv6 address of the pool configured on the server (responder) on this machine (on the network interface)006vips = ::0007 008local {009auth = pubkey010id = gate.fr.lab3w.com011certs = gate.fr.lab3w.com-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem012# pubkeys = gate.fr.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem013}014remote {015auth = pubkey016id = srv.ca.lab3w.com017pubkeys = srv.ca.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem018}019children {020fr-ca {021# mode = transport022 023# All networks available by server « global »024remote_ts = fec0::1/16, fc00:5300:60:9389::/64, fec2::1/128, fc00:41d0:801:2000::/64, fec3::1/128, fc00:41d0:701:1100::/64025 026# IPs on this client027local_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/104028 029start_action = trap030 031#--------------------------------032# ESP033#-------034 035# Integrity Protection Only036# esp_proposals = aes256gmac-ecp384037 038# Integrity Protection and Confidentiality039# esp_proposals = aes256gcm16-ecp384040# esp_proposals = aes256-prfsha384-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024041esp_proposals = aes256gcm16-prfsha384-x25519-x448-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024042 043#---------------------------------044 045rekey_time = 5400 # 90min046# rekey_bytes = 500000000047# rekey_packets = 1000000048}049}050 051#--------------------------------052# IKE053#-------054 055version = 2056dpd_delay = 60s057 058rekey_time = 0s059 060# Integrity Protection Only061# proposals = aes256-sha384-ecp384062 063# Integrity Protection and Confidentiality064# proposals = aes256gcm16-prfsha384-ecp384065proposals = aes256gcm16-prfsha384-x25519-x448-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024066 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.conf002connections {003 004include conf.d/fr-ca.conf005}006 007authorities {008strongswan {009cacert = LAB3W_ZW3B-caCert-rsa_3072.pem010# crl_uris = http://ip6-winnetou.strongswan.org/strongswan.crl011}012}013 014pools {015 016 017}018secrets {019 020}021 022# Include config snippets023include 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.pem003#pki --gen --type ecdsa --size 384 --outform pem > private/caKey-ecdsa_384.pem004#pki --gen --type ed25519 --outform pem > private/caKey-ed25519.pem005#pki --gen --type ed448 --outform pem > private/caKey-ed448.pem006#algo non valider NIST dans la version 6 beta6 de strongswan007#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.pem003#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.pem004#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.pem005#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.pem006#algo non valider NIST dans la version 6 beta6 de strongswan007#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.pem002root@server:/etc/swanctl # pki --req --type priv --in private/orj-Key-rsa_3072.pem003--dn "C=FR, O=LAB3W, CN=orj@lab3w.fr"004--san orj@lab3w.fr --san orj@lab3w.com --outform pem > tmp/orj-Req.pem005 006root@server:/etc/swanctl # pki --issue --cacert x509ca/LAB3W_ZW3B-caCert-rsa_3072.pem --cakey private/LAB3W_ZW3B-caKey-rsa_3072.pem007--type pkcs10 --in tmp/orj-Req.pem --serial 01 --lifetime 1826008--outform pem > x509/orj-Cert-rsa_3072-sign_ca-rsa_3072.pem009 010root@server:/etc/swanctl # openssl pkcs12 -export -inkey private/orj-Key-rsa3072.pem011-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.pem002subject: "C=FR, O=LAB3W, CN=vps.de.ipv10.net"003issuer: "C=FR, O=LAB3W, CN=ZW3B Cyber Root CA : rsa_3072"004validity: not before Mar 05 21:40:17 2025, ok005not after Mar 05 21:40:17 2030, ok (expires in 1813 days)006serial: 01007altNames: vps.de.lab3w.com, vps.de.zw3b.net008flags:009authkeyId: 95:66:e0:e9:97:2d:7b:cb:ee:3d:7b:e3:95:5f:10:19:bc:6e:71:d5010subjkeyId: 68:74:88:06:9c:cb:b0:07:8f:0e:d7:bf:b3:af:61:ef:91:59:e7:58011pubkey: ED448 456 bits012keyid: 7e:9c:cf:d3:0c:6c:e9:70:04:77:f2:e0:8b:e9:be:54:75:cd:42:20013subjkey: 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.pem002Certificate:003Data:004Version: 3 (0x2)005Serial Number: 1 (0x1)006Signature Algorithm: sha256WithRSAEncryption007Issuer: C = FR, O = LAB3W, CN = ZW3B Cyber Root CA : rsa_3072008Validity009Not Before: Mar 5 20:40:17 2025 GMT010Not After : Mar 5 20:40:17 2030 GMT011Subject: C = FR, O = LAB3W, CN = vps.de.ipv10.net012Subject Public Key Info:013Public Key Algorithm: ED448014ED448 Public-Key:015pub:016a4:28:97:d3:f6:b1:81:ca:0b:6e:4e:60:86:64:9e:01750:d5:40:95:b1:e6:f9:e0:a4:fe:db:be:80:4c:fb:01845:80:72:15:2f:40:ca:be:0c:0a:5d:17:af:d5:41:019a0:e7:60:35:12:fb:66:30:d3:53:f6:80020X509v3 extensions:021X509v3 Authority Key Identifier:022keyid:95:66:E0:E9:97:2D:7B:CB:EE:3D:7B:E3:95:5F:10:19:BC:6E:71:D5023 024X509v3 Subject Alternative Name:025DNS:vps.de.lab3w.com, DNS:vps.de.zw3b.net026Signature Algorithm: sha256WithRSAEncryption027d1:8a:3e:48:b6:e1:0c:b5:01:1d:c3:ee:ba:84:ce:96:43:da:02855:2d:9b:57:eb:c6:37:f1:78:f0:86:11:e3:a0:39:63:0c:78:029e0:10:e2:e9:69:d0:42:bf:f9:e3:5c:8f:3e:02:2b:89:a8:dc:0308c:ce:55:b5:9f:10:2c:17:b2:21:a0:46:61:67:33:b5:15:aa:031bb:fb:03:fe:09:8f:d7:18:7c:61:33:07:7f:01:5c:62:c0:d7:032c0:a8:2d:cb:bf:0f:69:bf:e6:72:5f:cc:94:99:a8:a1:a7:48:03336:be:21:69:06:5b:24:33:9d:43:af:36:c4:a9:15:4c:a6:c3:03485:de:e4:ce:35:87:47:90:e1:72:70:74:55:c9:da:75:3d:6b:035db:48:3c:b9:43:9d:dd:43:3f:1a:5f:46:b1:26:fa:2f:1c:09:0361b:9e:eb:c6:2a:90:c0:6d:9c:f5:3b:9f:34:7c:fb:ca:23:4a:037b4:e3:cd:45:85:cd:58:63:9a:4c:e7:77:b9:b5:d8:a4:74:29:038a4:d5:75:df:96:c3:71:50:fc:8d:bf:9c:6e:af:ff:e4:88:73:0397e:7e:bd:7c:fa:80:07:6c:da:73:dc:bc:15:3f:33:f2:5b:6a:0403c:d0:0d:2d:16:8a:c7:df:66:39:bb:ce:ec:bf:52:28:76:4e:041fc:13:ab:e0:af:3a:6d:51:ea:6b:22:b0:53:f4:51:8b:b2:b3:04278:9e:3d:91:d1:47:f2:2b:02:2d:a5:16:1a:e5:84:65:44:a5:043f4:0c:c4:78:58:bc:60:c5:76:da:a2:5d:d1:73:03:d8:23:8d:0446a:59:bc:a6:8b:3a:5c:e9:0e:6c:0c:3b:17:6a:38:87:b3:f0:0450c:10:b5:eb:df:10:db:44:d9:8a:4e:12:55:a9:f3:4e:61:55:04657:55:8e:3e:35:92:f4:59:37:a8:39:00:e5:c9:fe:7f:c2:00:047d3:78:48:aa:5b:c1:15:23:39:f6:51:24:28:f5:dc:0b:61:16:048cf:ad:8a:36:23:0f049-----BEGIN CERTIFICATE-----050MIIC6DCCAVCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJGUjEO051MAwGA1UEChMFTEFCM1cxJjAkBgNVBAMMHVpXM0IgQ3liZXIgUm9vdCBDQSA6IHJz052YV8zMDcyMB4XDTI1MDMwNTIwNDAxN1oXDTMwMDMwNTIwNDAxN1owODELMAkGA1UE053BhMCRlIxDjAMBgNVBAoTBUxBQjNXMRkwFwYDVQQDExB2cHMuZGUuaXB2MTAubmV0054MEMwBQYDK2VxAzoApCiX0/axgcoLbk5ghmSeUNVAlbHm+eCk/tu+gEz7RYByFS9A055yr4MCl0Xr9VBoOdgNRL7ZjDTU/aAo1EwTzAfBgNVHSMEGDAWgBSVZuDply17y+49056e+OVXxAZvG5x1TAsBgNVHREEJTAjghB2cHMuZGUubGFiM3cuY29tgg92cHMuZGUu057enczYi5uZXQwDQYJKoZIhvcNAQELBQADggGBANGKPki24Qy1AR3D7rqEzpZD2lUt058m1frxjfxePCGEeOgOWMMeOAQ4ulp0EK/+eNcjz4CK4mo3IzOVbWfECwXsiGgRmFn059M7UVqrv7A/4Jj9cYfGEzB38BXGLAADCoLcu/D2m/5nJfzJSZqKGnSDa+IWkGWyQz060nUOvNsSpFUymw4Xe5M41h0eQ4XJwdFXJ2nU9a9tIPLlDnd1DPxpfRrEm+i8cCRue06168YqkMBtnPU7nzR8+8ojSrTjzUWFzVhjmkznd7m12KR0KaTVdd+Ww3FQ/I2/nG6v062/+SIc35+vXz6gAds2nPcvBU/M/JbajzQDS0WisffZjm7zuy/Uih2TvwTq+CvOm1R0636msisFP0UYuys3iePZHRR/IrAi2lFhrlhGVEpfQMxHhYvGDFdtqiXdFzA9gjjWpZ064vKaLOlzpDmwMOxdqOIez8AwQtevfENtE2YpOElWp805hVVdVjj41kvRZN6g5AOXJ065/n/CANN4SKpbwRUjOfZRJCj13AthFs+tijYjDw==066-----END CERTIFICATE-----
Others example
Script avec 9 lignes
001# create pubkey002openssl x509 -in x509/vps_uk-Cert-ed25519-sign_ca-ed25519.pem -noout -pubkey -out pubkey/vps_uk-PubKey-ed25519.pem003 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 DER006 007# read008openssl x509 -in x509/vps_uk-Cert-ed25519-sign_ca-ed25519.der -noout -text -inform der009openssl 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-sas002ca-de: #79, ESTABLISHED, IKEv2, 109b0e829cf6efe5_i* 2ebee4563f7533ab_r003local 'srv.ca.lab3w.com' @ 158.69.126.137[4500]004remote 'vps.de.ipv10.net' @ 135.125.133.51[4500] [fec3::1]005AES_GCM_16-256/PRF_HMAC_SHA2_384/CURVE_25519/KE1_ML_KEM_512/KE2_ML_KEM_768/KE3_ML_KEM_1024006established 717s ago, rekeying in 13156s007ca-de: #799, reqid 3, INSTALLED, TUNNEL, ESP:AES_GCM_16-256/CURVE_25519/KE1_ML_KEM_512/KE2_ML_KEM_768/KE3_ML_KEM_1024008installed 2126s ago, rekeying in 3079s, expires in 3814s009in ce91f6ac, 4709233 bytes, 62320 packets, 0s ago010out cbacc7f0, 5454048 bytes, 34569 packets, 0s ago011local 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/128012remote fc00:41d0:701:1100::/64 fec3::1/128013 014ca-uk: #78, ESTABLISHED, IKEv2, 88e1b6418709f450_i* 27f0d6ec099929bd_r015local 'srv.ca.lab3w.com' @ 158.69.126.137[4500]016remote 'vps.uk.ipv10.net' @ 57.128.171.43[4500] [fec2::1]017AES_GCM_16-256/PRF_HMAC_SHA2_384/CURVE_25519/KE1_ML_KEM_512/KE2_ML_KEM_768/KE3_ML_KEM_1024018established 6376s ago, rekeying in 6735s019ca-uk: #812, reqid 5, INSTALLED, TUNNEL, ESP:AES_GCM_16-256/CURVE_25519/KE1_ML_KEM_512/KE2_ML_KEM_768/KE3_ML_KEM_1024020installed 121s ago, rekeying in 52s, expires in 77s021in c83f9111, 258480 bytes, 3493 packets, 0s ago022out cc1f3b0f, 138816 bytes, 1831 packets, 0s ago023local 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/128024remote fc00:41d0:801:2000::/64 fec2::1/128025 026ca-fr: #76, ESTABLISHED, IKEv2, f3d91915c5e3c5e4_i* f89ee25d69bdb2c1_r027local 'srv.ca.lab3w.com' @ 158.69.126.137[4500]028remote 'gate.fr.lab3w.com' @ 90.5.102.244[4500]029AES_GCM_16-256/PRF_HMAC_SHA2_384/CURVE_25519/KE1_ML_KEM_512/KE2_ML_KEM_768/KE3_ML_KEM_1024030established 13259s ago, rekeying in 907s031ca-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_1024032installed 2216s ago, rekeying in 2676s, expires in 3725s033in c97b7a62, 3169602 bytes, 36390 packets, 0s ago034out c7eab254, 13699815 bytes, 57894 packets, 0s ago035local fc00:41d0:701:1100::/64 fc00:41d0:801:2000::/64 fc00:5300:60:9389::/64 fec0::/16 fec2::1/128 fec3::1/128036remote 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 220002fc00:41d0:701:1100::/64 dev vmbr0 proto static src fec0::1 metric 1024 pref medium003fc00:41d0:801:2000::/64 dev vmbr0 proto static src fec0::1 metric 1024 pref medium004fc01::10:106:0:0/104 dev vmbr0 proto static src fec0::1 metric 1024 pref medium005fc01::10:126:42:0/112 dev vmbr0 proto static src fec0::1 metric 1024 pref medium006fc01::172:16:0:0/104 dev vmbr0 proto static src fec0::1 metric 1024 pref medium007fc01::192:168:0:0/104 dev vmbr0 proto static src fec0::1 metric 1024 pref medium008fec1::/16 dev vmbr0 proto static src fec0::1 metric 1024 pref medium009fec2::1 dev vmbr0 proto static src fec0::1 metric 1024 pref medium010fec3::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 220002fc00:41d0:701:1100::/64 dev netbr0 proto static src fec1::1 metric 1024 pref medium003fc00:41d0:801:2000::/64 dev netbr0 proto static src fec1::1 metric 1024 pref medium004fc00:5300:60:9389::/64 dev netbr0 proto static src fec1::1 metric 1024 pref medium005fec0::/16 dev netbr0 proto static src fec1::1 metric 1024 pref medium006fec2::1 dev netbr0 proto static src fec1::1 metric 1024 pref medium007fec3::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,iperf3etc.
Tester les documentations suivantes :
- strongSwan Docs / Configuration / IPv6 and the Neighbor Discovery Protocol
- strongSwan Docs / How-tos / Taking Traffic Dumps on Linux
- strongSwan Docs / Plugins / Plugin List
- strongSwan Docs / Features / High Availability
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 :
- strongSwan : Open-source, modular and portable IPsec-based VPN solution.
- GitHub strongSwan - tags - Discussions
- WiKi strongSwan
- Docs strongSwan
- Algorithm Proposals (Cipher Suites) - Commercial National Security Algorithm Suite and Post-Quantum Key Exchange Methods et autres.
- 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.- GitHub - Open Quantum Safe : Software for prototyping quantum-resistant cryptography - OQS-Demos
- IETF (Internet Engineering Task Force) Draft Internet Engineering Steering Group IESG : ML-KEM Post-Quantum Key Agreement for TLS 1.3
- NIST (National Institute of Standards and Technology) : Module-Lattice-Based Key-Encapsulation Mechanism Standard
- 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 :
- IPv6 address range (road warrior pools configuration) #2527
- In the native VPN option from Android, i cannot connect to my VPN ? #2528
- I'm trying to retrieve the correct NMAP responses through strongSwan from "site" to "site". #2669
- Connection NOT TAGGUER DELETED .. Multiple ESTABLISHED for the same site. #2715
- Error remote_ts route table 220 with remote_addrs IPv6 ? #2724
- 🔑 How to configure strongSwan v6 Post-Quantum Cryptography NIST compliant #2731
D'autres liens que j'ai ouvert en utilisant PQ strongSwan v6.0beta Post-Quantum IKEv2 Daemon de strongX509 (Github).
- Debian-FR.org : Network IPv6 - IPSec - strongSwan - Modern Security communication
- LaFibre.info : VPN - PQ strongSwan - Modern Security network

