Pourquoi openssl pkcs12 export ajoute-t-il un certificat d’ancrage d’origine supplémentaire et un certificat de serveur de duplication sous Mac OS X

1

[ Publié à l' origine sur Slack Overflow , mais le fil de commentaires s'est plaint d'un lieu inapproprié.]

Nous travaillons au passage des certificats SSL StartCom à Let's Encrypt et essayons de le configurer pour qu'il fonctionne automatiquement avec macOS Server + Apache HTTPD. À partir de l'outil de ligne de commande ( security import), macOS Server n'accepte pas les .pemfichiers simples . Vous devez lui attribuer un .p12fichier à partir duquel il extrait les .pemfichiers à configurer dans Apache. Ennuyeux et inutile, mais c'est ce que nous devons vivre pour le moment.

Pour créer ce .p12fichier, nous devons exécuter cette commande:

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/cert.pem \
-certfile /etc/letsencrypt/live/example.com/chain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

Et voici où ça devient bizarre. Le example.com.p12fichier de sortie a le example.comcertificat deux fois , suivi du certificat d'autorité intermédiaire Let's Encrypt, suivi du certificat d'ancre d'authentification inutile et auto-signé de la racine DST (que tous les navigateurs y ont installés par défaut), et enfin suivi de la clé privée. . Il en résulte que le protocole SSL Apache inclut le certificat de serveur deux fois, le certificat de l'autorité de certification intermédiaire et le certificat racine (qu'il ne devrait pas envoyer), ce qui entraîne des avertissements sur le testeur Qualys SSL Labs.

Nous avons regardé à l'intérieur cert.pem, et il ne contient que le certificat de serveur (et une seule fois). chain.pemcontient uniquement le certificat de l'autorité de certification intermédiaire (pas l'ancre racine ni le cert du serveur). privkey.pemcontient uniquement la clé privée. Il en openssl pkcs12 -exportva de même pour la duplication du certificat de serveur, puis pour l'étape supplémentaire consistant à rechercher le certificat d'ancrage racine et à l'ajouter.

Si nous exécutons cette même commande sur openSUSE Linux, le .p12fichier de sortie ne contient que le certificat du serveur (une fois), le certificat de l'autorité de certification intermédiaire et la clé privée. Aucune ancre de racine.

Nous avons essayé les variations suivantes et n'avons constaté aucune différence de production:

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-certfile /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

Le seul moyen de dupliquer le comportement incorrect du certificat de serveur doublé sur une machine Linux consiste à effectuer les opérations suivantes (sans toutefois inclure l'ancre racine):

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/cert.pem \
-certfile /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

(Notez que l'utilisation de fullchain.pemplutôt que chain.pemconjointement avec l'utilisation de cert.pem... indique parfaitement pourquoi le certificat de serveur serait dupliqué, mais ce n'est pas la commande que nous utilisons sur Mac OS X.)

Une idée de comment faire openssl pkcs12 -exportpour faire la bonne chose ici?

Nick Williams
la source
Avez-vous essayé d'installer et d'exécuter une version moderne d'OpenSSL (peut-être via MacPorts ou Homebrew)? Apple a sa propre bibliothèque de sécurité et n'a montré aucun amour à leur OpenSSL depuis longtemps.
Spiff
Nous n'avions pas encore essayé. Je me méfiais de la mise à niveau d'OpenSSL dans une configuration qui fonctionnait autrement et qui passait les contrôles de sécurité. Cependant, OpenSSL 0.9.8zh 14 Jan 2016n'est-ce pas si vieux ...
Nick Williams
«Dans High Sierra, Apple a basculé les bibliothèques SSL d'OpenSSL 0.9.8zh vers LibreSSL 2.2.7. LibreSSL est un fork d'OpenSSL supporté par OpenBSD. Secure Transport est la propre API d'Apple pour SSL / TLS, mais elle est principalement utilisée pour les logiciels propriétaires. LibreSSL servira de bibliothèque SSL pour les logiciels tiers. Cela n'a pas été inclus dans les sessions de la WWDC , mais a été observée par les utilisateurs de haut bêta Sierra « (. Thesslstore.com/blog/crypto-ssl-improvements-high-sierra-ios-11 )
Nick Williams
openssl versionrendements OpenSSL 0.9.8zh 14 Jan 2016sur mon ordinateur local exécutant Sierra, mais en réalité LibreSSL 2.2.7sur le serveur sur lequel ce script de certificat est exécuté (High Sierra). Alors peut-être que c'est un bogue dans LibreSSL? Je devrais mettre à jour le titre et les balises, mais je vais d'abord le tester ce soir pour voir si le comportement est différent.
Nick Williams