web-dev-qa-db-fra.com

OpenSSL Version V3 avec autre nom de sujet

J'utilise l'outil de ligne de commande OpenSSL pour générer un certificat auto-signé. Il semble fonctionner correctement, sauf pour deux problèmes. Je ne parviens pas à créer un fichier .cer avec un autre nom de sujet (critique) et je n'ai pas été en mesure de créer un certificat conforme à la version 3 (je ne suis pas sûr que cela soit essentiel, mais je préférerais apprendre comment définir la version). 

Quelqu'un at-il fait cela avec succès? Le fichier de configuration par défaut (.cfg) contient une documentation apparemment claire (voir ci-dessous): 

"Ce matériel concerne subjectAltName et issuerAltname . Importez l'adresse email . SubjectAltName = email: copy"

Cependant, cela ne fonctionne pas. Mon intuition est que le nom alternatif du sujet n'apparaisse pas car il n'est pas présent dans les spécifications de la V1, c'est pourquoi je cherche également à définir la version. 

Voici le fichier de configuration que j'utilise:

[ req ]
default_bits        = 2048 
default_keyfile     = privkey.pem 
distinguished_name  = req_distinguished_name
emailAddress        = [email protected]
req_extensions          = v3_req
x509_extensions         = v3_ca

[req_distinguished_name]
C = [Press Enter to Continue]
C_default = US 
C_min = 2 
C_max = 2 

O = [Press Enter to Continue]
O_default = default 

0.OU=[Press Enter to Continue]
0.OU_default = default 
1.OU=[Press Enter to Continue]
1.OU_default = PKI 
2.OU=[Press Enter to Continue] 
2.OU_default = ABCD
commonName = Public FQDN of server 
commonName_max = 64

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment

