Comment signer une demande de signature de certificat avec votre autorité de Certification?
au cours de ma recherche, j'ai trouvé plusieurs façons de signer une demande de signature de certificat SSL:
-
utilisant le module
x509
:openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
-
utilisant le module
ca
:openssl ca -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
Note: Je ne suis pas sûr de l'utilisation des bons paramètres pour celui-ci. Veuillez informer l'utilisation correcte si je suis à l'utiliser.
De quelle façon devrait-on signer les demandes de certificat avec votre autorité de Certification? Est une méthode meilleure que l'autre (par exemple, l'un étant obsolète)?
2 réponses
1. Using the x509 module
openssl x509 ...
...
2 Using the ca module
openssl ca ...
...
ce que vous manquez est le prélude à ces commandes.
il s'agit d'un processus en deux étapes. Vous mettez d'abord en place votre AC, puis vous signez un certificat d'entité finale (A. K. un serveur ou un utilisateur). Les deux commandements elide les deux pas en un. Et les deux présument que vous avez un fichier de configuration OpenSSL déjà configuré pour les certificats CAs et Server (entité finale).
tout d'abord, créer une base fichier de configuration :
$ touch openssl-ca.cnf
ensuite, ajouter ce qui suit:
HOME = .
RANDFILE = $ENV::HOME/.rnd
####################################################################
[ ca ]
default_ca = CA_default # The default ca section
[ CA_default ]
default_days = 1000 # how long to certify for
default_crl_days = 30 # how long before next CRL
default_md = sha256 # use public key default MD
preserve = no # keep passed DN ordering
x509_extensions = ca_extensions # The extensions to add to the cert
email_in_dn = no # Don't concat the email in the DN
copy_extensions = copy # Required to copy SANs from CSR to cert
####################################################################
[ req ]
default_bits = 4096
default_keyfile = cakey.pem
distinguished_name = ca_distinguished_name
x509_extensions = ca_extensions
string_mask = utf8only
####################################################################
[ ca_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Maryland
localityName = Locality Name (eg, city)
localityName_default = Baltimore
organizationName = Organization Name (eg, company)
organizationName_default = Test CA, Limited
organizationalUnitName = Organizational Unit (eg, division)
organizationalUnitName_default = Server Research Department
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Test CA
emailAddress = Email Address
emailAddress_default = test@example.com
####################################################################
[ ca_extensions ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer
basicConstraints = critical, CA:true
keyUsage = keyCertSign, cRLSign
les champs au-dessus de A proviennent d'un plus complexe openssl.cnf
(vous pouvez le trouver dans /usr/lib/openssl.cnf
), mais je pense qu'ils sont essentiels pour créer le certificat CA et la clé privée.
Modifier les champs ci-dessus à votre goût. Les valeurs par défaut vous permettent de gagner du temps lors de la saisie des mêmes informations expérimentation du fichier de configuration et des options de commande.
j'ai omis les éléments pertinents de la LCR, mais vos opérations de L'AC devraient les avoir. Voir openssl.cnf
et la section correspondante crl_ext
.
ensuite, exécutez ce qui suit. Le -nodes
omet le mot de passe ou la phrase de passe pour que vous puissiez examiner le certificat. Son a really 1519750920" bad idée d'omettre le mot de passe ou la phrase de passe.
$ openssl req -x509 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM
après l'exécution de la commande, cacert.pem
sera votre certificat pour les opérations de L'AC, et cakey.pem
sera la clé privée. Rappelons que la clé privée n'a pas de mot de passe ou de phrase de passe pour .
vous pouvez vider le certificat avec ce qui suit.
$ openssl x509 -in cacert.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 11485830970703032316 (0x9f65de69ceef2ffc)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
Validity
Not Before: Jan 24 14:24:11 2014 GMT
Not After : Feb 23 14:24:11 2014 GMT
Subject: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:b1:7f:29:be:78:02:b8:56:54:2d:2c:ec:ff:6d:
...
39:f9:1e:52:cb:8e:bf:8b:9e:a6:93:e1:22:09:8b:
59:05:9f
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A
X509v3 Authority Key Identifier:
keyid:4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage:
Certificate Sign, CRL Sign
Signature Algorithm: sha256WithRSAEncryption
4a:6f:1f:ac:fd:fb:1e:a4:6d:08:eb:f5:af:f6:1e:48:a5:c7:
...
cd:c6:ac:30:f9:15:83:41:c1:d1:20:fa:85:e7:4f:35:8f:b5:
38:ff:fd:55:68:2c:3e:37
et tester son but avec ce qui suit (ne vous inquiétez pas du Any Purpose: Yes
; voir "critique, CA: faux" mais " tout Objet CA: Oui " ).
$ openssl x509 -purpose -in cacert.pem -inform PEM
Certificate purposes:
SSL client : No
SSL client CA : Yes
SSL server : No
SSL server CA : Yes
Netscape SSL server : No
Netscape SSL server CA : Yes
S/MIME signing : No
S/MIME signing CA : Yes
S/MIME encryption : No
S/MIME encryption CA : Yes
CRL signing : Yes
CRL signing CA : Yes
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : Yes
Time Stamp signing : No
Time Stamp signing CA : Yes
-----BEGIN CERTIFICATE-----
MIIFpTCCA42gAwIBAgIJAJ9l3mnO7y/8MA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV
...
aQUtFrV4hpmJUaQZ7ySr/RjCb4KYkQpTkOtKJOU1Ic3GrDD5FYNBwdEg+oXnTzWP
tTj//VVoLD43
-----END CERTIFICATE-----
pour la deuxième partie, je vais créer un autre fichier conf facilement digestible. Tout d'abord, touch
le openssl-server.cnf
(vous pouvez faire un de ceux-ci pour les certificats d'utilisateur aussi).
$ touch openssl-server.cnf
alors ouvrez-le et ajoutez ce qui suit.
HOME = .
RANDFILE = $ENV::HOME/.rnd
####################################################################
[ req ]
default_bits = 2048
default_keyfile = serverkey.pem
distinguished_name = server_distinguished_name
req_extensions = server_req_extensions
string_mask = utf8only
####################################################################
[ server_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = MD
localityName = Locality Name (eg, city)
localityName_default = Baltimore
organizationName = Organization Name (eg, company)
organizationName_default = Test Server, Limited
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Test Server
emailAddress = Email Address
emailAddress_default = test@example.com
####################################################################
[ server_req_extensions ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
####################################################################
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
si vous développez et avez besoin d'utiliser votre poste de travail comme serveur, alors vous pouvez avoir 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
ensuite, créer la requête de certificat de serveur. Assurez-vous de omettre -x509
*. Ajouter -x509
créera un certificat, et non une requête.
$ openssl req -config openssl-server.cnf -newkey rsa:2048 -sha256 -nodes -out servercert.csr -outform PEM
après l'exécution de cette commande, vous aurez une requête dans servercert.csr
et une clé privée dans serverkey.pem
.
et vous pouvez l'inspecter à nouveau.
$ openssl req -text -noout -verify -in servercert.csr
Certificate:
verify OK
Certificate Request:
Version: 0 (0x0)
Subject: C=US, ST=MD, L=Baltimore, CN=Test Server/emailAddress=test@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d:
...
f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51:
86:e1
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Subject Key Identifier:
1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com
Netscape Comment:
OpenSSL Generated Certificate
Signature Algorithm: sha256WithRSAEncryption
6d:e8:d3:85:b3:88:d4:1a:80:9e:67:0d:37:46:db:4d:9a:81:
...
76:6a:22:0a:41:45:1f:e2:d6:e4:8f:a1:ca:de:e5:69:98:88:
a9:63:d0:a7
ensuite, vous devez signer avec votre CA.
vous êtes presque prêt à signer le certificat du serveur par votre CA. L'AC openssl-ca.cnf
a besoin de deux autres sections avant d'émettre la commande.
Tout d'abord, ouvrez openssl-ca.cnf
et ajoutez les deux sections suivantes.
####################################################################
[ signing_policy ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
####################################################################
[ signing_req ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
deuxième, ajouter ce qui suit à la section [ CA_default ]
de openssl-ca.cnf
. J'ai laissé plus haut, car ils peuvent compliquer les choses (ils n'avaient pas à l'époque). Vous allez maintenant voir comment ils sont utilisés, donc j'espère qu'ils vont faire sens.
base_dir = .
certificate = $base_dir/cacert.pem # The CA certifcate
private_key = $base_dir/cakey.pem # The CA private key
new_certs_dir = $base_dir # Location for new certs after signing
database = $base_dir/index.txt # Database index file
serial = $base_dir/serial.txt # The current serial number
unique_subject = no # Set to 'no' to allow creation of
# several certificates with same subject.
la Troisième, touch index.txt
et serial.txt
:
$ touch index.txt
$ echo '01' > serial.txt
alors, effectuer ce qui suit:
$ openssl ca -config openssl-ca.cnf -policy signing_policy -extensions signing_req -out servercert.pem -infiles servercert.csr
vous devriez voir similaire à ce qui suit:
Using configuration from openssl-ca.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'US'
stateOrProvinceName :ASN.1 12:'MD'
localityName :ASN.1 12:'Baltimore'
commonName :ASN.1 12:'Test CA'
emailAddress :IA5STRING:'test@example.com'
Certificate is to be certified until Oct 20 16:12:39 2016 GMT (1000 days)
Sign the certificate? [y/n]:Y
1 out of 1 certificate requests certified, commit? [y/n]Y
Write out database with 1 new entries
Data Base Updated
après l'exécution de la commande, vous aurez un certificat de serveur fraîchement activé dans servercert.pem
. La clé privée a été créée plus tôt et est disponible dans serverkey.pem
.
enfin, vous pouvez inspecter votre certificat fraîchement émis avec ce qui suit.
$ openssl x509 -in servercert.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 9 (0x9)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
Validity
Not Before: Jan 24 19:07:36 2014 GMT
Not After : Oct 20 19:07:36 2016 GMT
Subject: C=US, ST=MD, L=Baltimore, CN=Test Server
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d:
...
f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51:
86:e1
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61
X509v3 Authority Key Identifier:
keyid:42:15:F2:CA:9C:B1:BB:F5:4C:2C:66:27:DA:6D:2E:5F:BA:0F:C5:9E
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com
Netscape Comment:
OpenSSL Generated Certificate
Signature Algorithm: sha256WithRSAEncryption
b1:40:f6:34:f4:38:c8:57:d4:b6:08:f7:e2:71:12:6b:0e:4a:
...
45:71:06:a9:86:b6:0f:6d:8d:e1:c5:97:8d:fd:59:43:e9:3c:
56:a5:eb:c8:7e:9f:6b:7a
Précédemment, vous avez ajouté ce qui suit à CA_default
: copy_extensions = copy
. Cette extension est fournie par la personne qui fait la demande.
si vous omettez copy_extensions = copy
, alors votre certificat de serveur manquera des noms de rechange (SANs) Comme www.example.com
et mail.example.com
.
si vous utilisez copy_extensions = copy
mais ne regardez pas la requête, alors le demandeur pourrait être en mesure de vous tromper en signant quelque chose comme une racine subordonnée (plutôt que un certificat de serveur ou d'utilisateur). Ce qui signifie qu'il sera en mesure de menthe certificats qui chaîne de retour à votre racine de confiance. Assurez-vous de vérifier la demande avec openssl req -verify
avant de signer.
si vous omettre unique_subject
ou le mettre à yes
, alors vous ne serez autorisé à créer un "certificat 1519760920" sous le nom distinctif du sujet.
unique_subject = yes # Set to 'no' to allow creation of
# several ctificates with same subject.
Si vous tentez de créer un deuxième certificat en expérimentant, vous obtiendrez les résultats suivants lorsque vous signez le certificat de votre serveur avec la clé privée de L'AC:
Sign the certificate? [y/n]:Y
failed to update database
TXT_DB error number 2
Donc unique_subject = no
est parfait pour les tests.
si vous voulez vous assurer que le nom de L'organisation est cohérent entre les certificats auto-signés des SAE, des CA subordonnées et des entités finales, alors ajoutez ce qui suit à vos fichiers de configuration de L'AC:
[ policy_match ]
organizationName = match
si vous voulez autoriser le changement du nom de L'organisation, utilisez:
[ policy_match ]
organizationName = supplied
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 5280, Internet X. 509 Profil du certificat D'Infrastructure à clé publique et de la liste de révocation de certificat (LCR)
- RFC 6125, Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X. 509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)
- RFC 6797, Annexe A, HTTP Strict Transport Security (HSTS) 15191620920"
- RFC 7469, public Key Pinning Extension for HTTP
- CA / Browser Forum Baseline Requirements
- CA / Browser Forum Extended Validation Guidelines Les documents
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.
en plus de répondre de @jww , je voudrais dire que la configuration dans openssl-ca.cnf
default_days = 1000 # how long to certify for
définit le nombre de jours par défaut que le certificat signé par cette root-ca sera valide, pour définir la validité de root-ca lui-même, vous devez utiliser l'option '- days n' dans
openssl req -x509 -days 3000 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM
à défaut de quoi votre root-ca ne sera valide que pour 1 mois par défaut et tout certificat signé par ce rot-ca aura également une validité de 1 mois.