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
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
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
issuerAltname
(si vous en avez, j'aimerais savoir où).issuer:always
n'est pas recommandée pour authorityKeyIdentifier
.email:copy
fonctionne maintenant avec subjectAltName
.v3_req
est superflue (ainsi que la ligne req_extensions
.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
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;
}
}
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/
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.
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.