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 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 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 006strongSwan 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)
029echo "$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 040pkill charon
041;;
042status)
043echo "$0 Status"
044echo "# -------------------------"
045echo "# Security Association"
046echo "# -------"
047echo ""
048 049swanctl --list-sas
050 051echo ""
052echo "# -------"
053echo ""
054 055echo "# -------------------------"
056echo "# Route show"
057echo "# -------"
058echo ""
059 060/usr/sbin/ip -6 route show table 220
061/usr/sbin/ip -4 route show table 220
062 063echo ""
064echo "# -------"
065echo ""
066 067echo "# -------------------------"
068echo "# XFRM Policy"
069echo "# -------"
070echo ""
071 072/usr/sbin/ip -6 xfrm policy
073/usr/sbin/ip -4 xfrm policy
074 075echo ""
076echo "# -------"
077echo ""
078 079echo "# -------------------------"
080echo "# XFRM State"
081echo "# -------"
082echo ""
083 084/usr/sbin/ip -6 xfrm state
085/usr/sbin/ip -4 xfrm state
086 087echo ""
088echo "# -------"
089echo ""
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:
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 --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:
005swanctl --counters (-C) list or reset IKE event counters
006swanctl --initiate (-i) initiate a connection
007swanctl --terminate (-t) terminate a connection
008swanctl --rekey (-R) rekey an SA
009swanctl --redirect (-d) redirect an IKE_SA
010swanctl --uninstall (-u) uninstall a trap or shunt policy
011swanctl --install (-p) install a trap or shunt policy
012swanctl --list-sas (-l) list currently active IKE_SAs
013swanctl --monitor-sa (-m) monitor for IKE_SA and CHILD_SA changes
014swanctl --list-pols (-P) list currently installed policies
015swanctl --list-authorities (-B) list loaded authority configurations
016swanctl --list-conns (-L) list loaded configurations
017swanctl --list-certs (-x) list stored certificates
018swanctl --list-pools (-A) list loaded pool configurations
019swanctl --list-algs (-g) show loaded algorithms
020swanctl --flush-certs (-f) flush cached certificates
021swanctl --load-all (-q) load credentials, authorities, pools and connections
022swanctl --load-authorities (-b) (re-)load authority configuration
023swanctl --load-conns (-c) (re-)load connection configuration
024swanctl --load-creds (-s) (re-)load credentials
025swanctl --load-pools (-a) (re-)load pool configuration
026swanctl --log (-T) trace logging output
027swanctl --version (-v) show version information
028swanctl --stats (-S) show daemon stats information
029swanctl --reload-settings (-r) reload daemon strongswan.conf
030swanctl --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
021plugins {
022include strongswan.d/charon/*.conf
023 024eap-dynamic {
025# prefer_user = yes
026# preferred = eap-ttls, eap-tls, eap-mschapv2, eap-md5, psk
027preferred = eap-mschapv2, eap-tls, eap-ttls
028}
029eap-tls {
030fragment_size = 512
031}
032}
033 034start-scripts {
035creds = swanctl --load-creds
036conns = swanctl --load-conns
037pools = swanctl --load-pools
038}
039 040# eap-dynamic {
041# prefer_user = yes
042# preferred = tls, mschapv2
043# }
044 045send_vendor_id = yes
046prefer_configured_proposals = yes
047fragment_size = 1480
048max_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
057filelog {
058charon {
059# path to the log file, specify this as section name in versions prior to 5.7.0
060path = /var/log/charon.log
061# add a timestamp prefix
062time_format = %b %e %T
063# prepend connection name, simplifies grepping
064ike_name = yes
065# overwrite existing files
066append = no
067# increase default loglevel for all daemon subsystems
068default = 1 #2
069# flush each line to disk
070flush_line = yes
071}
072stderr {
073# more detailed loglevel for a specific subsystem, overriding the
074# default loglevel.
075 076# applications other than daemons
077app = -1
078# Low-level encoding/decoding (ASN.1, X.509 etc.)
079asn = -1
080# Configuration management and plugins
081cfg = -1
082# CHILD_SA/IPsec SA
083chd = -1
084# Main daemon setup/cleanup/signal handling
085dmn = -1
086# Packet encoding/decoding encryption/decryption operations
087enc = -1
088# libipsec library messages
089esp = 2
090# IKE_SA/ISAKMP SA
091ike = 2 # 2
092# Integrity Measurement Collector
093imc = -1
094# Integrity Measurement Verifier
095imv = -1
096# Jobs queuing/processing and thread pool management
097job = -1
098# IPsec/Networking kernel interface
099knl = -1
100# libstrongswan library messages
101lib = -1
102# IKE_SA manager, handling synchronization for IKE_SA access
103mgr = -1
104# IKE network communication
105net = -1
106# Platform Trust Service
107pts = -1
108# libtls library messages
109tls = -1
110# Trusted Network Connect
111tnc = -1
112}
113}
114 115# and two loggers using syslog
116syslog {
117# prefix for each log message
118identifier = charon-custom
119# use default settings to log to the LOG_DAEMON facility
120daemon {
121}
122# very minimalistic IKE auditing logs to LOG_AUTHPRIV
123auth {
124default = -1
125ike = 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 004include conf.d/ca-fr.conf
005include conf.d/ca-uk.conf
006include conf.d/ca-de.conf
007 008include conf.d/ikev2-pubkey.conf
009include conf.d/ikev2-eap.conf
010include conf.d/ikev2-eap-mschapv2.conf
011include conf.d/ikev2-eap-tls-symmetric.conf
012include conf.d/ikev2-eap-tls-asymmetric.conf
013 014}
015 016authorities {
017ZW3BCyberRootCA_rsa_3072 {
018cacert = LAB3W_ZW3B-caCert-rsa_3072.pem
019# crl_uris = http://ip6-winnetou.strongswan.org/strongswan.crl
020}
021}
022 023pools {
024 025rw_pool {
026addrs = 172.16.8.100-172.16.8.110
027dns = 10.105.150.1, 8.8.4.4
028}
029rw_pool-v6 {
030addrs = fec0::eeee:1ab3:00ca:d000-fec0::eeee:1ab3:00ca:d0ff
031dns = fc00:5300:60:9389:15:2:a:1000, 2001:4860:4860::8844
032}
033 034# IP HOME
035v6-lab3w_2home {
036addrs = fec1::1/16
037}
038 039# IP VPS
040v6_vps-uk {
041addrs = fec2::1/128
042}
043v6_vps-de {
044addrs = fec3::1/128
045}
046 047}
048 049secrets {
050# private-orj {
051# file = private/orj-Key-rsa_3072.pem
052# }
053# Pre-Shared Key
054ike-0 {
055id = nomade
056secret = 1234
057}
058eap-0 {
059id = nomade
060secret = 1234
061}
062 063# Extensible Authentication Protocol
064eap-1 {
065id = orj@lab3w.fr
066secret = 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.
- Wiki strongSwan Usable Examples configurations
001connections {
002 003include conf.d/ca-fr.conf
004include conf.d/ca-uk.conf
005include conf.d/ca-de.conf
006 007include conf.d/ikev2-pubkey.conf
008include conf.d/ikev2-eap.conf
009include conf.d/ikev2-eap-mschapv2.conf
010include conf.d/ikev2-eap-tls-symmetric.conf
011include 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 {
003remote_addrs = 90.5.102.244
004 005# Addresses (pools) to declare for this connection
006pools = v6-lab3w_2home
007 008local {
009auth = pubkey
010id = srv.ca.lab3w.com
011# certs = srv.ca.lab3w.com-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
012pubkeys = srv.ca.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
013}
014remote {
015auth = pubkey
016id = gate.fr.lab3w.com
017# certs = gate.fr.lab3w.com-Cert-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
018pubkeys = gate.fr.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
019}
020children {
021ca-fr {
022# mode = transport
023 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::/64
026 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/104
028 029start_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
041esp_proposals = aes256gcm16-prfsha384-x25519-x448-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024
042 043#---------------------------------
044 045rekey_time = 5400 # 90min
046# rekey_time = 180 # 3min
047rekey_bytes = 500000000
048rekey_packets = 1000000
049 050}
051}
052 053#--------------------------------
054# IKE
055#-------
056 057version = 2
058dpd_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
068proposals = 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 {
003remote_addrs = 158.69.126.137
004005
# Request to receive the IPv6 address of the pool configured on the server (responder) on this machine (on the network interface)
006vips = ::0
007 008local {
009auth = pubkey
010id = gate.fr.lab3w.com
011certs = 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}
014remote {
015auth = pubkey
016id = srv.ca.lab3w.com
017pubkeys = srv.ca.lab3w.com-PubKey-ed448-signed-by-LAB3W_ZW3B-caCert-rsa_3072.pem
018}
019children {
020fr-ca {
021# mode = transport
022 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::/64
025 026# IPs on this client
027local_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 029start_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
041esp_proposals = aes256gcm16-prfsha384-x25519-x448-ke1_mlkem512-ke2_mlkem768-ke3_mlkem1024
042 043#---------------------------------
044 045rekey_time = 5400 # 90min
046# rekey_bytes = 500000000
047# rekey_packets = 1000000
048}
049}
050 051#--------------------------------
052# IKE
053#-------
054 055version = 2
056dpd_delay = 60s
057 058rekey_time = 0s
059 060# Integrity Protection Only
061# proposals = aes256-sha384-ecp384
062 063# Integrity Protection and Confidentiality
064# proposals = aes256gcm16-prfsha384-ecp384
065proposals = 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 004include conf.d/fr-ca.conf
005}
006 007authorities {
008strongswan {
009cacert = 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
002subject: "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, ok
005not after Mar 05 21:40:17 2030, ok (expires in 1813 days)
006serial: 01
007altNames: vps.de.lab3w.com, vps.de.zw3b.net
008flags:
009authkeyId: 95:66:e0:e9:97:2d:7b:cb:ee:3d:7b:e3:95:5f:10:19:bc:6e:71:d5
010subjkeyId: 68:74:88:06:9c:cb:b0:07:8f:0e:d7:bf:b3:af:61:ef:91:59:e7:58
011pubkey: ED448 456 bits
012keyid: 7e:9c:cf:d3:0c:6c:e9:70:04:77:f2:e0:8b:e9:be:54:75:cd:42:20
013subjkey: 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:
003Data:
004Version: 3 (0x2)
005Serial Number: 1 (0x1)
006Signature Algorithm: sha256WithRSAEncryption
007Issuer: C = FR, O = LAB3W, CN = ZW3B Cyber Root CA : rsa_3072
008Validity
009Not Before: Mar 5 20:40:17 2025 GMT
010Not After : Mar 5 20:40:17 2030 GMT
011Subject: C = FR, O = LAB3W, CN = vps.de.ipv10.net
012Subject Public Key Info:
013Public Key Algorithm: ED448
014ED448 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:80
020X509v3 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:D5
023 024X509v3 Subject Alternative Name:
025DNS:vps.de.lab3w.com, DNS:vps.de.zw3b.net
026Signature Algorithm: sha256WithRSAEncryption
027d1: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: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
003local '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_1024
006established 717s ago, rekeying in 13156s
007ca-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
008installed 2126s ago, rekeying in 3079s, expires in 3814s
009in ce91f6ac, 4709233 bytes, 62320 packets, 0s ago
010out cbacc7f0, 5454048 bytes, 34569 packets, 0s ago
011local 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
012remote fc00:41d0:701:1100::/64 fec3::1/128
013 014ca-uk: #78, ESTABLISHED, IKEv2, 88e1b6418709f450_i* 27f0d6ec099929bd_r
015local '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_1024
018established 6376s ago, rekeying in 6735s
019ca-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
020installed 121s ago, rekeying in 52s, expires in 77s
021in c83f9111, 258480 bytes, 3493 packets, 0s ago
022out cc1f3b0f, 138816 bytes, 1831 packets, 0s ago
023local 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
024remote fc00:41d0:801:2000::/64 fec2::1/128
025 026ca-fr: #76, ESTABLISHED, IKEv2, f3d91915c5e3c5e4_i* f89ee25d69bdb2c1_r
027local '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_1024
030established 13259s ago, rekeying in 907s
031ca-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
032installed 2216s ago, rekeying in 2676s, expires in 3725s
033in c97b7a62, 3169602 bytes, 36390 packets, 0s ago
034out c7eab254, 13699815 bytes, 57894 packets, 0s ago
035local fc00:41d0:701:1100::/64 fc00:41d0:801:2000::/64 fc00:5300:60:9389::/64 fec0::/16 fec2::1/128 fec3::1/128
036remote 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 :
- 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