<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CAcert on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/cacert/</link><description>Recent content in CAcert on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 16 Oct 2018 11:45:00 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/cacert/index.xml" rel="self" type="application/rss+xml"/><item><title>Configurer ses contextes kubernetes dans kubectl sur un poste client</title><link>https://blog.zwindler.fr/2018/10/16/configurer-ses-contextes-pour-kubectl-sur-un-poste-client/</link><pubDate>Tue, 16 Oct 2018 11:45:00 +0000</pubDate><guid>https://blog.zwindler.fr/2018/10/16/configurer-ses-contextes-pour-kubectl-sur-un-poste-client/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/11/kubernetes2.webp" alt="Featured image of post Configurer ses contextes kubernetes dans kubectl sur un poste client" /&gt;&lt;h2 id="mais-doù-il-sort-ce-contexte-"&gt;Mais d’où il sort ce contexte ?
&lt;/h2&gt;&lt;p&gt;Encore un article qui traînait dans mon tiroir, depuis des mois ;-). Vous avez peut être suivi un de mes tutoriels pour installer Kubernetes, que ce soit avec &lt;a class="link" href="https://blog.zwindler.fr/2017/06/07/installer-cluster-kubernetes-vm-centos/" &gt;kubeadm&lt;/a&gt;, &lt;a class="link" href="https://blog.zwindler.fr/2017/12/05/installer-kubernetes-kubespray-ansible/" &gt;kubespray&lt;/a&gt;, ou plus récemment avec &lt;a class="link" href="https://blog.zwindler.fr/2018/09/12/installer-minikube-sur-windows-10-et-hyper-v-part-1/" &gt;Minikube&lt;/a&gt;. Vous avez peut être également lu le petit article que j’ai fais sur &lt;a class="link" href="https://blog.zwindler.fr/2018/08/28/utiliser-kubectx-kubens-pour-changer-facilement-de-context-et-de-namespace-dans-kubernetes/" &gt;kubectx/kubens&lt;/a&gt;, pour se faciliter la gestion des contexts, quand on en a beaucoup.&lt;/p&gt;
&lt;p&gt;Mais après avoir instancié un cluster et avant d’avoir à jongler entre plusieurs contextes, j’ai peut être zappé une (petite) étape entre les deux. Un détail, vraiment&amp;hellip; il faut configurer les contextes en question !&lt;/p&gt;
&lt;p&gt;La documentation officielle, si elle est riche et complète, a aussi l’inconvénient d’être assez troublante pour un néophyte, car il faut trier parmi plusieurs pages et une multitude de cas particuliers :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kubernetes.io/docs/reference/access-authn-authz/authentication/#users-in-kubernetes" target="_blank" rel="noopener"
&gt;Users in Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/" target="_blank" rel="noopener"
&gt;Using RBAC Authorization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/" target="_blank" rel="noopener"
&gt;Accessing Clusters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/" target="_blank" rel="noopener"
&gt;Configure access to multiple clusters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="authentification-depuis-larrivée-du-rbac-dans-kubernetes"&gt;Authentification depuis l’arrivée du RBAC dans Kubernetes
&lt;/h2&gt;&lt;p&gt;Si vous suivez un peu Kubernetes, vous êtes peut être au courant d’une révolution qui est arrivée (et heureusement) dans l’administration des clusters Kubernetes. Depuis la version 1.7 (oui ce brouillon est en attente depuis la 1.7), on est passé du mode &lt;em&gt;ABAC&lt;/em&gt; où les permissions des &lt;strong&gt;ServicesAccount&lt;/strong&gt; étaient gérées dans un fichier de configuration et où les permissions étaient souvent très laxistes par défaut, à un mode &lt;em&gt;RBAC&lt;/em&gt; (&lt;a class="link" href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/" target="_blank" rel="noopener"
&gt;Role-based access control&lt;/a&gt;), bien plus riche et souvent mieux maîtrisé.&lt;/p&gt;
&lt;p&gt;Maintenant, on peut donc créer des &lt;strong&gt;ServicesAccount&lt;/strong&gt; (pour nos applications), et les relier à des &lt;strong&gt;Roles&lt;/strong&gt; (limité à un namespace) ou des &lt;strong&gt;ClusterRoles&lt;/strong&gt; (pour tout le cluster), eux mêmes respectivement reliés par des &lt;strong&gt;RolesBindings&lt;/strong&gt; et des &lt;strong&gt;ClusterRoleBindings&lt;/strong&gt;. Vous me suivez ?&lt;/p&gt;
&lt;h2 id="créer-lutilisateur-sur-un-master"&gt;Créer l’utilisateur (sur un master)
&lt;/h2&gt;&lt;p&gt;Le plus propre serait évidement de disposer d’une source d’authentification externe (type LDAP/AD ou autre) mais pour les besoins du tuto on va rester basique et fonctionner avec ce dont on dispose dans le K8s seulement, c’est à dire les &lt;strong&gt;ServiceAccounts&lt;/strong&gt;. A noter, &lt;em&gt;n’utilisez pas cela en production, ce n’est pas conseillé. Mettez en place une source externe type LDAP/AD/&amp;hellip;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sur un des masters où l’on a installé Kubernetes, on va donc créer un &lt;strong&gt;ServiceAccount&lt;/strong&gt; avec &lt;strong&gt;kubectl&lt;/strong&gt;. On l’utilisera par la suite pour se connecter en kubectl depuis notre poste client :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; myserviceaccount.yaml &amp;lt;&amp;lt; EOF
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: myserviceaccount
EOF
kubectl apply -f myserviceaccount.yaml
serviceaccount/myserviceaccount created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Par défaut, ce &lt;strong&gt;ServiceAccount&lt;/strong&gt; n’aura accès à pratiquement rien. On va donc créer un &lt;strong&gt;ClusterRoleBinding&lt;/strong&gt; qui va lier notre &lt;strong&gt;ServiceAccount&lt;/strong&gt; avec un &lt;strong&gt;ClusterRole&lt;/strong&gt; existant avec le niveau de privilèges qu’on souhaitera.&lt;/p&gt;
&lt;p&gt;Pour obtenir la liste des &lt;strong&gt;ClusterRoles&lt;/strong&gt; disponibles sur votre cluster, vous pouvez les lister avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get clusterrole
NAME AGE
admin 1d
cluster-admin 1d
[...]
view 1d
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On privilégiera un &lt;strong&gt;ClusterRole&lt;/strong&gt; avec juste les permissions nécessaires et pas plus, par exemple « &lt;strong&gt;view&lt;/strong&gt; » pour commencer.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; crbmyserviceaccount.yaml &amp;lt;&amp;lt; EOF
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: crbmyserviceaccount
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: view
subjects:
- kind: ServiceAccount
name: myserviceaccount
namespace: default
EOF
kubectl apply -f crbmyserviceaccount.yaml
clusterrolebinding.rbac.authorization.k8s.io/crbmyserviceaccount created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note : Si le &lt;strong&gt;ClusterRole&lt;/strong&gt; de vos rêves n’existe pas, vous pouvez toujours en créer un vous même avec les privilèges que vous souhaitez.&lt;/p&gt;
&lt;h2 id="récupérer-les-informations-du-cluster-sur-un-master"&gt;Récupérer les informations du cluster (sur un master)
&lt;/h2&gt;&lt;p&gt;Maintenant qu’on a créé le &lt;strong&gt;ServiceAccount&lt;/strong&gt; et qu’il dispose d’un &lt;strong&gt;ClusterRole&lt;/strong&gt; grâce au &lt;strong&gt;ClusterRoleBinding&lt;/strong&gt;, un token a été créé par défaut et enregistré dans un &lt;strong&gt;Secret&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;On le retrouve, puis on l’exporte&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get secrets
NAME TYPE DATA AGE
[...]
myserviceaccount-token-bmwwd kubernetes.io/service-account-token 3 5m
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl describe secret myserviceaccount-token-xxxxx
Name: myserviceaccount-token-xxxxx
[...]
token: eyJhbGciOiJSUzI1.....
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Éventuellement aussi on récupère l’URL d’accès à l’API server permettant de contrôler Kubernetes&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl config view | grep server | cut -f 2- -d &amp;#34;:&amp;#34; | tr -d &amp;#34; &amp;#34;
https://@IPMYAWESOMECLUSTERNAME:6443
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration-de-kubectl-sur-le-client"&gt;Configuration de kubectl (sur le client)
&lt;/h2&gt;&lt;p&gt;Pour me simplifier la vie, je &lt;em&gt;sette&lt;/em&gt; la variable &lt;strong&gt;K8SAPI&lt;/strong&gt; pour éviter de retaper à chaque fois l’URL de l’API server qu’on a récupéré juste avant, mais rien ne vous y oblige ! On configure le « cluster » dans notre kubeconfig&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;K8SAPI=https://@IPMYAWESOMECLUSTERNAME:6443
kubectl config set-cluster myawesomecluster --server=${K8SAPI}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Maintenant que le cluster est configuré, on créé des credentials, à partir du token qu’on vient de récupérer&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl config set-credentials myawesomecluster-myserviceaccount --token=&amp;lt;token_récupéré_sur_le_master&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Enfin, on créé un contexte, à partir du cluster et du credential qu’on a créé précédemment&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl config set-context myawesomecluster --cluster=myawesomecluster --user=myawesomecluster-myserviceaccount --namespace=default
kubectl config use-context myawesomecluster
kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* myawesomecluster myawesomecluster myawesomecluster-myserviceaccount default
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous devriez maintenant avoir accès à votre cluster depuis votre poste client !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="bonus--fichier-kubeconfig"&gt;BONUS : fichier .kube/config
&lt;/h2&gt;&lt;p&gt;Pour information, tout ceci est stocké dans un fichier config, créé par défaut dans dossier .kube de votre home directory (~/.kube/config). Si jamais vous êtes aventuriers, vous pouvez d’ailleurs tout écrire vous même, à la main ;-). Plus sérieusement, il peut être utile de savoir où il est pour pouvoir effectuer des modifications de masse, plus pratique qu’avec la ligne de commande &lt;strong&gt;kubectl config&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ce fichier est le fichier par défaut, mais rien ne vous empêche d’en avoir plusieurs si vous ne voulez pas gérer vos contextes dans un seul et même fichier. Si vous décider d’en avoir plusieurs, il faudra indiquer à &lt;strong&gt;kubectl&lt;/strong&gt; QUEL fichier vous voulez utiliser.&lt;/p&gt;
&lt;p&gt;Soit en modifiant la variable d’environnement :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;export KUBECONFIG=$KUBECONFIG:$HOME/.kube/config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Soit en spécifiant explicitement le fichier config à utiliser à chaque commande :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --kubeconfig &amp;lt;PATHTOKUBECONFIG&amp;gt; .....
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="bonus--erreur-certificate-signed-by-unknown-authority"&gt;BONUS : Erreur certificate signed by unknown authority
&lt;/h2&gt;&lt;p&gt;En cas d’erreur « Unable to connect to the server: x509: certificate signed by unknown authority », vous avez 2 possibilités :&lt;/p&gt;
&lt;p&gt;Le plus « quick and dirty », c’est de tout simplement ignorer le certificat du cluster. On peut, à chaque appel de &lt;strong&gt;kubectl&lt;/strong&gt; dire qu’on souhaite ignorer le certificat avec le flag « &amp;ndash;insecure-skip-tls-verify », mais tant qu’à faire bourrin, autant le setter directement au niveau du cluster :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl config set-cluster myawesomecluster --server=${K8SAPI} --insecure-skip-tls-verify
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La seconde méthode consiste à récupérer le fake-ca généré par Kubernetes, et l’ajouter en tant que certificate authority dans votre &lt;strong&gt;.kube/config&lt;/strong&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl config set-cluster myawesomecluster --server=${K8SAPI} --certificate-authority=fake-ca-file
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Signez votre console web Proxmox avec Let’s Encrypt, c’est trivial !</title><link>https://blog.zwindler.fr/2017/05/02/proxmox-lets-encrypt/</link><pubDate>Tue, 02 May 2017 12:00:47 +0000</pubDate><guid>https://blog.zwindler.fr/2017/05/02/proxmox-lets-encrypt/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/04/proxmox_letsencrypt.webp" alt="Featured image of post Signez votre console web Proxmox avec Let’s Encrypt, c’est trivial !" /&gt;&lt;h2 id="vraiment-vous-aurez-votre-petit-cadenas-vert-lets-encrypt-en-2-minutes"&gt;Vraiment, vous aurez votre petit cadenas vert Let’s Encrypt en 2 minutes
&lt;/h2&gt;&lt;p&gt;Difficile pour un geek d’avoir éviter la vague Let’s Encrypt.&lt;/p&gt;
&lt;p&gt;Pendant longtemps, faire signer son site web en HTTPS par une autorité de certification était à la fois couteux et complexe. Le résultat : pendant des années, les sites en HTTPS ont été autosignés et des entreprises se sont fait du gras sur le dos des professionnels qui souhaitaient « faire les choses bien ».&lt;/p&gt;
&lt;p&gt;Il y a bien eu quelques initiatives pour essayer de libérer les Internautes de ce système, mais rien qui n’ait vraiment percé&amp;hellip; Jusqu’à Let’s Encrypt :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let’s Encrypt is a free, automated, and open certificate authority brought to you by the non-profit Internet Security Research Group (ISRG).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cool, on peut maintenant obtenir simplement un certificat reconnu dans tous les navigateurs, et suffisament simplement pour que des gens commencent à automatiser le processus (certbot de l’EFF par exemple) !&lt;br&gt;
&lt;img src="https://blog.zwindler.fr/2017/04/certbot.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et le moins qu’on puisse dire, c’est que l’effet a été massif. regardez par vous même l’évolution des sites certifiés :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/04/letencrypt_growth.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="et-proxmox-ve-alors-"&gt;Et Proxmox VE alors ?
&lt;/h2&gt;&lt;p&gt;Depuis la version 4 de ProxMox, il existe un script qui permet d’ajouter un certificat avec &lt;a class="link" href="https://pve.proxmox.com/wiki/HTTPS_Certificate_Configuration_%28Version_4.x_and_newer%29#1.29_Install_acme.sh" target="_blank" rel="noopener"
&gt;Let’s Encrypt de manière triviale&lt;/a&gt;. Vous n’aurez qu’à taper ces quelques commandes dans votre terminal (soit depuis la console web, soit en SSH)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#Renseignez votre email pour être au courant en cas d&amp;#39;échec
EMAIL=admin@example.org
#Installez git
apt-get install git -y
#Copiez le script sur le compte github Neilpang
git clone https://github.com/Neilpang/acme.sh.git acme.sh-master
#Creez un dossier dans le répertoire de configuration de ProxMox
mkdir /etc/pve/.le
#Exécutez le script
cd /root/acme.sh-master
./acme.sh --install --accountconf /etc/pve/.le/account.conf --accountkey /etc/pve/.le/account.key --accountemail &amp;#34;$EMAIL&amp;#34;
#On vérifie que la configuration est bonne dans le fichier de configuration account.conf Généré
cat /etc/pve/.le/account.conf
#On vérifie que la commande suivante renvoie bien le FQDN que l&amp;#39;on souhaite certifier et avec lequel on voudra se connecter (ici, l&amp;#39;adresse sera https://proxmox.example.org)
hostname -f
proxmox.example.org
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Pour que ça fonctionne, vous devrez cependant avoir le port 80 ouvert vers votre ProxMox.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A priori c’est une des limitations de Let’s Encrypt encore présente, on ne peut pas être en « full HTTPS ». N’oubliez pas de l’ouvrir pour que le client puisse demander à Let’s Encrypt de se connecter chez vous pour générer le certificat.&lt;/p&gt;
&lt;p&gt;Maintenant que tout est prêt, on peut maintenant créer le certificat avec cette commande :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./acme.sh --issue --standalone --keypath /etc/pve/local/pveproxy-ssl.key --fullchainpath /etc/pve/local/pveproxy-ssl.pem --reloadcmd &amp;#34;systemctl restart pveproxy&amp;#34; -d `hostname -f`
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A noter : Si la commande &lt;em&gt;hostname -f&lt;/em&gt; ne renvoie pas le même FQDN que celui que vous souhaitez certifier, remplacez juste « &lt;em&gt;-d `hostname -f`&lt;/em&gt; » par « &lt;em&gt;-d proxmox.example.org&lt;/em&gt; » ; mais si vous ne savez pas pourquoi vous faites ça, c’est probablement une mauvaise idée ;-).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/04/proxmox_letsencrypt01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TA-DAH&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="mais-un-certificat-ça-expire"&gt;Mais un certificat, ça expire&amp;hellip;
&lt;/h2&gt;&lt;p&gt;Et oui, les certificats ça expire !&lt;/p&gt;
&lt;p&gt;C’est notamment une des raisons pour lesquelles les certificats avaient parfois « mauvaise presse » auprès des admins systèmes. Il fallait faire très attention que les certificats soient renouvelés et livrés dans l’application dans les temps, au risque de se retrouver avec une erreur sur le site web pouvant effrayer les utilisateurs.&lt;/p&gt;
&lt;p&gt;Ici, si je ne me trompe pas, le certificat Let’s Encrypt expire au bout de 90 jours. Ça parait très court et ça serait très pénible à renouveler à la main. Heureusement, tout est prévu ;-).&lt;/p&gt;
&lt;p&gt;En réalité, le script vérifie au lancement si le certificats est sur le point d’expirer ou pas. On peut donc le lancer régulièrement, sans risque ! Le plus simple est bien entendu de l’ajouter en crontab.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;crontab -e
45 0 * * * &amp;#34;/root/.acme.sh&amp;#34;/acme.sh --cron --home &amp;#34;/root/.acme.sh&amp;#34; &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut tester à la main pour voir :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;/root/.acme.sh&amp;#34;/acme.sh --cron --home &amp;#34;/root/.acme.sh&amp;#34;
[lundi 20 février 2017, 22:55:29 (UTC+0100)] Renew: &amp;#39;proxmox.example.org&amp;#39;
[lundi 20 février 2017, 22:55:29 (UTC+0100)] Skip, Next renewal time is: vendredi 21 avril 2017, 21:55:01 (UTC+0000)
[lundi 20 février 2017, 22:55:29 (UTC+0100)] Add &amp;#39;--force&amp;#39; to force to renew.
[lundi 20 février 2017, 22:55:29 (UTC+0100)] Skipped proxmox.example.org
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="aller-plus-loin-sur-lets-encrypt"&gt;Aller plus loin sur Let’s Encrypt
&lt;/h2&gt;&lt;p&gt;Quelques articles beaucoup plus poussés sur le sujet, certains peut être un peu outdated mais c’est toujours intéressant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://letsencrypt.org/" target="_blank" rel="noopener"
&gt;letsencrypt.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://linuxfr.org/news/reparlons-de-let-s-encrypt" target="_blank" rel="noopener"
&gt;linuxfr.org/news/reparlons-de-let-s-encrypt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.nextinpact.com/news/97852-de-cacert-a-lets-encrypt-longue-route-vers-https-pour-tous.htm" target="_blank" rel="noopener"
&gt;www.nextinpact.com/news/97852-de-cacert-a-lets-encrypt-longue-route-vers-https-pour-tous.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.imirhil.fr/2015/12/12/letsencrypt-joie-deception.html" target="_blank" rel="noopener"
&gt;blog.imirhil.fr/2015/12/12/letsencrypt-joie-deception.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>