[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName         = email:[email protected]
issuerAltName          = issuer:copy
19
Kandres22

Voici les étapes simples pour vous 

Lors de la génération de la CSR, vous devez utiliser -config et -extensions Et lors de la génération du certificat, vous devez utiliser -extfile et -extensions. 

Voici l'exemple 

openssl req -new -nodes -keyout test.key  -out test.csr -days 3650 -subj "/C=US/ST=SCA/L=SCA/O=Oracle/OU=Java/CN=test cert" -config /etc/pki/tls/openssl.cnf -extensions v3_req
openssl x509 -req -days 3650 -in test.csr -CA cacert.pem -CAkey rootCA.key -CAcreateserial -out test.pem -extfile /etc/pki/tls/openssl.cnf  -extensions v3_req

j'espère que cela t'aides

13
Raghu K Nair

Je l'ai fait fonctionner avec la version suivante (emailAddress a été mal placé):

[ req ]
default_bits        = 2048 
default_keyfile     = privkey.pem 
distinguished_name  = req_distinguished_name
req_extensions          = v3_req
x509_extensions         = v3_ca

[req_distinguished_name]
C = [Press Enter to Continue]
C_default = US 
C_min = 2 
C_max = 2 

O = [Press Enter to Continue]
O_default = default 

0.OU=[Press Enter to Continue]
0.OU_default = default 
1.OU=[Press Enter to Continue]
1.OU_default = PKI 
2.OU=[Press Enter to Continue] 
2.OU_default = ABCD
commonName = Public FQDN of server 
commonName_max = 64
emailAddress = [Press Enter to Continue] 
emailAddress_default = [email protected]

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment

[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName         = email:[email protected]
issuerAltName          = issuer:copy

Remarques:

  • Pour générer le certificat que j'ai utilisé:

    openssl req -config req.cnf -new -nodes -out req.pem -x509
    
  • Je n'ai pas vu beaucoup d'utilité pour issuerAltname (si vous en avez, j'aimerais savoir où).
  • L'utilisation de issuer:always n'est pas recommandée pour authorityKeyIdentifier.
  • Utiliser email:copy fonctionne maintenant avec subjectAltName.
  • La section v3_req est superflue (ainsi que la ligne req_extensions.
8
Mathias Brossard

Quelle commande avez-vous utilisée pour effectuer la demande de certificat CSR? Quelle commande avez-vous utilisée pour créer le fichier de certificat? Des réponses différentes selon les circonstances que vous connaissez.

Peut-être que vous ne mettez pas 

subjectAltName = email: copier

dans la section

[v3_req]

Vous utilisez peut-être openssl x509 pour générer le certificat, le cas échéant, vous devez utiliser

-extfile /etc/pki/tls/openssl.cnf

car sans cela, il n’utilise pas votre fichier de configuration

Vous pourriez aussi avoir besoin

-extensions v3_req

commutateur de ligne de commande

3
user1844882

D'accord, aucune des autres réponses sur cette page n'a fonctionné pour moi, et j'ai essayé chacune des dernières. Ce qui a fonctionné pour moi était un petit truc:

lors de la demande du certificat:

-config '<(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER"))' 
-reqexts SAN

et lors de la signature du cert:

-extfile '<(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER"))' 
-extensions SAN

Donc, il n'y a pas de confusion, voici un script de travail qui couvre tout depuis le début, y compris la création d'une autorité de certification:

# if the server name is undefined, lets default to 'Some-Server'
SERVER="${SERVER:-Some-Server}"

CORPORATION=My-Corp
GROUP=My-Corporate-Group
CITY=City
STATE=State
COUNTRY=US

CERT_AUTH_PASS=`openssl Rand -base64 32`
echo $CERT_AUTH_PASS > cert_auth_password
CERT_AUTH_PASS=`cat cert_auth_password`

# create the certificate authority
openssl \
  req \
  -subj "/CN=$SERVER.ca/OU=$GROUP/O=$CORPORATION/L=$CITY/ST=$STATE/C=$COUNTRY" \
  -new \
  -x509 \
  -passout pass:$CERT_AUTH_PASS \
  -keyout ca-cert.key \
  -out ca-cert.crt \
  -days 36500

# create client private key (used to decrypt the cert we get from the CA)
openssl genrsa -out $SERVER.key

# create the CSR(Certitificate Signing Request)
openssl \
  req \
  -new \
  -nodes \
  -subj "/CN=$SERVER/OU=$GROUP/O=$CORPORATION/L=$CITY/ST=$STATE/C=$COUNTRY" \
  -sha256 \
  -extensions v3_req \
  -reqexts SAN \
  -key $SERVER.key \
  -out $SERVER.csr \
  -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
  -days 36500

# sign the certificate with the certificate authority
openssl \
  x509 \
  -req \
  -days 36500 \
  -in $SERVER.csr \
  -CA ca-cert.crt \
  -CAkey ca-cert.key \
  -CAcreateserial \
  -out $SERVER.crt \
  -extfile <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
  -extensions SAN \
  -passin pass:$CERT_AUTH_PASS

Nous pouvons ensuite vérifier que le nom d'objet alternatif est dans le certificat final:

openssl x509 -in Some-Server.crt -text -noout

La section pertinente est:

    X509v3 extensions:
        X509v3 Subject Alternative Name: 
            DNS:Some-Server

Donc ça a marché! C’est un certificat qui sera accepté par tous les principaux navigateurs (y compris chrome), tant que vous installez l’autorité de certification dans le navigateur. C'est ca-cert.crt que vous aurez besoin d'installer.

Voici un exemple de configuration pour ngnx qui vous permettrait d’utiliser le cert:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name  localhost:443;

    ssl_certificate /etc/ssl/certs/Some-Server.crt;
    ssl_certificate_key /etc/ssl/private/Some-Server.key;
    ssl_dhparam /etc/ssl/certs/https-dhparam.pem;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
2
Jack Davidson

Je viens de développer un outil Web qui générera cette commande automatiquement en fonction de la saisie du formulaire et affichera le résultat. http://kernelmanic.com/certificate-request-generator-with-multiple-common-names-and-subject-alternative-names/

0
user40662

Le v3_req est requis avec l'entrée subjectAltName dans le fichier de configuration. La commande 

openssl x509 ... -extfile openssl.cnf -extensions v3_req

insérera le SAN dans le certificat.

0
Dominic

Je sais que ce fil est un peu vieux, mais juste au cas où cela fonctionnerait sous Windows, vérifiez que le fichier est encodé en UTF-8. Dans mon cas, une erreur s'est produite indiquant qu'il y avait une erreur avec le fichier. ouvrez-le sur Notepad ++, définissez le codage du fichier sur UTF-8, enregistrez-le, puis exécutez à nouveau la commande openssl. 

0
OscarG