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:

  1. utilisant le module x509 :

    openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    
  2. 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)?

141
demandé sur psmears 2014-01-23 04:41:16

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 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.

339
répondu jww 2018-02-16 08:55:04

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.

5
répondu humble_wolf 2017-12-25 16:26:14