Comment créer un certificat auto-signé pour localhost?

23

Je l'ai fait avec un mot de passe et avec les champs suivants en tant que root

openssl req -x509 -days 365 -newkey rsa:2048 -keyout /etc/ssl/apache.key \
    -out /etc/ssl/apache.crt

Des champs

Country: FI
State: Pirkanmaa
Locality: Tampere
Organization: masi
Organizational Unit Name: SSL Certificate Test
CommonName: 192.168.1.107/owncloud
EmailAddress: [email protected]

Sortie: erreur d'établissement de liaison SSL dans HTTPS. Sortie attendue: connexion HTTPS. HTTP fonctionne.

Le CommonName devrait inclure l'URL où vous voulez aller, le fil de owncloud ici . J'ai essayé en vain en commun

  • 192.168.1.107/owncloud
  • 192.168.1.107/

OS de test pour le serveur: Debian 8.5.
Serveur: Raspberry Pi 3b. Serveur propriétaire: 8.2.5. Owncloud-client: 2.1.1. Client système: Debian 8.5.

Léo Léopold Hertz 준영
la source
Si vous cherchez à générer un nouveau certificat SSL en utilisant SAN pour localhost, les étapes de ce message ont fonctionné pour moi Centos 7 / Vagrant / Chrome Browser.
Damodar Bashyal
@DamodarBashyal S'il vous plaît, ne fournissez pas seulement une réponse de lien mais une description aussi comme réponse.
Léo Léopold Hertz 준영

Réponses:

11

openssl req -x509 -days 365 -newkey rsa: 2048 -keyout /etc/ssl/apache.key -out /etc/ssl/apache.crt

Vous ne pouvez pas utiliser cette commande pour générer un certificat X.509 bien formé. Il sera mal formé car le nom d'hôte est placé dans le nom commun (CN) . Le placement d'un nom d'hôte ou d'une adresse IP dans le CN est déconseillé à la fois par l'IETF (la plupart des outils, comme wgetet curl) et les forums CA / B (CA et navigateurs).

Selon les forums IETF et CA / B, les noms de serveur et les adresses IP vont toujours dans le nom alternatif du sujet (SAN) . Pour les règles, voir RFC 5280, certificat d'infrastructure à clé publique Internet X.509 et profil de liste de révocation de certificats (CRL) et exigences de base du forum CA / Browser .

Vous devez principalement utiliser un fichier de configuration OpenSSL et l'adapter à vos besoins. Voici un exemple de celui que j'utilise. Il est appelé example-com.confet transmis à la commande OpenSSL via -config example-com.conf.


Aussi bien noter : toutes les machines prétendent être localhost, localhost.localdomainetc. Faites attention à la délivrance de certificats pour localhost. Je ne dis pas ne le faites pas; comprenez simplement qu'il y a des risques.

Les alternatives localhostsont: (1) exécuter DNS et émettre des certificats au nom DNS de la machine. Ou, (2) utilisez une adresse IP statique et incluez l'adresse IP statique.


Les navigateurs vous donneront toujours des avertissements concernant un certificat auto-signé qui ne sera pas enchaîné à une racine approuvée. Des outils comme curlet wgetne se plaindront pas, mais vous devez toujours vous fier à vous-même signé avec une option comme cURL --cafile. Pour surmonter le problème de confiance du navigateur, vous devez devenir votre propre autorité de certification.

«Devenir votre propre autorité de certification» est appelé exécuter une PKI privée. Il n'y a pas grand-chose. Vous pouvez faire tout ce qu'une autorité de certification publique peut faire. La seule chose différente est que vous devrez installer votre certificat d'autorité de certification racine dans les différents magasins. Ce n'est pas différent de, disons, utiliser des cURL cacerts.pm. cacerts.pmn'est qu'une collection de Root CA, et maintenant vous avez rejoint le club.

Si vous devenez votre propre autorité de certification, assurez-vous de graver votre clé privée d'autorité de certification racine sur le disque et de la garder hors ligne. Insérez-le ensuite dans votre lecteur de CD / DVD lorsque vous devez signer une demande de signature. Maintenant, vous émettez des certificats comme une autorité de certification publique.

Rien de tout cela n'est terriblement difficile une fois que vous avez signé une ou deux demandes de signature. Je gère une PKI privée depuis des années à la maison. Tous mes appareils et gadgets font confiance à mon autorité de certification.

Pour plus d'informations sur la manière de devenir votre propre autorité de certification, consultez Comment signer une demande de signature de certificat avec votre autorité de certification et Comment créer un certificat auto-signé avec openssl? .


D'après les commentaires dans le fichier de configuration ci-dessous ...

