J'ajoute la prise en charge HTTPS à un appareil Linux intégré. J'ai essayé de générer un certificat auto-signé avec ces étapes:
openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem
Cela fonctionne, mais je reçois des erreurs avec, par exemple, Google Chrome:
Ce n'est probablement pas le site que vous recherchez!
Le certificat de sécurité du site n'est pas fiable!
Suis-je en train de manquer quelque chose? Est-ce la bonne façon de créer un certificat auto-signé?
ssl
openssl
certificate
ssl-certificate
x509certificate
michelemarcon
la source
la source
alternate_names
section et le transmettre avec l'-config
option. En outre, placer un nom DNS dans le nom commun (CN) est déconseillé (mais pas interdit) à la fois par l'IETF et les forums CA / Browser. Tout nom DNS dans le CN doit également être présent dans le SAN. Il n'y a aucun moyen d'éviter d'utiliser le SAN. Voir la réponse ci-dessous.Réponses:
Vous pouvez le faire en une seule commande:
Vous pouvez également ajouter
-nodes
(abréviation deno DES
) si vous ne souhaitez pas protéger votre clé privée avec une phrase secrète. Sinon, il vous demandera un mot de passe "au moins 4 caractères".Le
days
paramètre (365) que vous pouvez remplacer par n'importe quel nombre pour affecter la date d'expiration. Il vous demandera alors des choses comme "Nom du pays", mais vous pouvez simplement appuyer Enteret accepter les valeurs par défaut.Ajoutez
-subj '/CN=localhost'
pour supprimer les questions sur le contenu du certificat (remplacez-lelocalhost
par le domaine souhaité).Les certificats auto-signés ne sont validés auprès d'aucun tiers, sauf si vous les avez importés dans les navigateurs précédemment. Si vous avez besoin de plus de sécurité, vous devez utiliser un certificat signé par une autorité de certification (CA).
la source
-subj "/C=US/ST=Oregon/L=Portland/O=Company Name/OU=Org/CN=www.example.com"
-sha256
pour générer un certificat basé sur SHA-256.Il est facile de créer un certificat auto-signé. Vous utilisez simplement la
openssl req
commande. Il peut être difficile d'en créer un qui peut être consommé par la plus grande sélection de clients, comme les navigateurs et les outils de ligne de commande.C'est difficile car les navigateurs ont leur propre ensemble d'exigences, et ils sont plus restrictifs que l' IETF . Les exigences utilisées par les navigateurs sont documentées sur les forums CA / Browser (voir les références ci-dessous). Les restrictions se posent dans deux domaines clés: (1) les ancres de confiance et (2) les noms DNS.
Les navigateurs modernes (comme le warez que nous utilisons en 2014/2015) veulent un certificat qui renvoie à une ancre de confiance, et ils veulent que les noms DNS soient présentés de manière particulière dans le certificat. Et les navigateurs évoluent activement contre les certificats de serveur auto-signés.
Certains navigateurs ne facilitent pas exactement l'importation d'un certificat de serveur auto-signé. En fait, vous ne pouvez pas avec certains navigateurs, comme le navigateur d'Android. La solution complète est donc de devenir votre propre autorité.
En l'absence de devenir votre propre autorité, vous devez obtenir les bons noms DNS pour donner au certificat les meilleures chances de succès. Mais je vous encourage à devenir votre propre autorité. Il est facile de devenir votre propre autorité, et cela évitera tous les problèmes de confiance (à qui mieux faire confiance que vous?).
En effet, les navigateurs utilisent une liste prédéfinie d'ancres de confiance pour valider les certificats de serveur. Un certificat auto-signé ne renvoie pas à une ancre approuvée.
La meilleure façon d'éviter cela est:
Étape 1 - Créer votre propre autorité signifie simplement créer un certificat auto-signé avec
CA: true
une utilisation appropriée des clés. Cela signifie que le sujet et l' émetteur sont la même entité, CA est défini sur true dans les contraintes de base (il doit également être marqué comme critique), l'utilisation de la clé estkeyCertSign
etcrlSign
(si vous utilisez des listes de révocation de certificats) et l' identificateur de la clé du sujet (SKI) est Identique à l' identifiant de clé d'autorité (AKI).Pour devenir votre propre autorité de certification, voir * Comment signez-vous une demande de signature de certificat avec votre autorité de certification? sur Stack Overflow. Ensuite, importez votre autorité de certification dans le Trust Store utilisé par le navigateur.
Les étapes 2 à 4 correspondent à peu près à ce que vous faites maintenant pour un serveur public lorsque vous vous inscrivez aux services d'une autorité de certification comme Startcom ou CAcert . Les étapes 1 et 5 vous permettent d'éviter l'autorité tierce et d'agir comme votre propre autorité (à qui faire confiance mieux que vous?).
La deuxième meilleure façon d'éviter l'avertissement du navigateur est de faire confiance au certificat du serveur. Mais certains navigateurs, comme le navigateur par défaut d'Android, ne vous permettent pas de le faire. Cela ne fonctionnera donc jamais sur la plate-forme.
Le problème des navigateurs (et autres agents utilisateurs similaires) qui ne font pas confiance aux certificats auto-signés va être un gros problème dans l'Internet des objets (IoT). Par exemple, que va-t-il se passer lorsque vous vous connectez à votre thermostat ou réfrigérateur pour le programmer? La réponse est, rien de bon en ce qui concerne l'expérience utilisateur.
Le groupe de travail WebAppSec du W3C commence à examiner la question. Voir, par exemple, Proposition: Marquer HTTP comme non sécurisé .
Les commandes ci-dessous et le fichier de configuration créent un certificat auto-signé (il vous montre également comment créer une demande de signature). Ils diffèrent des autres réponses sur un point: les noms DNS utilisés pour le certificat auto-signé se trouvent dans le nom alternatif du sujet (SAN) et non dans le nom commun (CN) .
Les noms DNS sont placés dans le SAN via le fichier de configuration avec la ligne
subjectAltName = @alternate_names
(il n'y a aucun moyen de le faire via la ligne de commande). Ensuite, il y a unealternate_names
section dans le fichier de configuration (vous devez régler cela à votre goût):Il est important de mettre le nom DNS dans le SAN et non le CN, car à la fois l'IETF et le CA / Forums du navigateur précisent la pratique. Ils précisent également que les noms DNS dans le CN sont obsolètes (mais pas interdits). Si vous mettez un nom DNS dans le CN, il doit être inclus dans le SAN sous les stratégies CA / B. Vous ne pouvez donc pas éviter d'utiliser l'autre nom du sujet.
Si vous ne placez pas de noms DNS dans le SAN, le certificat ne pourra pas être validé sous un navigateur et d'autres agents utilisateurs qui suivent les directives de CA / Browser Forum.
Connexes: les navigateurs suivent les politiques de CA / Browser Forum; et non les politiques de l'IETF. C'est l'une des raisons pour lesquelles un certificat créé avec OpenSSL (qui suit généralement l'IETF) ne valide parfois pas sous un navigateur (les navigateurs suivent le CA / B). Ce sont des normes différentes, elles ont des politiques d'émission différentes et des exigences de validation différentes.
Créez un certificat auto-signé (notez l'ajout d'une
-x509
option):Créez une demande de signature (notez le manque d'
-x509
option):Imprimez un certificat auto-signé :
Imprimer une demande de signature :
Fichier de configuration (transmis via
-config
option)Vous devrez peut-être effectuer les opérations suivantes pour Chrome. Sinon, Chrome peut se plaindre qu'un nom commun n'est pas valide (
ERR_CERT_COMMON_NAME_INVALID
) . Je ne sais pas quelle est la relation entre une adresse IP dans le SAN et un CN dans ce cas.Il existe d'autres règles concernant la gestion des noms DNS dans les certificats X.509 / PKIX. Reportez-vous à ces documents pour les règles:
Les RFC 6797 et RFC 7469 sont répertoriées, car elles sont plus restrictives que les autres RFC et documents CA / B. Les RFC 6797 et 7469 ne permettent pas non plus une adresse IP.
la source
alternate_names
section? Particulièrement des sous-sous-domaines. J'ai une question référençant cette réponse ici: serverfault.com/questions/711596/…Voici les options décrites dans la réponse de @ diegows , décrites plus en détail dans la documentation :
La documentation est en fait plus détaillée que ci-dessus; Je viens de le résumer ici.
la source
XXX
dans la commande d'origine doit être remplacé par le «nombre de jours pour certifier le certificat pour». La valeur par défaut est de 30 jours. Par exemple,-days XXX
devient-days 365
si vous souhaitez que votre certificat soit valide pendant 365 jours. Consultez la documentation pour en savoir plus .À partir de 2020, la commande suivante répond à tous vos besoins, y compris SAN:
Dans OpenSSL ≥ 1.1.1, cela peut être raccourci à:
Il crée un certificat qui est
example.com
etexample.net
(SAN),10.0.0.1
(SAN),3650
jours (~ 10 ans).Il crée les fichiers suivants:
example.key
example.crt
Toutes les informations sont fournies sur la ligne de commande. Il n'y a aucune entrée interactive qui vous agace. Il n'y a pas de fichiers de configuration avec lesquels vous devez jouer. Toutes les étapes nécessaires sont exécutées par une seule invocation OpenSSL : de la génération de la clé privée jusqu'au certificat auto-signé.
Remarque # 1: Paramètres Crypto
Étant donné que le certificat est auto-signé et doit être accepté manuellement par les utilisateurs, il n'est pas logique d'utiliser une expiration courte ou une cryptographie faible.
À l'avenir, vous voudrez peut-être utiliser plus de
4096
bits pour la clé RSA et un algorithme de hachage plus fort quesha256
, mais à partir de 2020, ce sont des valeurs sensées. Ils sont suffisamment solides tout en étant pris en charge par tous les navigateurs modernes.Remarque n ° 2: paramètre "
-nodes
"Théoriquement, vous pourriez omettre le
-nodes
paramètre (ce qui signifie "pas de cryptage DES"), auquel cas ilexample.key
serait crypté avec un mot de passe. Cependant, cela n'est presque jamais utile pour une installation de serveur, car vous devrez soit stocker également le mot de passe sur le serveur, soit le saisir manuellement à chaque redémarrage.Remarque n ° 3: Voir aussi
la source
//CN=localhost
au lieu de/CN=localhost
? Est-ce qu'une bonne évasion aidera ici? Par exemple, le remplacement/CN=localhost
par"/CN=localhost"
résout-il le problème de manière propre?Je ne peux pas commenter, donc je vais mettre cela comme une réponse distincte. J'ai trouvé quelques problèmes avec la réponse monoligne acceptée:
Voici une version simplifiée qui supprime la phrase secrète, augmente la sécurité pour supprimer les avertissements et inclut une suggestion dans les commentaires à passer dans -subj pour supprimer la liste complète des questions:
Remplacez «localhost» par le domaine dont vous avez besoin. Vous devrez exécuter les deux premières commandes une par une car OpenSSL vous demandera une phrase secrète.
Pour combiner les deux dans un fichier .pem:
la source
cat server.crt server.key >foo-cert.pem
. Fonctionne avec l'exemple dansopenssl-1.0.2d/demos/ssl/
FreeBSD 10
OpenLDAP 2.4
avecTLS
Les navigateurs modernes lancent maintenant une erreur de sécurité pour les certificats auto-signés autrement bien formés s'il leur manque un SAN (Subject Alternate Name). OpenSSL ne fournit pas de moyen en ligne de commande pour spécifier cela , donc de nombreux tutoriels et signets de développeurs sont soudainement dépassés.
Le moyen le plus rapide de redémarrer est un fichier de configuration court et autonome:
Créer un fichier de configuration de OpenSSL (exemple:
req.cnf
)Créez le certificat référençant ce fichier de configuration
Exemple de configuration de https://support.citrix.com/article/CTX135602
la source
-sha256
.-extension 'subjectAltName = DNS:dom.ain, DNS:oth.er'
voir github.com/openssl/openssl/pull/4986-addext
maintenant.Je recommanderais d'ajouter le paramètre -sha256 , pour utiliser l'algorithme de hachage SHA-2, car les principaux navigateurs envisagent d'afficher les "certificats SHA-1" comme non sécurisés.
La même ligne de commande de la réponse acceptée - @diegows avec -sha256 ajouté
Plus d'informations sur le blog de Google Security .
Mise à jour de mai 2018. Comme beaucoup l'ont noté dans les commentaires, l'utilisation de SHA-2 n'ajoute aucune sécurité à un certificat auto-signé. Mais je recommande toujours de l'utiliser comme une bonne habitude de ne pas utiliser de fonctions de hachage cryptographiques obsolètes / non sécurisées. Une explication complète est disponible dans Pourquoi les certificats supérieurs au certificat d'entité finale sont-ils basés sur SHA-1? .
la source
Il s'agit du script que j'utilise sur les boîtes locales pour définir le SAN (subjectAltName) dans les certificats auto-signés.
Ce script prend le nom de domaine (example.com) et génère le SAN pour * .example.com et example.com dans le même certificat. Les sections ci-dessous sont commentées. Nommez le script (par exemple
generate-ssl.sh
) et donnez-lui des autorisations exécutables. Les fichiers seront écrits dans le même répertoire que le script.Chrome 58 et versions ultérieures nécessitent que le SAN soit défini dans des certificats auto-signés.
Ce script écrit également un fichier d'informations afin que vous puissiez inspecter le nouveau certificat et vérifier que le SAN est correctement configuré.
Si vous utilisez Apache, vous pouvez référencer le certificat ci-dessus dans votre fichier de configuration comme suit:
N'oubliez pas de redémarrer votre serveur Apache (ou Nginx ou IIS) pour que le nouveau certificat prenne effet.
la source
localhost
ou127.0.0.1:port#
quel serait le correspondantCN
pour quelque chose comme ça.One-liner 2017:
Cela fonctionne également dans Chrome 57, car il fournit le SAN, sans avoir d'autre fichier de configuration. Il est tiré d'une réponse ici .
Cela crée un seul fichier .pem qui contient à la fois la clé privée et le certificat. Vous pouvez les déplacer vers des fichiers .pem séparés si nécessaire.
la source
/etc/ssl/openssl.conf
travaux Ubuntu en coursJe ne peux pas commenter donc j'ajoute une réponse séparée. J'ai essayé de créer un certificat auto-signé pour NGINX et c'était facile, mais quand j'ai voulu l'ajouter à la liste blanche de Chrome, j'ai eu un problème. Et ma solution était de créer un certificat racine et de signer un certificat enfant par celui-ci.
Donc, étape par étape. Créer un fichier config_ssl_ca.cnf Remarque, le fichier de configuration a une option basicConstraints = CA: true ce qui signifie que ce certificat est censé être root.
Fichier de configuration suivant pour votre certificat enfant.
La première étape - créer une clé racine et un certificat
La deuxième étape crée la clé enfant et le fichier CSR - Demande de signature de certificat. Parce que l'idée est de signer le certificat enfant par root et d'obtenir un certificat correct
Ouvrez le terminal Linux et faites cette commande echo 0
The ca.srl fichier texte contenant le prochain numéro de série à utiliser en hexadécimal. Obligatoire. Ce fichier doit être présent et contenir un numéro de série valide.
Dernière étape, créez un autre fichier de configuration et appelez-le config_ca.cnf
Vous pouvez vous demander pourquoi c'est si difficile, pourquoi nous devons créer une configuration supplémentaire pour signer le certificat enfant par root. La réponse est simple car le certificat enfant doit avoir un bloc SAN - Subject Alternative Names. Si nous signons le certificat enfant par les utilitaires "openssl x509", le certificat racine supprimera le champ SAN du certificat enfant. Nous utilisons donc "openssl ca" au lieu de "openssl x509" pour éviter la suppression du champ SAN. Nous créons un nouveau fichier de configuration et lui demandons de copier tous les champs étendus copy_extensions = copy .
Le programme vous pose 2 questions: 1. Signer le certificat? Dites «O» 2. 1 demande de certificat sur 1 est certifiée, vous vous engagez? Dites "Y"
Dans le terminal, vous pouvez voir une phrase avec le mot "Database", cela signifie le fichier index.txt que vous créez par la commande "touch". Il contiendra toutes les informations de tous les certificats que vous créez par l'utilitaire "openssl ca". Pour vérifier la validité du certificat, utilisez:
Si vous voulez voir ce qu'il y a dans CRT:
Si vous voulez voir ce que contient la RSE:
la source
Vous avez la procédure générale correcte. La syntaxe de la commande est ci-dessous.
Cependant, les avertissements sont affichés, car le navigateur n'a pas pu vérifier l'identité en validant le certificat auprès d'une autorité de certification (CA) connue.
Comme il s'agit d'un certificat auto-signé, il n'y a pas de CA et vous pouvez ignorer l'avertissement en toute sécurité et continuer. Si vous souhaitez obtenir un vrai certificat qui sera reconnaissable par n'importe qui sur Internet public, la procédure est ci-dessous.
J'ai plus de détails à ce sujet dans un article sur Sécuriser la connexion: création d'un certificat de sécurité avec OpenSSL
la source
Un liner FTW. J'aime rester simple. Pourquoi ne pas utiliser une commande qui contient TOUS les arguments nécessaires? Voici comment je l'aime - cela crée un certificat x509 et sa clé PEM:
Cette commande unique contient toutes les réponses que vous fourniriez normalement pour les détails du certificat. De cette façon, vous pouvez définir les paramètres et exécuter la commande, obtenir votre sortie - puis opter pour le café.
>> Plus ici <<
la source
Version one-liner 2017:
CentOS:
Ubuntu:
Edit: ajout d'une barre oblique pré-ajoutée à l'option 'subj' pour Ubuntu.
la source
Lors de ma configuration, le serveur Ubuntu s'est connecté à:
/var/log/mysql/error.log
Notes de suivi:
SSL error: Unable to get certificate from '...'
MySQL peut se voir refuser l'accès en lecture à votre fichier de certificat s'il n'est pas dans la configuration des apparmors . Comme mentionné dans les étapes précédentes ^, enregistrez tous nos certificats sous forme de
.pem
fichiers dans le/etc/mysql/
répertoire approuvé par défaut par apparmor (ou modifiez votre apparmor / SELinux pour autoriser l'accès à l'endroit où vous les avez stockés.)SSL error: Unable to get private key
La version de votre serveur MySQL peut ne pas prendre en charge le
rsa:2048
format par défautConverti généré
rsa:2048
en clairrsa
avec:Vérifiez si le serveur local prend en charge SSL :
La vérification d'une connexion à la base de données est cryptée SSL :
Exiger SSL pour la connexion d'un utilisateur spécifique («exiger SSL»):
Lien alternatif: long tutoriel sur les connexions PHP sécurisées à MySQL avec SSL .
la source
Comme cela a été discuté en détail, les certificats auto-signés ne sont pas approuvés pour Internet . Vous pouvez ajouter votre certificat auto-signé à de nombreux navigateurs, mais pas à tous . Vous pouvez également devenir votre propre autorité de certification .
La principale raison pour laquelle on ne veut pas obtenir un certificat signé d'une autorité de certification est le coût - Symantec facture entre 995 $ - 1999 $ par an pour les certificats - juste pour un certificat destiné au réseau interne, Symantec facture 399 $ par an . Ce coût est facile à justifier si vous traitez des paiements par carte de crédit ou travaillez pour le centre de profit d'une entreprise très rentable. C'est plus que ce que beaucoup peuvent se permettre pour un projet personnel que l'on crée sur Internet, ou pour un organisme sans but lucratif avec un budget minimal, ou si l'on travaille dans un centre de coûts d'une organisation - les centres de coûts essaient toujours d'en faire plus. avec moins.
Une alternative est d'utiliser certbot (voir à propos de certbot ). Certbot est un client automatique facile à utiliser qui récupère et déploie les certificats SSL / TLS pour votre serveur Web.
Si vous configurez certbot, vous pouvez l'activer pour créer et maintenir un certificat pour vous émis par l' autorité de certification Let's Encrypt .
Je l'ai fait le week-end pour mon organisation. J'ai installé les packages requis pour certbot sur mon serveur (Ubuntu 16.04), puis j'ai exécuté la commande nécessaire pour configurer et activer certbot. On a probablement besoin d'un plugin DNS pour certbot - nous utilisons actuellement DigitalOcean, mais nous pourrons bientôt migrer vers un autre service.
Notez que certaines des instructions n'étaient pas tout à fait correctes et ont pris un peu de temps et de temps avec Google pour comprendre. Cela m'a pris pas mal de temps la première fois mais maintenant je pense que je pourrais le faire en quelques minutes.
Pour DigitalOcean, un des problèmes que j'ai rencontrés a été lorsque j'ai été invité à entrer le chemin d'accès à votre fichier INI d'informations d'identification DigitalOcean. Le script fait référence à la page Applications et API et à l'onglet Jetons / Clés de cette page. Vous devez avoir ou générer un jeton d'accès personnel (lecture et écriture) pour l'API de DigitalOcean - il s'agit d'une chaîne hexadécimale de 65 caractères. Cette chaîne doit ensuite être placée dans un fichier sur le serveur Web à partir duquel vous exécutez certbot. Ce fichier peut avoir un commentaire comme première ligne (les commentaires commencent par #). La seconde ligne est:
Une fois que j'ai compris comment configurer un jeton de lecture + écriture pour l'API de DigitalOcean, il était assez facile d'utiliser certbot pour configurer un certificat générique . Notez que l'on n'a pas à configurer un certificat générique, on peut à la place spécifier chaque domaine et sous-domaine que l'on veut appliquer au certificat. C'était le certificat générique qui exigeait le fichier INI d'informations d'identification qui contenait le jeton d'accès personnel de DigitalOcean.
Notez que les certificats de clé publique (également appelés certificats d'identité ou certificats SSL) expirent et doivent être renouvelés. Ainsi, vous devrez renouveler votre certificat sur une base périodique (récurrente). La documentation certbot couvre le renouvellement des certificats .
Mon plan est d'écrire un script pour utiliser la commande openssl pour obtenir la date d'expiration de mon certificat et déclencher le renouvellement lorsqu'il est de 30 jours ou moins jusqu'à son expiration. Je vais ensuite ajouter ce script à cron et l'exécuter une fois par jour.
Voici la commande pour lire la date d'expiration de votre certificat:
la source