2017-03-06 1 views
0

Ok, donc j'ai une méthode qui est capable de passer une CRL et un certificat. Je l'ai utilisé pour valider les certificats provenant des fournisseurs pendant l'exécution de ma demande.Test de l'unité de certificat X509 - J'ai besoin de créer un certificat et une liste de révocation de certificats qui l'a

La partie la plus difficile de ceci a été l'unité de test la chose sacrément!

J'ai besoin de créer un fichier de certificat, et un fichier CRL, que je peux ensuite distribuer en tant que ressources avec l'application, puis les transmettre lors du test unitaire.

J'ai le test unitaire écrit aussi, mais avec des valeurs codées en dur - Mais maintenant je dois savoir comment créer les éléments suivants:

deux certificats X509. Un CRL

J'ai besoin de la CRL pour avoir une entrée pour l'un des deux certificats X509. Cela me permettra de tester le résultat de la révocation, ainsi que la non-révocation.

J'ai essayé le guide suivant, mais la sécurité est loin de mon point fort - et je n'arrive pas à le faire fonctionner.

https://blog.didierstevens.com/2013/05/08/howto-make-your-own-cert-and-revocation-list-with-openssl/ 
+0

Stack Overflow est un site de questions de programmation et de développement. Cette question semble être hors sujet car il ne s'agit pas de programmation ou de développement. Voir [Quels sujets puis-je poser à ce sujet?] (Http://stackoverflow.com/help/on-topic) dans le centre d'aide. Peut-être [Super User] (http://superuser.com/) ou [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/) serait un meilleur endroit à demander. Voir aussi [Où poser des questions sur Dev Ops?] (Http://meta.stackexchange.com/q/134306) – jww

+0

Voir également [Comment signer une demande de signature de certificat avec votre autorité de certification] (http: // stackoverflow .com/a/21340898/608639) et [Comment créer un certificat auto-signé avec openssl?] (http://stackoverflow.com/q/10175812/608639) – jww

Répondre

0

Jamie Nguyen a un excellent guide sur la création d'une autorité de certification et la délivrance de certificats et CRLs, qui se trouve ici: https://jamielinux.com/docs/openssl-certificate-authority/ Voilà ce que je vais faire référence vaguement à en répondant à votre question. Si à un moment donné vous êtes curieux de savoir à quoi ressemblerait la sortie de ces commandes, je vous renvoie à son site. Ils sont omis ici pour garder ce poste déjà long gérable.

Fondamentalement, nous devons faire ce qui suit:

  • Créer un certificat auto-signé pour agir comme autorité de certification
  • Utilisez le certificat CA pour signer deux certificats de feuille
  • Révoquer l'un des les certificats de feuille
  • une liste de révocation Publish

Création autosignée ed CA Certificate

Nous allons d'abord devoir préparer la configuration CA. Si vous ne voulez pas passer par son tutoriel, vous pouvez simplement utiliser ce qui suit, config un peu abrégé:

# OpenSSL root CA configuration file. 

[ ca ] 
default_ca = ca_default 

[ ca_default ] 
dir    = /etc/pki/CA 
certs    = $dir/certs 
crl_dir   = $dir/crl 
new_certs_dir  = $dir/newcerts 
database   = $dir/db/root-ca.index 
serial   = $dir/db/root-ca.serial 
RANDFILE   = $dir/private/.rand 
private_key  = $dir/private/root-ca.key 
certificate  = $dir/certs/root-ca.crt 
crlnumber   = $dir/db/root-ca.crlnumber 
crl    = $dir/crl/root-ca.crl 
crl_extensions = crl_ext 
default_crl_days = 180 
default_md  = sha384 
name_opt   = ca_default 
cert_opt   = ca_default 
default_days  = 375 
preserve   = no 
policy   = policy_loose 

[ policy_strict ] 
countryName    = match 
stateOrProvinceName  = match 
organizationName  = match 
organizationalUnitName = optional 
commonName    = supplied 
emailAddress   = optional 

[ policy_loose ] 
countryName    = optional 
stateOrProvinceName  = optional 
localityName   = optional 
organizationName  = optional 
organizationalUnitName = optional 
commonName    = supplied 
emailAddress   = optional 

[ req ] 
default_bits  = 3072 
distinguished_name = req_distinguished_name 
string_mask   = utf8only 
default_md   = sha384 
x509_extensions  = int_ca 

[ req_distinguished_name ] 
countryName      = Country Name (2 letter code) 
stateOrProvinceName    = State or Province Name 
localityName     = Locality Name 
0.organizationName    = Organization Name 
organizationalUnitName   = Organizational Unit Name 
commonName      = Common Name 
emailAddress     = Email Address 
countryName_default    = US 
stateOrProvinceName_default  = MD 
localityName_default   = 
0.organizationName_default  = LAB 
organizationalUnitName_default = 
emailAddress_default   = 

[ root_ca ] 
subjectKeyIdentifier = hash 
authorityKeyIdentifier = keyid:always,issuer 
basicConstraints = critical, CA:true 
keyUsage = critical, digitalSignature, cRLSign, keyCertSign 

[ usr_cert ] 
basicConstraints = CA:FALSE 
subjectKeyIdentifier = hash 
authorityKeyIdentifier = keyid,issuer 
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment 
extendedKeyUsage = clientAuth, emailProtection 
crlDistributionPoints = URI:http://pki.lab.local/int-ca.crl 
authorityInfoAccess = caIssuers;URI:http://pki.lab.local/int-ca.crt 

[ server_cert ] 
basicConstraints = CA:FALSE 
subjectKeyIdentifier = hash 
authorityKeyIdentifier = keyid,issuer:always 
keyUsage = critical, digitalSignature, keyEncipherment 
extendedKeyUsage = serverAuth 
crlDistributionPoints = URI:http://pki.lab.local/int-ca.crl 
authorityInfoAccess = caIssuers;URI:http://pki.lab.local/int-ca.crt 

[ crl_ext ] 
authorityKeyIdentifier=keyid:always 
authorityInfoAccess = caIssuers;URI:http://pki.lab.local/int-ca.crt 

Cela devrait être placé dans le répertoire de travail comme openssl.cnf.

Vous devez modifier la ligne dir = /etc/pki/CA pour pointer vers le répertoire que vous allez travailler sur, et peut-être modifier les URL CDP pour pointer vers un domaine réel si vous souhaitez activer la vérification de révocation par CDP.

Ensuite, nous allons devoir créer des fichiers et des répertoires attendus par l'autorité de certification, puis générer une clé privée RSA pour le certificat d'autorité de certification. Remarque: La clé privée de l'autorité de certification sera protégée par une phrase secrète.

mkdir db private certs crl newcerts csr & touch db/root-ca.index 
echo 1000 > db/root-ca.serial & echo 1000 > db/root-ca.crlnumber 
openssl genrsa -aes256 -out private/root-ca.key 4096 

Nous devons maintenant générer un certificat d'autorité de certification à l'aide de la nouvelle clé privée.La phrase secrète que vous avez saisie lors de la création de la clé privée vous sera demandée, puis vous demandera des informations telles que Pays, État et Nom commun. Le champ de nom commun est ce qui compte ici, et pour ce test, je voudrais juste mettre Test Root CA.

openssl req -config openssl.cnf -key private/root-ca.key \ 
    -new -x509 -days 3650 -sha256 -extensions root_ca \ 
    -out certs/root-ca.crt 

Une fois la commande terminée, vous devriez voir un nouveau certificat à certs/root-ca.crt, que vous pouvez voir avec la commande suivante:

openssl x509 -in certs/root-ca.crt -noout -text 

Création de feuilles Certificats

Pour créer des feuilles certificats (également appelés certificats d'entité finale), vous devrez générer une autre clé privée pour chacun d'entre eux. Nous les appellerons test1 et test2.

openssl genrsa -aes256 -out private/test1.key 4096 
openssl genrsa -aes256 -out private/test2.key 4096 

Pour chacun d'eux, vous allez générer une demande de signature de certificat (CSR) que le CA utilisera pour générer le certificat réel. Des questions similaires vous seront posées lors de la création du certificat de l'autorité de certification. Vous pouvez simplement utiliser Test 1 et Test 2 comme noms communs.

openssl req -config openssl.cnf -key private/test1.key 
    -new -sha256 -out csr/test1.req 
openssl req -config openssl.cnf -key private/test2.key 
    -new -sha256 -out csr/test2.req 

Vous devriez maintenant avoir deux demandes de certificats dans le répertoire csr. Nous allons les utiliser pour générer les certificats. Vous devrez entrer la phrase secrète de la clé privée de l'AC pour signer ces demandes.

openssl ca -config -in csr/test1.req -out certs/test1.crt \ 
    -extensions server_cert -days 365 -notext -md sha256 
openssl ca -config -in csr/test2.req -out certs/test2.crt \ 
    -extensions server_cert -days 365 -notext -md sha256 

Maintenant, vous devriez avoir deux nouveaux certificats de feuilles brillantes dans le répertoire certs. Ils peuvent être visualisés avec les commandes ci-dessous.

openssl x509 -in certs/test1.crt -noout -text 
openssl x509 -in certs/test2.crt -noout -text 

Révoquer un certificat

Maintenant vient la partie amusante. Le processus de révocation d'un certificat est similaire à la signature. Nous allons utiliser le certificat CA et la clé privée pour révoquer la feuille de Test 2. La commande suivante nécessitera la phrase secrète de la clé privée de l'autorité de certification.

openssl ca -config opnessl.cnf -revoke certs/test2.crt 

Si vous êtes curieux, le fichier db/root-ca.index, qui jusqu'à ce point a été l'enregistrement des numéros de série et horodatages des certificats que nous émettons, devrait afficher une deuxième horodatage de révocation à côté de Test 2. C'est un fichier texte normal.

La publication de la liste de révocation

maintenant pour générer une liste de révocation, nous faisons simplement ce qui suit (nécessite une clé privée CA passphrase):

openssl ca -config openssl.cnf -gencrl -out crl/root-ca.crl 

Affichage de la liste de révocation est simple. En utilisant la commande ci-dessous, vous devriez voir une entrée pour le numéro de série de Test 2 et l'horodatage de sa révocation.

openssl crl -in crl/root-ca.crl -noout -text 

Pour vérifier le certificat a été révoqué, la commande suivante est utilisée:

cat certs/root-ca.crt crl/root-ca.crl > crl/crl-chain.pem 
openssl verify -crl_check -CAfile crl/crl-chain.pem certs/test2.crt 

L'utilisation de ce pour Test 2 doit retourner un statut de certificat de révocation. Exécuter le même commandant pour Test 1 devrait retourner OK.

Récapitulation

En supposant que tout a fonctionné correctement, le résultat final devrait être:

  • Un certificat CA dans certs/root-ca.crt
  • Un bon certificats de feuilles dans certs/test1.crt
  • Un certificat feuille révoqué dans certs/test2.crt
  • Un CRL i n crl/root-ca.crl

Remarque 1: Tout ceci suppose que vous utiliserez OpenSSL sur une machine Linux. Si vous avez besoin d'instructions pour Windows et certutil, ils peuvent être fournis.

Note 2: J'ai omis beaucoup de ce guide qui n'était pas directement lié à votre question. Si vous voulez plus de détails sur ce processus, je vous renvoie à nouveau au lien affiché en haut.