Auto signé (notez l'ajout de -x509)

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

Demande de signature (notez l'absence de -x509)

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

Imprimer un 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

# Self Signed (note the addition of -x509):
#     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
# Signing Request (note the lack of -x509):
#     openssl req -config example-com.conf -new -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
# Print it:
#     openssl x509 -in example-com.cert.pem -text -noout
#     openssl req -in example-com.req.pem -text -noout

[ 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).
#   It's 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 it's 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        = [email protected]

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

subjectKeyIdentifier        = hash
authorityKeyIdentifier  = keyid,issuer

#  If RSA Key Transport bothers you, then remove keyEncipherment. TLS 1.3 is removing RSA
#  Key Transport in favor of exchanges with Forward Secrecy, like DHE and ECDHE.
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
# 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
# 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
# DNS.9     = fe80::1

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.

# IPv4 localhost
# IP.1       = 127.0.0.1

# IPv6 localhost
# IP.2     = ::1
Communauté
la source
Pouvez-vous s'il vous plaît ajouter le chemin par défaut au fichier de configuration? - - Pouvez-vous s'il vous plaît montrer le déroulement complet du travail? A propos de la transmission du fichier à la commande openssl, etc. - - Je n'ai pas réussi à réussir avec la réponse précédente, donc toutes les informations nécessaires sont appréciées.
Léo Léopold Hertz 준영
@Masi - "Pouvez-vous s'il vous plaît ajouter le chemin par défaut au fichier de configuration?" - Pas sûr de ce que vous voulez dire. Vous pouvez l'enregistrer où vous le souhaitez. Je l'exécute depuis le bureau sur de nombreuses machines et mon répertoire personnel sur d'autres. J'ai remarqué que tu utilisais sudo. Peut-être que votre .rndfichier appartient à root. Si oui, essayez a sudo chown -R masi:masi /home/masi. Ensuite, vous pourrez y lire et y écrire.
J'utilise maintenant uniquement Debian, pas Ubuntu, donc seulement root. Veuillez ajouter votre flux de travail comme exemple sur le fichier keepinv dans le bureau et la transmission. Je n'ai pas une idée claire du système.
Léo Léopold Hertz 준영
1
Exécutez l'une des commandes répertoriées en tête du fichier. Les commentaires sont là pour copier / coller. Choisissez celui qui convient à votre goût. Si vous essayez toujours de générer un auto-signé, vous exécutez la commande avec x509(comme le dit le commentaire).
L'auteur a demandé la suppression de ce message "en raison des changements de CA / B", mais en raison du nombre de votes et de l'aide potentielle qu'il a fourni au fil des ans, je l'ai restauré. Prenez l'avis dans le poste tel qu'il vous a été donné.
Jeff Schaller
1

Le CommonNamedoit correspondre à ce qui est envoyé comme en- Host: tête dans la requête HTTP. Dans votre cas, ce serait 192.168.1.107 (sans barre oblique).

Configurer le nom d'hôte d'un serveur Web

Personnellement, je configurerais un nom d'hôte convivial pour le serveur Web. Dans votre configuration de messagerie Apache ou de configuration d'hôte virtuel (probablement /etc/apache2/sites-enabled/000-default.confpour les distributions basées sur Debian), utilisez la directive ServerNameou ServerAlias, par exemple,

ServerName owncloud.masi

Redémarrez Apache puis configurez DNS ou (plus simplement) ajoutez une entrée dans chaque client /etc/hostspour la pointer vers la bonne adresse IP, par exemple,

192.168.1.107   owncloud.masi
Anthony G - justice pour Monica
la source
Mon accès owncloud est à 192.168.1.107. L'autre thread dit que vous devez inclure le sous-domaine. Je pense que cela implique 192.168.1.107/owncloud. Cependant, je peux me tromper.
Léo Léopold Hertz
Supposons que vous l'utilisiez ServerName owncloud.masidans .../sites-enabled/000-default.conf. Le nom commun de la clé SSL est-il alors owncloud.masi ?
Léo Léopold Hertz
L'adresse IP cessera-t-elle de fonctionner? De même si vous utilisez ServerAlias?
Léo Léopold Hertz
1
L'accès via l'adresse IP doit continuer à fonctionner pour HTTP. BTW, nous avons atteint la limite de commentaires (j'ai donc supprimé mes réponses précédentes à vos questions) et je vais devoir me déconnecter bientôt.
Anthony G - justice pour Monica
1
"Le CommonName doit correspondre à tout ce qui est envoyé en tant qu'en-tête Host: dans la requête HTTP" - Incorrect. Placer un nom d'hôte est le nom commun est déconseillé par les forums IETF et CA / B. Les noms de serveur et les adresses IP vont toujours dans le nom alternatif du sujet selon les forums IETF et CA / B. Voir aussi Comment signer la demande de signature de certificat avec votre autorité de certification et Comment créer un certificat auto-signé avec openssl?