Comment créer un certificat auto-signé, avec openssl?

j'ajoute le support https à un périphérique 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 quelques erreurs avec, par exemple, google chrome:

Ce n'est probablement pas le site que vous cherchez!

Le certificat de sécurité du site n'est pas approuvé!

est-ce que je manque quelque chose? Est-ce la bonne façon de construire un certificat auto-signé?

895
demandé sur jww 2012-04-16 18:14:42

13 réponses

vous pouvez faire cela en une seule commande:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

vous pouvez aussi ajouter -nodes si vous ne voulez pas protéger votre clé privée avec une phrase de passe, sinon elle vous demandera un mot de passe" d'au moins 4 caractères". Le paramètre days (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 sur Entrée et accepter les valeurs par défaut.

ajouter -subj '/CN=localhost' pour supprimer questions sur le contenu du certificat (remplacer localhost par le domaine désiré)

Les certificats auto-signés

ne sont validés avec aucun tiers, sauf si vous les importez sur les navigateurs au préalable. Si vous avez besoin de plus de sécurité, vous devriez utiliser un certificat signé par une AC.

1555
répondu Diego Woitasen 2018-07-03 08:52:12

est-ce que je manque quelque chose? Est-ce la bonne façon de construire un certificat auto-signé?

il est facile de créer un certificat auto-signé. Vous n'avez qu'à utiliser la commande openssl req . Il peut être difficile de créer un qui peut être consommé par le plus grand choix de clients, comme les navigateurs et les outils en ligne de commande.

son difficile parce que les navigateurs ont leur propre ensemble d'exigences, et ils sont plus restrictif que L'IETF. Les exigences utilisées par les navigateurs sont documentées dans le CA/Browser Forums (voir les références ci-dessous). Les restrictions se posent dans deux domaines clés: (1) les ancrages de confiance et (2) les noms DNS.

les navigateurs modernes (comme le warez que nous utilisons en 2014/2015) veulent un certificat qui enchaîne à un point d'ancrage de confiance, et ils veulent que les noms DNS soient présentés de manière particulière dans le certificat. Et les navigateurs se déplacent activement contre soi-même certificats de serveur signés

certains navigateurs ne facilitent pas l'importation d'un certificat de serveur auto-signé. En fait, vous ne pouvez pas avec certains navigateurs, comme le navigateur D'Android. Donc la solution est de devenir votre propre autorité.

en l'absence de devenir votre propre autorité, vous devez obtenir les noms DNS droit pour donner le Certificat la plus grande chance de succès. Mais je voudrais vous encourager à devenir votre propre autorité. Il est facile de devenez votre propre autorité et il mettra de côté toutes les questions de confiance (qui de mieux à confiance que vous-même?).


Ce n'est probablement pas le site que vous cherchez!

Le certificat de sécurité du site n'est pas approuvé!

c'est parce que les navigateurs utilisent une liste prédéfinie d'ancrages de confiance pour valider les certificats de serveur. Un certificat auto-signé ne renvoie pas en chaîne à une personne de confiance d'ancrage.

La meilleure façon d'éviter cela est:

  1. créez votre propre autorité(I. e, devenu CA)
  2. créer une demande de signature de certificat (CSR) pour le serveur
  3. signez le CSR du serveur avec votre clé CA
  4. installer le certificat du serveur sur le serveur
  5. installer le certificat CA sur le client

Étape 1 - créez votre propre autorité signifie simplement créer un certificat auto-signé avec CA: true et l'utilisation appropriée des clés. Cela signifie que le sujet et L'émetteur sont la même entité, que L'AC est définie à true dans les contraintes de base (elle doit aussi être marquée comme étant critique), que l'utilisation de la clé est keyCertSign et crlSign (si vous utilisez des LCR), et que l'Identificateur de clé sujet (Aki) est le même que l'Identificateur de clé D'Autorité (AKI).

à devenir votre propre autorité de certification, voir Comment signer une demande de signature de certificat avec votre autorité de Certification? sur un Débordement de Pile. Ensuite, importez votre CA dans le magasin en fiducie utilisé par le navigateur.

les Étapes 2 à 4 sont à peu près ce que vous faites maintenant pour un public en face de serveur lorsque vous sollicitez les services d'une autorité de certification comme Startcom ou CAcert . Les étapes 1 et 5 vous permettent d'éviter le tiers l'autorité, et agir en tant que votre propre autorité (qui de mieux à qui faire confiance que vous-même?).

La meilleure façon d'éviter le navigateur d'avertissement 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. Donc ça ne marchera jamais sur la plateforme.

La question des navigateurs (et d'autres semblables, les agents utilisateurs) pas faire confiance les certificats auto-signés va être un gros problème dans l'Internet des objets (Ido). Par exemple, ce qui se passe lorsque vous vous connectez à votre thermostat du réfrigérateur ou du programme? La réponse est, rien de bon en ce qui concerne l'expérience utilisateur est concerné.

le groupe de travail WebAppSec du W3C commence à se pencher sur la question. Voir, par exemple, Proposition: Marquage HTTP Non Sécurisé .


Comment créer un certificat auto-signé avec openssl?

les commandes ci-dessous et le fichier de configuration créent un certificat auto-signé (il vous montre aussi comment créer une demande de signature). Ils diffèrent des autres réponses à un égard: les noms DNS utilisés pour le certificat auto-signé sont dans le nom alternatif sujet (SAN) , et non le nom commun (CN) .

les noms DNS sont placés dans le SAN à travers le fichier de configuration avec la ligne subjectAltName = @alternate_names (il n'y a aucun moyen de le faire via la ligne de commande). Puis il y a une section alternate_names dans le fichier de configuration (vous devez l'ajuster à votre goût):

[ alternate_names ]

DNS.1       = example.com
DNS.2       = www.example.com
DNS.3       = mail.example.com
DNS.4       = ftp.example.com

# Add these if you need them. But usually you don't want them or
#   need them in production. You may need them for development.
# DNS.5       = localhost
# DNS.6       = localhost.localdomain
# DNS.7       = 127.0.0.1

# IPv6 localhost
# DNS.8     = ::1

il est important de mettre le nom DNS dans le SAN et non le CN car à la fois l'IETF et les Forums CA/Browser spécifient la pratique. Ils précisent également que les noms DNS dans la NC sont dépréciés (mais non interdits). si vous mettez un nom DNS dans le CN, alors il doit être inclus dans le SAN en vertu des politiques CA/B. Donc, vous ne pouvez pas éviter d'utiliser le nom du sujet alternatif.

si vous ne mettez pas de noms DNS dans le SAN, alors le certificat ne sera pas validé par un navigateur et d'autres agents utilisateurs qui suivent les directives CA/Browser Forum.

lié: les navigateurs suivent les politiques CA/Browser Forum; et non le Politiques de L'IETF. C'est l'une des raisons pour lesquelles un certificat créé avec OpenSSL (qui suit généralement L'IETF) n'est parfois pas validé par un navigateur (les navigateurs suivent le CA/B). Il s'agit de normes différentes, de politiques de délivrance et d'exigences de validation différentes.


créer un certificat auto-signé (noter l'ajout de -x509 option):

openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes \
    -keyout example-com.key.pem -days 365 -out example-com.cert.pem

créer une demande de signature (noter l'absence de l'option -x509 ):

openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
    -keyout example-com.key.pem -days 365 -out example-com.req.pem

imprimer un certificat auto-signé :

openssl x509 -in example-com.cert.pem -text -noout

imprimer une demande de signature :

openssl req -in example-com.req.pem -text -noout

fichier de Configuration (transmis via l'option -config )

[ req ]
default_bits        = 2048
default_keyfile     = server-key.pem
distinguished_name  = subject
req_extensions      = req_ext
x509_extensions     = x509_ext
string_mask         = utf8only

# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
#   Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName         = Country Name (2 letter code)
countryName_default     = US

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = NY

localityName            = Locality Name (eg, city)
localityName_default        = New York

organizationName         = Organization Name (eg, company)
organizationName_default    = Example, LLC

# Use a friendly name here because its presented to the user. The server's DNS
#   names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
#   by both IETF and CA/Browser Forums. If you place a DNS name here, then you 
#   must include the DNS name in the SAN too (otherwise, Chrome and others that
#   strictly follow the CA/Browser Baseline Requirements will fail).
commonName          = Common Name (e.g. server FQDN or YOUR name)
commonName_default      = Example Company

emailAddress            = Email Address
emailAddress_default        = test@example.com

# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]

subjectKeyIdentifier        = hash
authorityKeyIdentifier  = keyid,issuer

# You only need digitalSignature below. *If* you don't allow
#   RSA Key transport (i.e., you use ephemeral cipher suites), then
#   omit keyEncipherment because that's key transport.
basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
#   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
#   In either case, you probably only need serverAuth.
# extendedKeyUsage  = serverAuth, clientAuth

# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]

subjectKeyIdentifier        = hash

basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
#   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
#   In either case, you probably only need serverAuth.
# extendedKeyUsage  = serverAuth, clientAuth

[ alternate_names ]

DNS.1       = example.com
DNS.2       = www.example.com
DNS.3       = mail.example.com
DNS.4       = ftp.example.com

# Add these if you need them. But usually you don't want them or
#   need them in production. You may need them for development.
# DNS.5       = localhost
# DNS.6       = localhost.localdomain
# DNS.7       = 127.0.0.1

# IPv6 localhost
# DNS.8     = ::1

vous pouvez besoin de faire ce qui suit pour Chrome. Autrement Chrome peut se plaindre un nom commun est invalide ( ERR_CERT_COMMON_NAME_INVALID ) . Je ne suis pas sûr de la relation entre une adresse IP dans le SAN et un CN dans ce cas.

# IPv4 localhost
# IP.1       = 127.0.0.1

# IPv6 localhost
# IP.2     = ::1

il existe d'autres règles concernant le traitement des noms DNS dans les certificats X. 509/PKIX. Reportez-vous à ces documents pour les règles:

RFC 6797 et RFC 7469 sont énumérés parce qu'ils sont plus restrictifs que les autres documents RFC et CA/B. Les RFC 6797 et 7469 ne permettent pas non plus une adresse IP.

401
répondu jww 2017-05-23 11:47:30

Voici les options décrites dans la réponse de @diegows , décrite plus en détail, de la documentation :

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
req

PKCS#10 de la demande de certificat et certificat de la génération de l'utilitaire.

-x509

cette option affiche un certificat auto-signé au lieu d'une demande de certificat. Il est généralement utilisé pour générer un certificat d'essai ou une auto-signé autorité de certification racine.

-newkey arg

cette option crée une nouvelle demande de certificat et une clé privée. Argument prend plusieurs formes. rsa:nbits , où nbits est le nombre de bits, génère une clé RSA nbits de taille.

-keyout filename

donne le nom du fichier pour écrire la clé privée nouvellement créée.

-out filename

spécifie le nom du fichier de sortie à écrire ou la sortie standard par défaut.

-days n

lorsque l'option - x509 est utilisée cette option spécifie le nombre de jours pour certifier le certificat. La valeur par défaut est de 30 jours.

-nodes

si cette option est spécifiée, alors si une clé privée est créée, elle ne sera pas crypté.

la documentation est en fait, plus détaillé que ce qui précède, je viens de le résumer ici.

364
répondu Community 2017-05-23 11:47:30

la commande suivante répond à tous vos besoins:

openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout example.key -out example.crt -subj "/CN=example.com" -days 3650

Il crée un certificat pour le domaine example.com qui est

  • relativement forte (à partir de 2018) et
  • valable pour 3650 jours (~10 ans).

il crée les fichiers suivants:

  • clé privée: example.key
  • certificat: example.crt

comme toutes les informations sont fournies en ligne de commande, il n'y a pas d'entrée interactive gênante. En outre, toutes les étapes nécessaires sont exécutées par cette seule invocation OpenSSL: de la génération de clés privées jusqu'au certificat auto-signé.

comme le certificat est auto-signé et doit être accepté par les utilisateurs manuellement, il n'est pas logique d'utiliser une courte expiration ou une faible cryptographie.

dans le futur, vous pourrait vouloir utiliser plus de 4096 bits pour la clé RSA et un algorithme de hachage plus fort que sha256 , mais à partir de 2018 ce sont des valeurs saines. Ils sont suffisamment forts tout en étant pris en charge par tous les navigateurs modernes.

Remarque: théoriquement, vous pouvez laisser de côté le paramètre -nodes (qui signifie" pas de cryptage DES"), auquel cas example.key serait crypté avec un mot de passe. Cependant, ce n'est presque jamais utile pour un installation du serveur, parce que vous auriez à stocker le mot de passe sur le serveur aussi bien, ou vous auriez à l'entrer manuellement à chaque redémarrage.

121
répondu vog 2018-09-03 07:12:14

Je ne peux pas commenter, donc je vais mettre ceci comme une réponse séparée. J'ai trouvé quelques problèmes avec la réponse acceptée d'une seule doublure:

  • Le one-liner comprend un mot de passe de la clé.
  • le One-liner utilise SHA1 qui, dans de nombreux navigateurs, lance des avertissements dans la console.

Voici une version simplifiée qui supprime la phrase de passe, augmente la sécurité pour supprimer les avertissements et inclut une suggestion dans les commentaires pour passer en -subj pour enlever la pleine liste de question:

openssl genrsa -out server.key 2048
openssl rsa -in server.key -out server.key
openssl req -sha256 -new -key server.key -out server.csr -subj '/CN=localhost'
openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt

remplacer "localhost" par n'importe quel domaine dont vous avez besoin. Vous devrez exécuter les deux premières commandes une par une Car openssl demandera une phrase de passe.

pour combiner les deux en un .fichier pem:

cat server.crt server.key > cert.pem
110
répondu Mike N 2017-08-15 21:52:29

je recommande d'ajouter - sha256 paramètre, pour utiliser l'algorithme de hachage SHA-2, parce que les principaux navigateurs envisagent de montrer" certificats SHA-1 " comme non sécurisé.

la même ligne de commande de la réponse acceptée - @diegows avec ajouté-sha256

openssl req-x509 - sha256 - newkey rsa:2048-keyout key.PEM-out cert.PEM-days XXX

plus info dans Google blog sur la Sécurité .

Mise À Jour Mai 2018. comme beaucoup ont noté dans les commentaires que L'utilisation de SHA-2 n'ajoute aucune sécurité au certificat auto-signé. Mais je recommande toujours de l'utiliser comme une bonne habitude de ne pas utiliser les fonctions de hachage cryptographique périmées / non sécurisées. Une explication complète est disponible dans: https://security.stackexchange.com/questions/91913/why-is-it-fine-for-certificates-above-the-end-entity-certificate-to-be-sha1-base

64
répondu Maris B. 2018-05-11 13:24:49

les navigateurs modernes émettent maintenant une erreur de sécurité pour des certificats auto-signés par ailleurs bien formés s'il leur manque un SAN (sujet Alternate Name). OpenSSL ne fournit pas de méthode en ligne de commande pour spécifier ce , de sorte que de nombreux tutoriels et signets de développeurs sont soudainement dépassés.

le moyen le plus rapide pour redémarrer est un fichier de conf court et autonome:

  1. Créer un fichier de configuration OpenSSL (exemple: req.cnf )

    [req]
    distinguished_name = req_distinguished_name
    x509_extensions = v3_req
    prompt = no
    [req_distinguished_name]
    C = US
    ST = VA
    L = SomeCity
    O = MyCompany
    OU = MyDivision
    CN = www.company.com
    [v3_req]
    keyUsage = critical, digitalSignature, keyAgreement
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = www.company.com
    DNS.2 = company.com
    DNS.3 = company.net
    
  2. créer le certificat référençant ce fichier de configuration

    openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
     -keyout cert.key -out cert.pem -config req.cnf -sha256
    

exemple de configuration de https://support.citrix.com/article/CTX135602

60
répondu rymo 2017-12-12 18:11:21

c'est le 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 les permissions exécutables. Les fichiers seront écrites dans le même répertoire que le script.

Chrome 58 une revente exige Les SAN doivent être établis dans des certificats auto-signés.

#!/usr/bin/env bash

# Set the TLD domain we want to use
BASE_DOMAIN="example.com"

# Days for the cert to live
DAYS=1095

# A blank passphrase
PASSPHRASE=""

# Generated configuration file
CONFIG_FILE="config.txt"

cat > $CONFIG_FILE <<-EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
x509_extensions = v3_req
distinguished_name = dn

[dn]
C = CA
ST = BC
L = Vancouver
O = Example Corp
OU = Testing Domain
emailAddress = webmaster@$BASE_DOMAIN
CN = $BASE_DOMAIN

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.$BASE_DOMAIN
DNS.2 = $BASE_DOMAIN
EOF

# The file name can be anything
FILE_NAME="$BASE_DOMAIN"

# Remove previous keys
echo "Removing existing certs like $FILE_NAME.*"
chmod 770 $FILE_NAME.*
rm $FILE_NAME.*

echo "Generating certs for $BASE_DOMAIN"

# Generate our Private Key, CSR and Certificate
# Use SHA-2 as SHA-1 is unsupported from Jan 1, 2017

openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout "$FILE_NAME.key" -days $DAYS -out "$FILE_NAME.crt" -passin pass:$PASSPHRASE -config "$CONFIG_FILE"

# OPTIONAL - write an info to see the details of the generated crt
openssl x509 -noout -fingerprint -text < "$FILE_NAME.crt" > "$FILE_NAME.info"

# Protect the key
chmod 400 "$FILE_NAME.key"

ce script écrit aussi un fichier info pour que vous puissiez inspecter le nouveau certificat et vérifier que le SAN est correctement défini.

                ...
                28:dd:b8:1e:34:b5:b1:44:1a:60:6d:e3:3c:5a:c4:
                da:3d
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Subject Alternative Name: 
            DNS:*.example.com, DNS:example.com
Signature Algorithm: sha256WithRSAEncryption
     3b:35:5a:d6:9e:92:4f:fc:f4:f4:87:78:cd:c7:8d:cd:8c:cc:
     ...

si vous utilisez Apache, alors vous pouvez référencer le cert ci-dessus dans votre fichier de configuration comme suit:

<VirtualHost _default_:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/htdocs

    SSLEngine on
    SSLCertificateFile path/to/your/example.com.crt
    SSLCertificateKeyFile path/to/your/example.com.key
</VirtualHost>

n'oubliez pas de redémarrer votre serveur Apache (ou Nginx, ou IIS) pour que le nouveau cert prenne effet.

12
répondu Drakes 2017-05-13 23:15:19

2017 un liner:

openssl req \
-newkey rsa:2048 \
-x509 \
-nodes \
-keyout server.pem \
-new \
-out server.pem \
-subj /CN=localhost \
-reqexts SAN \
-extensions SAN \
-config <(cat /System/Library/OpenSSL/openssl.cnf \
    <(printf '[SAN]\nsubjectAltName=DNS:localhost')) \
-sha256 \
-days 3650

cela fonctionne aussi dans Chrome 57, car il fournit le SAN, sans avoir un autre fichier de configuration. Extrait d'une réponse ici . Cela crée un seul .pem fichier qui contient la clé privée et cert. Vous pouvez les déplacer pour les séparer .fichiers pem si nécessaire.

9
répondu joemillervi 2017-09-20 16:27:21

, Vous avez la procédure générale correcte. La syntaxe de la commande est ci-dessous.

openssl req -new -key {private key file} -out {output file}

cependant, les avertissements sont affichés parce que le navigateur n'a pas été en mesure de vérifier l'identité en validant le certificat avec une autorité de Certification (AC) connue.

comme il s'agit d'un certificat auto-signé, il n'y a pas D'AC et vous pouvez ignorer l'avertissement en toute sécurité et poursuivre. Si vous souhaitez obtenir une véritable cert qui sera reconnaissable par quiconque sur le internet public alors la procédure est ci-dessous.

  1. générer une clé privée
  2. utiliser cette clé privée pour créer un fichier CSR
  3. Soumettre à la RSE pour CA (Verisign ou autres etc)
  4. Installer reçu cert de CA sur le serveur web
  5. ajouter d'autres certs à la chaîne d'authentification en fonction du type cert

j'ai plus de détails à ce sujet dans un post à https://bigthinkingapplied.com/secure-the-connection-installing-certificates-on-3-common-web-servers /

5
répondu nneko 2015-06-15 15:02:08

One liner FTW. J'aime garder les choses simples. Pourquoi ne pas utiliser une commande qui contient TOUS les arguments nécessaires? C'est comme ça que je l'aime - cela crée un certificat x509 et c'est la clé PEM:

openssl req -x509 \
 -nodes -days 365 -newkey rsa:4096 \
 -keyout self.key.pem \
 -out self-x509.crt \
 -subj "/C=US/ST=WA/L=Seattle/CN=example.com/emailAddress=someEmail@gmail.com" 

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 aller prendre un café.

> > plus ici < <

4
répondu OkezieE 2017-09-21 06:25:08

générer des clés

j'utilise /etc/mysql pour le stockage cert car /etc/apparmor.d/usr.sbin.mysqld contient /etc/mysql/*.pem r .

sudo su -
cd /etc/mysql
openssl genrsa -out ca-key.pem 2048;
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem;
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem;
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem;

ajouter configuration

/etc/mysql/my.cnf

[client]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/client-cert.pem
ssl-key=/etc/mysql/client-key.pem

[mysqld]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

sur mon setup, serveur ubuntu connecté à: /var/log/mysql/error.log

notes de suivi:

  • SSL error: Unable to get certificate from '...'

    Mysql pourrait se voir refuser l'accès en lecture à votre fichier cert s'il n'est pas dans la configuration de apparmors . Comme mentionné dans les étapes précédentes^, Enregistrez tous nos certs sous la forme de fichiers .pem dans le répertoire /etc/mysql/ qui est approuvé par défaut par apparmor (ou modifiez votre apparmor/SELinux pour permettre l'accès à l'endroit où vous les avez stockés.)

  • SSL error: Unable to get private key

    votre version de serveur mysql ne supporte pas le format par défaut rsa:2048 .

    Secret généré rsa:2048 de plaine rsa :

    openssl rsa -in server-key.pem -out server-key.pem
    openssl rsa -in client-key.pem -out client-key.pem
    
  • vérifiez si le serveur local supporte ssl :

    mysql -u root -p
    mysql> show variables like "%ssl%"; 
    +---------------+----------------------------+
    | Variable_name | Value                      |
    +---------------+----------------------------+
    | have_openssl  | YES                        |
    | have_ssl      | YES                        |
    | ssl_ca        | /etc/mysql/ca-cert.pem     |
    | ssl_capath    |                            |
    | ssl_cert      | /etc/mysql/server-cert.pem |
    | ssl_cipher    |                            |
    | ssl_key       | /etc/mysql/server-key.pem  |
    +---------------+----------------------------+
    
  • vérifier une connexion à la db est crypté ssl :

    vérifier la connexion

    une fois connecté à L'instance MySQL, vous pouvez lancer la requête:

    show status like 'Ssl_cipher'; 
    

    si votre connexion n'est pas cryptée, le résultat sera blanc:

    mysql> show status like 'Ssl_cipher'; 
    +---------------+-------+ 
    | Variable_name | Value | 
    +---------------+-------+ 
    | Ssl_cipher    |       |  
    +---------------+-------+ 
    1 row in set (0.00 sec) 
    

    sinon, il afficherait une chaîne de longueur non nulle pour le code utilisé:

    mysql> show status like 'Ssl_cipher'; 
    +---------------+--------------------+ 
    | Variable_name | Value              | 
    +---------------+--------------------+ 
    | Ssl_cipher    | DHE-RSA-AES256-SHA |  
    +---------------+--------------------+ 
    1 row in set (0.00 sec) 
    
  • Exiger le protocole ssl pour l'utilisateur de connexion ('exiger ssl'):

    • SSL

    dit au serveur de n'autoriser que les connexions cryptées par SSL pour le compte.

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE SSL;
    

    pour se connecter, le client doit spécifier l'option --ssl-ca pour authentifier le certificat du serveur, et peut également spécifier les options --ssl-key et --ssl-cert. Si ni -l'option-ssl-ca ou --ssl-capath n'est pas spécifiée, le client n'authentifie pas le certificat du serveur.


lien alternatif: long tutoriel ici http://www.madirish.net/214

2
répondu ThorSummoner 2017-04-13 12:22:47

oneliner v2017:

centos:

openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
-keyout localhost.key -out localhost.crt \
-days 3650 \
-subj "CN=localhost" \
-reqexts SAN -extensions SAN \
-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))

ubuntu:

openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
-keyout localhost.key -out localhost.crt \
-days 3650 \
-subj "CN=localhost" \
-reqexts SAN -extensions SAN \
-config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))
2
répondu user327843 2017-11-28 10:11:39