PKI : Installation de DogTag avec backend LDAP
Le présent article est actuellement en cours de rédaction ou de modification. Adressez-vous à la personne en charge pour toute proposition ou modification. |
Auteur / Editeur : Adadov |
Dernière édition : 15/01/2023 |
La PKI est en cours de réalisation, je place donc pour le moment ici que les infos importantes la documentation viendra à la fin |
Une bonne PKI n'est pas forcément utile pour tout le monde, la plupart du temps une installation avec les paramètres par défaut suffira. Vous trouverez pleins de documentations sur le net pour ces cas.
Mais dans certains cas, il faut aller plus loin ... Que ce soit par challenge personnel ou besoin précis, les choses se corsent vite ... Documentations manquantes, petites erreurs et autres dysfonctionnement.
On peut vite passer des heures à s'arracher les cheveux.
Donc après avoir agravé mon état de stress, je documente ici mon travail afin de m'aider moi tout en essayant d'éviter le burnout à d'autres par la même occasion.
Backend LDAP sur 389 DS
Pour les LDAP, je ne vais pas m'étendre ici je ferais une documentation séparée.
Nous utilisons actuellement 3 LDAP 389 DS en réplication multi-maitres.
Après de nombreux tests avec des bases de données séparées et des sous-suffixe, je suis revenu au suffixe unique qui simplifie grandement le déploiement (et le redéploiment ...)
Fichier de déploiement LDAP
Voici le fichier de configuration des instances utilisé pour le stockage de notre PKI:
Fichier de déploiement LDAP |
---|
;
; This is a version 2 ds setup inf file.
; It is used by the python versions of setup-ds-*
; Most options map 1 to 1 to the original .inf file.
; However, there are some differences that I envision
; For example, note the split backend section.
; You should be able to create, one, many or no backends in an install
;
; The special value {instance_name} is substituted at installation time.
;
; By default, all configuration parameters in this file are commented out.
; To use an INF file with dscreate, you must at least set the parameters
; flagged with [REQUIRED].
[general]
# defaults (str)
# Description: Directory Server enables administrators to use the default values for cn=config entries from a specific version. If you set this parameter to "999999999", which is the default, the instance always uses the default values of the latest version. For example, to configure that the instance uses default values from version 1.3.5, set this parameter to "001003005". The format of this value is XXXYYYZZZ, where X is the major version, Y the minor version, and Z the patch level. Note that each part of the value uses 3 digits and must be filled with leading zeros if necessary.
# Default value: 999999999
;defaults = 999999999
# full_machine_name (str)
# Description: Sets the fully qualified hostname (FQDN) of this system. When installing this instance with GSSAPI authentication behind a load balancer, set this parameter to the FQDN of the load balancer and, additionally, set "strict_host_checking" to "false".
# Default value: ldap##NUM##.exemple.com
full_machine_name = ldap##NUM##.exemple.com
# start (bool)
# Description: Starts the instance after the install completes. If false, the instance is created but not started.
# Default value: True
;start = True
# selinux (bool)
# Description: Enables SELinux detection and integration during the installation of this instance. If set to "True", dscreate auto-detects whether SELinux is enabled. Set this parameter only to "False" in a development environment.
# Default value: True
selinux = False
# strict_host_checking (bool)
# Description: Sets whether the server verifies the forward and reverse record set in the "full_machine_name" parameter. When installing this instance with GSSAPI authentication behind a load balancer, set this parameter to "false". Container installs imply "false".
# Default value: False
strict_host_checking = False
[slapd]
# instance_name (str)
# Description: Sets the name of the instance. You can refer to this value in other parameters of this INF file using the "{instance_name}" variable. Note that this name cannot be changed after the installation!
# Default value: localhost
instance_name = dogtag
# ldapi (str)
# Description: Sets the location of socket interface of the Directory Server.
# Default value: /run/slapd-{instance_name}.socket
;ldapi = /run/slapd-{instance_name}.socket
# port (int)
# Description: Sets the TCP port the instance uses for LDAP connections.
# Default value: 389
port = 389
# root_password (str)
# Description: Sets the password of the "cn=Directory Manager" account ("root_dn" parameter).You can either set this parameter to a plain text password dscreate hashes during the installation or to a "{algorithm}hash" string generated by the pwdhash utility. The password must be at least 8 characters long. Note that setting a plain text password can be a security risk if unprivileged users can read this INF file!
# Default value: Directory_Manager_Password
root_dn = cn=directoryman
root_password =
# secure_port (int)
# Description: Sets the TCP port the instance uses for TLS-secured LDAP connections (LDAPS).
# Default value: 636
secure_port = 636
# self_sign_cert (bool)
# Description: Sets whether the setup creates a self-signed certificate and enables TLS encryption during the installation. The certificate is not suitable for production, but it enables administrators to use TLS right after the installation. You can replace the self-signed certificate with a certificate issued by a Certificate Authority. If set to False, you can enable TLS later by importing a CA/Certificate and enabling 'dsconf <instance_name> config replace nsslapd-security=on'
# Default value: True
self_sign_cert = False
# self_sign_cert_valid_months (int)
# Description: Set the number of months the issued self-signed certificate will be valid.
# Default value: 24
;self_sign_cert_valid_months = 24
[backend-userroot]
# changelog_max_age (str)
# Description: How long an entry should remain in the replication changelog. The default is 7 days, or '7d'. (requires that replication is enabled).
# Default value: 7d
;changelog_max_age = 7d
# changelog_max_entries (str)
# Description: The maximum number of entries to keep in the replication changelog. The default is '-1', which means unlimited. (requires that replication is enabled).
# Default value: -1
;changelog_max_entries = -1
# create_suffix_entry (bool)
# Description: Set this parameter to "True" to create a generic root node entry for the suffix in the database.
# Default value: False
create_suffix_entry = True
# enable_replication (bool)
# Description: Enable replication for this backend. By default it will setup the backend as a supplier, with replica ID 1, and "cn=replication manager,cn=config" as the replication binddn.
# Default value: False
enable_replication = True
# replica_binddn (str)
# Description: Set the replication manager DN
# Default value: cn=replication manager,cn=config
replica_binddn = cn=replicationmgr,cn=config
# replica_bindgroup (str)
# Description: Set the replication bind group DN
# Default value:
;replica_bindgroup =
# replica_bindpw (str)
# Description: Sets the password of the Replication Manager account ("replica_binddn" parameter).Note that setting a plain text password can be a security risk if unprivileged users can read this INF file!
# Default value:
replica_bindpw =
# replica_id (str)
# Description: Set the unique replication identifier for this replica's database (suppliers only)
# Default value: 1
replica_id = ##NUM##
# replica_role (str)
# Description: Set the replication role. Choose either 'supplier', 'hub', or 'consumer'
# Default value: supplier
replica_role = supplier
# require_index (bool)
# Description: Set this parameter to "True" to refuse unindexed searches in this database.
# Default value: False
;require_index = False
# sample_entries (str)
# Description: Set this parameter to 'yes' to add latest version of sample entries to this database. Or, use '001003006' to use the 1.3.6 version sample entries. Use this option, for example, to create a database for testing purposes.
# Default value: no
;sample_entries = no
# suffix (str)
# Description: Sets the root suffix stored in this database. If you do not uncomment and set the suffix attribute the install process will NOT create the backend/suffix. You can also create multiple backends/suffixes by duplicating this section.
# Default value:
suffix = dc=pki,dc=exemple,dc=com
|
Ce fichier est fait pour être modifié via sed avant son utilisation.
On trouve 4 balises à remplacer dans ce fichier:
- ##NUM## : Le numéro du LDAP afin de pouvoir déployer facilement ldap01 ldap02 ldap03 ...
- ##SUFFIX## : Le suffix principal ou basedn
- ##PASSWD##: Le password du DirectoryManager
- ##REPLPASSWD## : Le password du ReplicationManager
Déploiement de la PKI
J'ai choisi de limiter le déploiement initial aux services suivants:
- CA: en même temps c'est le cœur du sujet
- OCSP: Afin de fournir en live aux serveurs les statuts des certificats
- KRA: Pour faciliter la gestion des clés
Ce petit ensemble m'a déjà pris plusieurs semaines de tests et recherches pour obtenir un résultat qui me convienne et qui fonctionne ... Vous verrez en bas quelques bugs rencontrés ...
Le certificat racine est externe, signé par une autre CA stockée hors ligne afin de la sécurisée.
Le certificat est importé automatiquement lors du déploiement, il se trouve dans le fichier pki-ecc.p12
avec sa chaine complète.
Description du fichier de déploiement
Variables personnalisées
ldap_host = ldap.exemple.com
ldap_port = 389
secdomain_name = secdomain
secdomain_user = secdomadmin
basedn = dc=pki,dc=exemple.com
pki_dns_domainname = exemple.com
Configuration des certificats
Pour chaque certificats on peut définir les paramètes suivant afin de les customiser comme on veut:
pki_ca_signing_nickname
Alias utilisé dans NSS DB
pki_ca_signing_key_size
Taille de la clé (pour une externe, elle doit aussi correspondre)
- Pour RSA: 1024, 2048, 3072, 4096
- Pour ECC: nitsp256, nitsp384, nitsp521
pki_ca_signing_key_type
Méthode chiffrement utilisée
rsa ou ecc
pki_ca_signing_key_algorithm
Type de signature utilisée pour la clé
pki_ca_signing_signing_algorithm
Encodage utilisée par la clé lorsqu'elle signe un certificat
pki_ca_signing_subject_dn
DN du certificat
Ce qui donne pour un certificat RSA:
pki_transport_nickname = pki_kra_transport
pki_transport_key_size = 2048
pki_transport_key_type = rsa
pki_transport_key_algorithm = SHA512withRSA
pki_transport_signing_algorithm = SHA512withRSA
Et pour un certificat ECC:
pki_audit_signing_nickname = pki_kra_audit_sign
pki_audit_signing_key_size = nistp521
pki_audit_signing_key_type = ecc
pki_audit_signing_key_algorithm = SHA512withEC
pki_audit_signing_signing_algorithm = SHA512withEC
Configuration de l'instance
pki_hostname = pki.exemple.com
pki_https_port = 8443
pki_http_port = 8080
pki_instance_name = pki-tomcat
Configuration des certificats à importer
pki_import_system_certs = True
pki_import_admin_cert = False
Configuration du compte administrateur
pki_admin_uid = caadmin
pki_admin_name = %(pki_admin_uid)s
pki_admin_email = %(pki_admin_name)s@%(pki_dns_domainname)s
pki_admin_nickname = %(pki_admin_uid)s
pki_admin_subject_dn = cn = PKI Admin, o = %(pki_security_domain_name)s
Configuration du domaine de sécurité
pki_security_domain_name = %(secdomain_name)s
pki_security_domain_user = %(secdomain_user)s
Configuration du serveur LDAP
pki_ds_hostname = %(ldap_host)s
pki_ds_ldap_port = %(ldap_port)s
pki_ds_secure_connection = False
pki_ds_base_dn = dc=ca,%(basedn)s
pki_ds_bind_dn = cn=dirman
pki_ds_database = userroot
pki_ds_create_new_db = False
pki_ds_remove_data = True
Configuration du partage d'accès
pki_share_db = True
pki_share_dbuser_dn = uid=pkidbuser, ou=people, dc=ca, %(basedn)s
Configurations propres à la CA
pki_existing = True
pki_random_serial_numbers_enable = True
pki_pkcs12_path = /root/pki-ecc.p12
Import du certificat racine
Comme dit précédemment, mon certificat racine vient d'une autre CA.
Il nous faut donc importer tout ça pour que notre déploiement se passe le mieux possible.
On initialise le stockage de certificats de notre utilisateur local, puis on importe la chaine de la CA dedans.
Attention, vous importerez aussi la clé privé de la CA, pensez à la supprimer ou réinitialiser votre stockage après l'installation !
[root@linux] # | pki client init --force | dblclick to copy |
[root@linux] # | pki pkcs12 import --pkcs12 pki-ecc.p12 --password Secret.123 |
Installation de la CA
[root@linux] # | pkispawn -f ca.cfg -s CA -v | dblclick to copy |
Installation de la KRA
[root@linux] # | pkispawn -f ca.cfg -s KRA -v | dblclick to copy |
Installation d'OCSP
[root@linux] # | pkispawn -f ca.cfg -s OCSP -v | dblclick to copy |
Installation d'ACME
Pour me simplifier l'installation j'ai préconfiguré les 4 fichiers ci-dessous et le script les envoie sur le serveur pendant le déploiement d'ACME.
Fichier database.conf
class=org.dogtagpki.acme.database.DSDatabase
url=ldap://ldap.exemple.com:389
authType=BasicAuth
bindDN=cn=directorymanager
bindPassword=
baseDN=dc=acme,dc=pki,dc=exemple,dc=com
Fichier realm.conf
class=org.dogtagpki.acme.realm.DSRealm
url=ldap://ldap.exemple.com:389
authType=BasicAuth
bindDN=cn=directorymanager
bindPassword=
usersDN=ou=people,dc=ca,dc=pki,dc=exemple,dc=com
groupsDN=ou=groups,dc=ca,dc=pki,dc=exemple,dc=com
Fichier issuer.conf
class=org.dogtagpki.acme.issuer.PKIIssuer
url=https://pki.exemple.com:8443
profile=acmeServerCert
username=
password=
Fichier metadata.conf
termsOfService=https://pki.exemple.com/acme/tos.pdf
website=https://pki.exemple.com
caaIdentities=exemple.com
externalAccountRequired=false
Script d'installation
Le script d'installation va mettre en place les fichiers préconfigurés et initialiser le LDAP avec les fichiers LDIF fournis.
Il nécessite d'avoir un fichier ~/.pwd/directorymanager
contenant le mot de passe du directory manager.
Script de déploiement
DGHOST=pki.exemple.com
INSTANCE=pki-tomcat
LDAPHOST=ldap.exemple.com
LDAPPORT=389
BASEDN=dc=exemple,dc=com
SUFFIX=acme
ssh root@${DGHOST} pki-server acme-create -i ${INSTANCE}
scp *.conf root@${DGHOST}:/etc/pki/${INSTANCE}/acme/
cat <<EOF | ssh root@${DGHOST} 'bash'
[copier le contenu de tmp.sh ici ]
EOF
Script tmp.sh |
---|
cat /etc/pki/${INSTANCE}/acme/database/ds/schema.ldif {{!}} ldapadd -H ldap://${LDAPHOST}:${LDAPPORT} -D cn=directorymanager -y ~/.pwd/directorymanager -c -x
cat /etc/pki/${INSTANCE}/acme/database/ds/create.ldif {{!}} sed -e "s/dc=example,dc=com/${BASEDN}/" \
-e 's/{instanceId}/${INSTANCE}/g' \
-e "s/{database}/userroot/" \
-e "s/{rootSuffix}/dc=${SUFFIX},dc=pki,${BASEDN}/" {{!}}ldapadd -H ldap://${LDAPHOST}:${LDAPPORT} -D cn=directorymanager -y ~/.pwd/directorymanager -c -x
cat /etc/pki/${INSTANCE}/acme/realm/ds/create.ldif {{!}} sed -e "s/dc=example,dc=com/${BASEDN}/" \
-e 's/{instanceId}/${INSTANCE}/g' \
-e "s/{database}/userroot/" \
-e "s/{rootSuffix}/dc=${SUFFIX},dc=pki,${BASEDN}/" {{!}}ldapadd -H ldap://${LDAPHOST}:${LDAPPORT} -D cn=directorymanager -y ~/.pwd/directorymanager -c -x
cat /etc/pki/${INSTANCE}/acme/database/ds/index.ldif {{!}} sed -e "s/dc=example,dc=com/${BASEDN}/" \
-e 's/{instanceId}/${INSTANCE}/g' \
-e "s/{database}/userroot/" \
-e "s/{rootSuffix}/dc=${SUFFIX},dc=pki,${BASEDN}/" {{!}}ldapadd -H ldap://${LDAPHOST}:${LDAPPORT} -D cn=directorymanager -y ~/.pwd/directorymanager -c -x
cat /etc/pki/${INSTANCE}/acme/database/ds/indextask.ldif {{!}} sed -e "s/dc=example,dc=com/${BASEDN}/" \
-e 's/{instanceId}/${INSTANCE}/g' \
-e "s/{database}/userroot/" \
-e "s/{rootSuffix}/dc=${suffix},dc=pki,${BASEDN}/" {{!}}ldapadd -H ldap://${LDAPHOST}:${LDAPPORT} -D cn=directorymanager -y ~/.pwd/directorymanager -c -x
pki-server acme-deploy -i ${INSTANCE}
|
Fichier de déploiement de la PKI
J'ai pris le parti d'un fichier unique car j'ai écris un script de déploiement automatique pour m'éviter l'internement à force de réinstallation, mais vous pouvez tout aussi bien le séparer.
Fichier de déploiement - ca.cfg |
---|
[DEFAULT]
pki_hostname = pki.exemple.com
pki_https_port = 8443
pki_http_port = 8080
pki_security_domain_name = %(secdomain_name)s
pki_security_domain_user = caadmin
pki_instance_name = pki-tomcat
conf_company_name = EXEMPLE
pki_ds_password =
pki_admin_password =
pki_security_domain_password =
pki_client_database_password =
pki_client_pkcs12_password =
pki_token_password =
pki_pkcs12_password =
ldap_host = ldap.exemple.com
ldap_port = 389
secdomain_name = secdomain
secdomain_user = secdomadmin
basedn = dc=pki,dc=exemple.com
pki_dns_domainname = exemple.com
[CA]
pki_existing = True
pki_import_system_certs = True
pki_import_admin_cert = False
pki_admin_uid = caadmin
pki_admin_name = %(pki_admin_uid)s
pki_admin_email = %(pki_admin_name)s@%(pki_dns_domainname)s
pki_admin_nickname = caadmin
pki_admin_subject_dn = cn = PKI Admin, o = %(pki_security_domain_name)s
pki_security_domain_name = %(secdomain_name)s
pki_security_domain_user = %(secdomain_user)s
pki_ds_hostname = %(ldap_host)s
pki_ds_ldap_port = %(ldap_port)s
pki_ds_secure_connection = False
pki_ds_base_dn = dc=ca,%(basedn)s
pki_ds_bind_dn = cn = dirman
pki_ds_database = userroot
pki_share_db = True
pki_share_dbuser_dn = uid=pkidbuser,ou=people, dc=ca, %(basedn)s
pki_ds_create_new_db = False
pki_ds_remove_data = True
pki_random_serial_numbers_enable = True
pki_pkcs12_path = /root/pki-ecc.p12
#================================================
pki_ca_signing_nickname = pki_root_ca
pki_ca_signing_key_size = nistp384
pki_ca_signing_key_type = ecc
pki_ca_signing_key_algorithm = SHA384withEC
pki_ca_signing_signing_algorithm = SHA384withEC
pki_sslserver_nickname = pki_ssl_server
pki_sslserver_key_size = nistp256
pki_sslserver_key_type = ecc
pki_sslserver_key_algorithm = SHA256withEC
pki_sslserver_signing_algorithm = SHA256withEC
pki_subsystem_nickname = pki_subsystem
pki_subsystem_key_size = nistp256
pki_subsystem_key_type = ecc
pki_subsystem_key_algorithm = SHA256withEC
pki_subsystem_signing_algorithm = SHA256withEC
#================================================
pki_audit_signing_nickname = pki_ca_audit_sign
pki_audit_signing_key_size = nistp521
pki_audit_signing_key_type = ecc
pki_audit_signing_key_algorithm = SHA512withEC
pki_audit_signing_signing_algorithm = SHA512withEC
pki_ocsp_signing_nickname = pki_ca_ocsp_sign
pki_ocsp_signing_key_size = nistp521
pki_ocsp_signing_key_type = ecc
pki_ocsp_signing_key_algorithm = SHA512withEC
pki_ocsp_signing_signing_algorithm = SHA512withEC
[OCSP]
pki_import_system_certs = True
pki_import_admin_cert = True
pki_ds_hostname = %(ldap_host)s
pki_ds_ldap_port = %(ldap_port)s
pki_ds_secure_connection = False
pki_ds_base_dn = dc=ocsp,%(basedn)s
pki_ds_bind_dn = cn = dirman
pki_ds_database = userroot
pki_ds_create_new_db = False
pki_ds_remove_data = True
pki_share_db = True
pki_share_dbuser_dn = uid=pkidbuser,ou=people, dc=ca, %(basedn)s
pki_admin_uid = ocspadmin
pki_admin_name = %(pki_admin_uid)s
pki_admin_email = %(pki_admin_name)s@%(pki_dns_domainname)s
pki_admin_nickname = ocspadmin
pki_security_domain_name = %(domain_name)s
pki_security_domain_user = %(secdomain_user)s
#================================================
pki_ca_signing_nickname = pki_root_ca
pki_ca_signing_key_size = nistp384
pki_ca_signing_key_type = ecc
pki_ca_signing_key_algorithm = SHA384withEC
pki_ca_signing_signing_algorithm = SHA384withEC
pki_sslserver_nickname = pki_ssl_server
pki_sslserver_key_size = nistp256
pki_sslserver_key_type = ecc
pki_sslserver_key_algorithm = SHA256withEC
pki_sslserver_signing_algorithm = SHA256withEC
pki_subsystem_nickname = pki_subsystem
pki_subsystem_key_size = nistp256
pki_subsystem_key_type = ecc
pki_subsystem_key_algorithm = SHA256withEC
pki_subsystem_signing_algorithm = SHA256withEC
#================================================
pki_audit_signing_nickname = pki_ocsp_audit_sign
pki_audit_signing_key_size = nistp521
pki_audit_signing_key_type = ecc
pki_audit_signing_key_algorithm = SHA512withEC
pki_audit_signing_signing_algorithm = SHA512withEC
pki_ocsp_signing_nickname = pki_ocsp_sign
pki_ocsp_signing_key_size = nistp521
pki_ocsp_signing_key_type = ecc
pki_ocsp_signing_key_algorithm = SHA512withEC
pki_ocsp_signing_signing_algorithm = SHA512withEC
[KRA]
pki_import_system_certs = True
pki_import_admin_cert = True
pki_admin_uid = kraadmin
pki_admin_name = %(pki_admin_uid)s
pki_admin_email = %(pki_admin_name)s@%(pki_dns_domainname)s
pki_admin_nickname = kraadmin
pki_ds_hostname = %(ldap_host)s
pki_ds_ldap_port = %(ldap_port)s
pki_ds_secure_connection = False
pki_ds_bind_dn = cn = dirman
pki_ds_base_dn = dc=kra,%(basedn)s
pki_ds_database = userroot
pki_ds_create_new_db = False
pki_ds_remove_data = True
pki_share_db = True
pki_share_dbuser_dn = uid=pkidbuser,ou=people, dc=ca, %(basedn)s
pki_security_domain_name = %(domain_name)s
pki_security_domain_user = %(secdomain_user)s
#================================================
pki_ca_signing_nickname = pki_root_ca
pki_ca_signing_key_size = nistp521
pki_ca_signing_key_type = ecc
pki_ca_signing_key_algorithm = SHA512withEC
pki_ca_signing_signing_algorithm = SHA512withEC
pki_sslserver_nickname = pki_ssl_server
pki_sslserver_key_size = nistp521
pki_sslserver_key_type = ecc
pki_sslserver_key_algorithm = SHA256withEC
pki_sslserver_signing_algorithm = SHA256withEC
pki_subsystem_nickname = pki_subsystem
pki_subsystem_key_size = nistp521
pki_subsystem_key_type = ecc
pki_subsystem_key_algorithm = SHA256withEC
pki_subsystem_signing_algorithm = SHA256withEC
#================================================
pki_storage_nickname = pki_kra_storage
pki_storage_key_size = 2048
pki_storage_key_type = rsa
pki_storage_key_algorithm = SHA512withRSA
pki_storage_signing_algorithm = SHA512withRSA
pki_transport_nickname = pki_kra_transport
pki_transport_key_size = 2048
pki_transport_key_type = rsa
pki_transport_key_algorithm = SHA512withRSA
pki_transport_signing_algorithm = SHA512withRSA
#================================================
pki_audit_signing_nickname = pki_kra_audit_sign
pki_audit_signing_key_size = nistp521
pki_audit_signing_key_type = ecc
pki_audit_signing_key_algorithm = SHA512withEC
pki_audit_signing_signing_algorithm = SHA512withEC
pki_ocsp_signing_nickname = pki_kra_ocsp_sign
pki_ocsp_signing_key_size = nistp521
pki_ocsp_signing_key_type = ecc
pki_ocsp_signing_key_algorithm = SHA512withEC
pki_ocsp_signing_signing_algorithm = SHA512withEC
|
Configuration de la CA
Création d'un compte administrateur supplémentaire
pk12util -i .dogtag/dg-pki/ca_admin_cert.p12 -d .dogtag/nssdb/
alias pki='\pki -n caadmin'
pki ca user add admin2 --fullName "Second Admin"
pki kra user add admin2 --fullName "Second Admin"
pki ocsp user add admin2 --fullName "Second Admin"
pki ca group member add "Administrators" admin2
pki ca group member add "Enterprise OCSP Administrators" admin2
pki ca group member add "Enterprise KRA Administrators" admin2
pki ca group member add "Enterprise CA Administrators" admin2
pki ca group member add "Certificate Manager Agents" admin2
pki ocsp group member add "Online Certificate Status Manager Agents" admin2
pki kra group member add "Data Recovery Manager Agents" admin2
Ajout de profils supplémentaires
Pour ajouter un profil, il y a plusieurs informations à ajouter:
- D'abord importer le fichier, le placer dans
/etc/pki/pki-dogtag/ca/profiles/ca/
- Déclarer le profil dans le fichier CS.cfg en ajoutant les lignes suivantes:
profile.[profilename].class_id=caEnrollImpl
profile.[profilename].config=/var/lib/pki/dogtag-pki/ca/profiles/ca/[profilename].cfg
- Ajouter dans la liste située dans CS.cfg ce nouveau profil (la place dans la liste fait la place sur l'interface web
profile.list=[profilename],[...]
Publication des certificats dans LDAP
Voici les entrées modifiées dans /etc/pki/pki-dogtag/ca/CS.cfg
pour activer la publication des certificats dans le LDAP.
Publication de la CRL au démarrage:
ca.crl.MasterCRL.publishOnStart=true
Cette option est obligatoire pour que la règle LdapCrlRule fonctionne:
ca.publish.createOwnDNEntry=true
Pour activer les règles il faut passer à true les variables de configurations suivantes:
ca.publish.rule.instance.LdapCaCertRule.enable=true
ca.publish.rule.instance.LdapCrlRule.enable=true
ca.publish.rule.instance.LdapUserCertRule.enable=true
ca.publish.rule.instance.LdapXCertRule.enable=true
ca.publish.rule.instance.ocsprule-[...]-8443.enable=true
Pour activer toutes les règles un petit coup de sed suffit
[root@linux] # | sed -i -r 's/(ca\.publish\.rule\.instance\.[^.]*\.enable=)false/\1true/' /etc/pki/pki-dogtag/ca/CS.cfg | dblclick to copy |
Configuration de SCEP
Pour SCEP j'ai cherché pendant un bon moment pour le faire fonctionner (et je cherche encore a comprendre pourquoi il bug avec iLO ...)
Mais pour l'activer il suffit de modifier les options suivantes:
ca.scep.enable=true
Vous pouvez modifier les algorithms avec les options suivantes:
ca.scep.allowedEncryptionAlgorithms=DES3
ca.scep.allowedHashAlgorithms=SHA256,SHA512
ca.scep.encryptionAlgorithm=DES3
ca.scep.hashAlgorithm=SHA256
ca.scep.nonceSizeLimit=16
Puis il faut surtout corriger le bug voir SCEP: le listener qui ne fonctionne pas
Notifications par email
Configurer le serveur SMTP à utiliser dans ca/CS.cfg:
smtp.host=smtp.exemple.com smtp.port=25
Installation de certmonger sur un client
Création d'un compte pour certmonger
Ce script créra automatiquement un utilisateur certmonger avec les droits nécessaires ainsi que son certificat.
#!/usr/bin/env bash
PASSWD=123456
pki ca user add certmonger --fullName "Certmonger Agent"
pki ca group member add "Certificate Manager Agents" certmonger
REQ=$(pki client-cert-request UID=certmonger --curve nitsp384 | grep 'Request ID:' | awk -F: '{print $2}')
SERIAL=$(pki ca-cert request approve ${REQ} --force | grep 'Certificate ID:' | awk -F: '{print $2}')
pki ca user cert add certmonger --serial ${SERIAL}
pki client-cert-import certmonger --serial ${SERIAL}
pki pkcs12-cert-import certmonger --pkcs12-file certmonger.p12 --pkcs12-password ${PASSWD}
Configuration de la CA dans certmonger
Là je vous mets directement mon script, il est assez simple mais très efficace.
deploy_certmonger.sh |
---|
#!/usr/bin/env bash
host=$1
CERT=certmonger.p12
ssh pki.exemple.com 'certutil -d /etc/pki/pki-tomcat/alias/ -L -n root_ca -a' > root_ca.pem
ssh pki.exemple.com 'certutil -d /etc/pki/pki-tomcat/alias/ -L -n pki_root_ca -a' > pki_root_ca.pem
openssl pkcs12 -in ${CERT} -passin pass:Secret.123 -nodes -nocerts > pkiadmin.key
openssl pkcs12 -in ${CERT} -passin pass:Secret.123 -nokeys > pkiadmin.pem
scp ${CERT} root_ca.pem pki_root_ca.pem pkiadmin.key pkiadmin.pem pwdfile.txt ${host}:
ssh ${host} 'mkdir -p $HOME/.dogtag/getcert'
cat <<"EOF" | ssh $host 'cat > /tmp/sh; sh /tmp/sh; rm -f /tmp/sh'
mv root_ca.pem pki_root_ca.pem /etc/pki/ca-trust/source/anchors/
mv pkiadmin.key $HOME/.dogtag/getcert/pkiadmin.key
mv pkiadmin.pem $HOME/.dogtag/getcert/pkiadmin.pem
chmod 400 $HOME/.dogtag/getcert/pkiadmin.key
chmod 644 $HOME/.dogtag/getcert/pkiadmin.pem
update-ca-trust
getcert add-ca -c dogtag -e '/usr/libexec/certmonger/dogtag-submit -c /root/.dogtag/getcert/pkiadmin.pem -k /root/.dogtag/getcert/pkiadmin.key -E https://pki.exemple.com:8443/ca/ee/ca -A https://pki.exemple.com:8443/ca/agent/ca -T caAgentServerCertWithAltName -a'
EOF
|
Exemple: Requête de certificat
Requérir un certificat qui sera placé en deux fichiers (clé et certificat)
[root@linux] # | getcert request -f certificate.cert -k certificate.key -D $(hostname) -D $(hostname -s) -c dogtag -I $(hostname -s) | dblclick to copy |
Requérir un certificat qui sera placé dans une DB NSS
[root@linux] # | getcert request -c dogtag -d nssdb -n $(hostname -s) -p /etc/dirsrv/slapd-dogtag/pwdfile.txt -I $(hostname -s) -D $(hostname) -D $(hostname -s) | dblclick to copy |
Mise en place d'un proxy apache
Afin de sécuriser un peu plus notre PKI, on va empêcher les accès directs à la machine. Pour la partie web on va donc mettre en place un proxy Apache devant.
Il devra:
- Transmettre l'authentification par certificats
- Fournir une connexion sécurisée HTTPS
- Communiquer de façon sécurisée avec la PKI
Donc pour répondre au mieux à tout ça:
- Pour la communication entre le proxy et la PKI on utiilisera AJP avec un shared secret.
- On forcera la navigation HTTPS
- On mettra en place l'identification par certificats directement sur le proxy qui transmettra à la PKI
Fichier de configuration du vhost SSL
Configuration de base du vhost SSL |
---|
<VirtualHost *:443>
ServerName pki.exemple.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/letsencrypt/live/pki.exemple.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/pki.exemple.com/privkey.pem
SSLCompression Off
ServerSignature Off
AllowEncodedSlashes On
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
CustomLog logs/pki.log combined
ErrorLog logs/pki_error.log
|
On va ajouter une exception pour permettre le fonctionnement de certbot:
Alias /.well-known/acme-challenge /var/www/acme/
ProxyPass /.well-known/acme-challenge/ !
Ajout de l'authentification par certificats:
SSLCACertificateFile cabundle.pem
SSLVerifyClient optional
SSLVerifyDepth 2
SSLOptions +ExportCertData +StdEnvVars
Pour autoriser l'accès le certificat doit contenir un champs Organisation avec pour valeur OurOrganisation
<Location />
SSLRequire ( %{SSL_CLIENT_S_DN_O} eq "OurOrganisation" )
</Location>
Le proxy AJP
ProxyPass / ajp://192.168.0.X:8009/ secret=sharedSecret
ProxyPassReverse / ajp://192.168.0.X:8009/ secret=sharedSecret
Et on ferme tout !
</VirtualHost>
Configuration de Tomcat
Du côté de Tomcat pour la PKI la configuration sera très rapide.
Il faut modifier le fichier /etc/pki/dg-pki/server.xml
Décommenter le connecteur AJP:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" address="pki.exemple.com" secret="sharedSecret" name="Connector1"/>
Et dans le fichier /etc/pki/dg-pki/ca/CS.cfg
Modifier les lignes suivantes pour ajouter le port:
proxy.securePort=8009
proxy.unsecurePort=
Profils de certificats personnalisés
J'ai créé ou modifié quelques profils pour répondre à mes besoins, je vous mets les versions RSA pour les intéressés.
caAgentServerCertAltName
Ce profil permet de créer via un agent un certificat qui reprendra le champs subjectAltNames de la requête.
caAgentServerCertAltName.cfg |
---|
desc=This certificate profile is for enrolling server certificates with agent authentication and alt names from request.
visible=true
enable=true
enableBy=admin
auth.instance_id=AgentCertAuth
name=Agent-Authenticated Server Certificate Enrollment with Alternative Names from request
input.list=i1,i2
input.i1.class_id=certReqInputImpl
input.i2.class_id=submitterInfoInputImpl
output.list=o1
output.o1.class_id=certOutputImpl
policyset.list=serverCertSet
policyset.serverCertSet.list=1,2,3,4,5,6,7,8,11,12
policyset.serverCertSet.1.constraint.class_id=subjectNameConstraintImpl
policyset.serverCertSet.1.constraint.name=Subject Name Constraint
policyset.serverCertSet.1.constraint.params.pattern=CN=.*
policyset.serverCertSet.1.constraint.params.accept=true
policyset.serverCertSet.1.default.class_id=userSubjectNameDefaultImpl
policyset.serverCertSet.1.default.name=Subject Name Default
policyset.serverCertSet.1.default.params.name=
policyset.serverCertSet.2.constraint.class_id=validityConstraintImpl
policyset.serverCertSet.2.constraint.name=Validity Constraint
policyset.serverCertSet.2.constraint.params.range=365
policyset.serverCertSet.2.constraint.params.notBeforeCheck=false
policyset.serverCertSet.2.constraint.params.notAfterCheck=false
policyset.serverCertSet.2.default.class_id=validityDefaultImpl
policyset.serverCertSet.2.default.name=Validity Default
policyset.serverCertSet.2.default.params.range=90
policyset.serverCertSet.2.default.params.startTime=0
policyset.serverCertSet.3.constraint.class_id=keyConstraintImpl
policyset.serverCertSet.3.constraint.name=Key Constraint
policyset.serverCertSet.3.constraint.params.keyType=RSA
policyset.serverCertSet.3.constraint.params.keyParameters=1024,2048,3072,4096
policyset.serverCertSet.3.default.class_id=userKeyDefaultImpl
policyset.serverCertSet.3.default.name=Key Default
policyset.serverCertSet.4.constraint.class_id=noConstraintImpl
policyset.serverCertSet.4.constraint.name=No Constraint
policyset.serverCertSet.4.default.class_id=authorityKeyIdentifierExtDefaultImpl
policyset.serverCertSet.4.default.name=Authority Key Identifier Default
policyset.serverCertSet.5.constraint.class_id=noConstraintImpl
policyset.serverCertSet.5.constraint.name=No Constraint
policyset.serverCertSet.5.default.class_id=authInfoAccessExtDefaultImpl
policyset.serverCertSet.5.default.name=AIA Extension Default
policyset.serverCertSet.5.default.params.authInfoAccessADEnable_0=true
policyset.serverCertSet.5.default.params.authInfoAccessADLocationType_0=URIName
policyset.serverCertSet.5.default.params.authInfoAccessADLocation_0=
policyset.serverCertSet.5.default.params.authInfoAccessADMethod_0=1.3.6.1.5.5.7.48.1
policyset.serverCertSet.5.default.params.authInfoAccessCritical=false
policyset.serverCertSet.5.default.params.authInfoAccessNumADs=1
policyset.serverCertSet.6.constraint.class_id=keyUsageExtConstraintImpl
policyset.serverCertSet.6.constraint.name=Key Usage Extension Constraint
policyset.serverCertSet.6.constraint.params.keyUsageCritical=true
policyset.serverCertSet.6.constraint.params.keyUsageDigitalSignature=true
policyset.serverCertSet.6.constraint.params.keyUsageNonRepudiation=false
policyset.serverCertSet.6.constraint.params.keyUsageDataEncipherment=true
policyset.serverCertSet.6.constraint.params.keyUsageKeyEncipherment=true
policyset.serverCertSet.6.constraint.params.keyUsageKeyAgreement=false
policyset.serverCertSet.6.constraint.params.keyUsageKeyCertSign=false
policyset.serverCertSet.6.constraint.params.keyUsageCrlSign=false
policyset.serverCertSet.6.constraint.params.keyUsageEncipherOnly=false
policyset.serverCertSet.6.constraint.params.keyUsageDecipherOnly=false
policyset.serverCertSet.6.default.class_id=keyUsageExtDefaultImpl
policyset.serverCertSet.6.default.name=Key Usage Default
policyset.serverCertSet.6.default.params.keyUsageCritical=true
policyset.serverCertSet.6.default.params.keyUsageDigitalSignature=true
policyset.serverCertSet.6.default.params.keyUsageNonRepudiation=false
policyset.serverCertSet.6.default.params.keyUsageDataEncipherment=true
policyset.serverCertSet.6.default.params.keyUsageKeyEncipherment=true
policyset.serverCertSet.6.default.params.keyUsageKeyAgreement=false
policyset.serverCertSet.6.default.params.keyUsageKeyCertSign=false
policyset.serverCertSet.6.default.params.keyUsageCrlSign=false
policyset.serverCertSet.6.default.params.keyUsageEncipherOnly=false
policyset.serverCertSet.6.default.params.keyUsageDecipherOnly=false
policyset.serverCertSet.7.constraint.class_id=noConstraintImpl
policyset.serverCertSet.7.constraint.name=No Constraint
policyset.serverCertSet.7.default.class_id=extendedKeyUsageExtDefaultImpl
policyset.serverCertSet.7.default.name=Extended Key Usage Extension Default
policyset.serverCertSet.7.default.params.exKeyUsageCritical=false
policyset.serverCertSet.7.default.params.exKeyUsageOIDs=1.3.6.1.5.5.7.3.1
policyset.serverCertSet.8.constraint.class_id=signingAlgConstraintImpl
policyset.serverCertSet.8.constraint.name=No Constraint
policyset.serverCertSet.8.constraint.params.signingAlgsAllowed=SHA256withRSA,SHA512withRSA,SHA256withEC,SHA384withRSA,SHA384withEC,SHA512withEC,SHA256withRSA/PSS,SHA384withRSA/PSS,SHA512withRSA/PSS
policyset.serverCertSet.8.default.class_id=signingAlgDefaultImpl
policyset.serverCertSet.8.default.name=Signing Alg
policyset.serverCertSet.8.default.params.signingAlg=-
policyset.serverCertSet.11.constraint.class_id=noConstraintImpl
policyset.serverCertSet.11.constraint.name=No Constraint
policyset.serverCertSet.11.default.class_id=userExtensionDefaultImpl
policyset.serverCertSet.11.default.name=User supplied extension in CSR
policyset.serverCertSet.11.default.params.userExtOID=2.5.29.17
policyset.serverCertSet.11.default.params.subjAltNameExtCritical=false
policyset.serverCertSet.12.constraint.class_id=noConstraintImpl
policyset.serverCertSet.12.constraint.name=No Constraint
policyset.serverCertSet.12.default.class_id=commonNameToSANDefaultImpl
policyset.serverCertSet.12.default.name=Copy Common Name to Subject Alternative Name Extension
|
caAgentDualCert
Pratiquement comme le précédent à ceci près qu'il est client ET serveur.
caAgentDualCert.cfg |
---|
desc=This certificate profile is for enrolling server certificates for dual use with agent authentication take alt names from request.
visible=true
enable=true
enableBy=admin
auth.instance_id=AgentCertAuth
name=Agent-Authenticated Dual Use (Server/Client) Certificate Enrollment with Alternative Names from request
input.list=i1,i2
input.i1.class_id=certReqInputImpl
input.i2.class_id=submitterInfoInputImpl
output.list=o1
output.o1.class_id=certOutputImpl
policyset.list=serverCertSet
policyset.serverCertSet.list=1,2,3,4,5,6,7,8,11,12
policyset.serverCertSet.1.constraint.class_id=subjectNameConstraintImpl
policyset.serverCertSet.1.constraint.name=Subject Name Constraint
policyset.serverCertSet.1.constraint.params.pattern=.*UID=.*
policyset.serverCertSet.1.constraint.params.accept=true
policyset.serverCertSet.1.default.class_id=userSubjectNameDefaultImpl
policyset.serverCertSet.1.default.name=Subject Name Default
policyset.serverCertSet.1.default.params.name=
policyset.serverCertSet.2.constraint.class_id=validityConstraintImpl
policyset.serverCertSet.2.constraint.name=Validity Constraint
policyset.serverCertSet.2.constraint.params.range=365
policyset.serverCertSet.2.constraint.params.notBeforeCheck=false
policyset.serverCertSet.2.constraint.params.notAfterCheck=false
policyset.serverCertSet.2.default.class_id=validityDefaultImpl
policyset.serverCertSet.2.default.name=Validity Default
policyset.serverCertSet.2.default.params.range=180
policyset.serverCertSet.2.default.params.startTime=0
policyset.serverCertSet.3.constraint.class_id=keyConstraintImpl
policyset.serverCertSet.3.constraint.name=Key Constraint
policyset.serverCertSet.3.constraint.params.keyType=RSA
policyset.serverCertSet.3.constraint.params.keyParameters=1024,2048,3072,4096
policyset.serverCertSet.3.default.class_id=userKeyDefaultImpl
policyset.serverCertSet.3.default.name=Key Default
policyset.serverCertSet.4.constraint.class_id=noConstraintImpl
policyset.serverCertSet.4.constraint.name=No Constraint
policyset.serverCertSet.4.default.class_id=authorityKeyIdentifierExtDefaultImpl
policyset.serverCertSet.4.default.name=Authority Key Identifier Default
policyset.serverCertSet.5.constraint.class_id=noConstraintImpl
policyset.serverCertSet.5.constraint.name=No Constraint
policyset.serverCertSet.5.default.class_id=authInfoAccessExtDefaultImpl
policyset.serverCertSet.5.default.name=AIA Extension Default
policyset.serverCertSet.5.default.params.authInfoAccessADEnable_0=true
policyset.serverCertSet.5.default.params.authInfoAccessADLocationType_0=URIName
policyset.serverCertSet.5.default.params.authInfoAccessADLocation_0=
policyset.serverCertSet.5.default.params.authInfoAccessADMethod_0=1.3.6.1.5.5.7.48.1
policyset.serverCertSet.5.default.params.authInfoAccessCritical=false
policyset.serverCertSet.5.default.params.authInfoAccessNumADs=1
policyset.serverCertSet.6.constraint.class_id=keyUsageExtConstraintImpl
policyset.serverCertSet.6.constraint.name=Key Usage Extension Constraint
policyset.serverCertSet.6.constraint.params.keyUsageCritical=true
policyset.serverCertSet.6.constraint.params.keyUsageDigitalSignature=true
policyset.serverCertSet.6.constraint.params.keyUsageNonRepudiation=false
policyset.serverCertSet.6.constraint.params.keyUsageDataEncipherment=true
policyset.serverCertSet.6.constraint.params.keyUsageKeyEncipherment=true
policyset.serverCertSet.6.constraint.params.keyUsageKeyAgreement=false
policyset.serverCertSet.6.constraint.params.keyUsageKeyCertSign=false
policyset.serverCertSet.6.constraint.params.keyUsageCrlSign=false
policyset.serverCertSet.6.constraint.params.keyUsageEncipherOnly=false
policyset.serverCertSet.6.constraint.params.keyUsageDecipherOnly=false
policyset.serverCertSet.6.default.class_id=keyUsageExtDefaultImpl
policyset.serverCertSet.6.default.name=Key Usage Default
policyset.serverCertSet.6.default.params.keyUsageCritical=true
policyset.serverCertSet.6.default.params.keyUsageDigitalSignature=true
policyset.serverCertSet.6.default.params.keyUsageNonRepudiation=false
policyset.serverCertSet.6.default.params.keyUsageDataEncipherment=true
policyset.serverCertSet.6.default.params.keyUsageKeyEncipherment=true
policyset.serverCertSet.6.default.params.keyUsageKeyAgreement=false
policyset.serverCertSet.6.default.params.keyUsageKeyCertSign=false
policyset.serverCertSet.6.default.params.keyUsageCrlSign=false
policyset.serverCertSet.6.default.params.keyUsageEncipherOnly=false
policyset.serverCertSet.6.default.params.keyUsageDecipherOnly=false
policyset.serverCertSet.7.constraint.class_id=noConstraintImpl
policyset.serverCertSet.7.constraint.name=No Constraint
policyset.serverCertSet.7.default.class_id=extendedKeyUsageExtDefaultImpl
policyset.serverCertSet.7.default.name=Extended Key Usage Extension Default
policyset.serverCertSet.7.default.params.exKeyUsageCritical=true
policyset.serverCertSet.7.default.params.exKeyUsageOIDs=1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.4
policyset.serverCertSet.8.constraint.class_id=signingAlgConstraintImpl
policyset.serverCertSet.8.constraint.name=No Constraint
policyset.serverCertSet.8.constraint.params.signingAlgsAllowed=SHA256withRSA,SHA512withRSA,SHA256withEC,SHA384withRSA,SHA384withEC,SHA512withEC,SHA256withRSA/PSS,SHA384withRSA/PSS,SHA512withRSA/PSS
policyset.serverCertSet.8.default.class_id=signingAlgDefaultImpl
policyset.serverCertSet.8.default.name=Signing Alg
policyset.serverCertSet.8.default.params.signingAlg=-
policyset.serverCertSet.11.constraint.class_id=noConstraintImpl
policyset.serverCertSet.11.constraint.name=No Constraint
policyset.serverCertSet.11.default.class_id=userExtensionDefaultImpl
policyset.serverCertSet.11.default.name=User supplied extension in CSR
policyset.serverCertSet.11.default.params.userExtOID=2.5.29.17
policyset.serverCertSet.11.default.params.subjAltNameExtCritical=false
policyset.serverCertSet.12.constraint.class_id=noConstraintImpl
policyset.serverCertSet.12.constraint.name=No Constraint
policyset.serverCertSet.12.default.class_id=commonNameToSANDefaultImpl
policyset.serverCertSet.12.default.name=Copy Common Name to Subject Alternative Name Extension
|
caUserCert
Dans ce certificat je n'ai fais que modifier la contrainte pour le sujet, afin d'autoriser que le champs UID ne soit pas forcément le premier
caUserCert.cfg |
---|
desc=This certificate profile is for enrolling user certificates.
visible=true
enable=true
enableBy=admin
name=Manual User Dual-Use Certificate Enrollment
auth.class_id=
input.list=i4,i3
input.i1.class_id=keyGenInputImpl
input.i2.class_id=subjectNameInputImpl
input.i3.class_id=submitterInfoInputImpl
input.i4.class_id=certReqInputImpl
output.list=o1
output.o1.class_id=certOutputImpl
policyset.list=userCertSet
policyset.userCertSet.list=1,10,2,3,4,5,6,7,8,9
policyset.userCertSet.1.constraint.class_id=subjectNameConstraintImpl
policyset.userCertSet.1.constraint.name=Subject Name Constraint
policyset.userCertSet.1.constraint.params.pattern=.*UID=.*
policyset.userCertSet.1.constraint.params.accept=true
policyset.userCertSet.1.default.class_id=userSubjectNameDefaultImpl
policyset.userCertSet.1.default.name=Subject Name Default
policyset.userCertSet.1.default.params.name=$request.req_subject_name$
policyset.userCertSet.10.constraint.class_id=renewGracePeriodConstraintImpl
policyset.userCertSet.10.constraint.name=Renewal Grace Period Constraint
policyset.userCertSet.10.constraint.params.renewal.graceBefore=30
policyset.userCertSet.10.constraint.params.renewal.graceAfter=30
policyset.userCertSet.10.default.class_id=noDefaultImpl
policyset.userCertSet.10.default.name=No Default
policyset.userCertSet.2.constraint.class_id=validityConstraintImpl
policyset.userCertSet.2.constraint.name=Validity Constraint
policyset.userCertSet.2.constraint.params.range=90
policyset.userCertSet.2.constraint.params.notBeforeCheck=false
policyset.userCertSet.2.constraint.params.notAfterCheck=false
policyset.userCertSet.2.default.class_id=validityDefaultImpl
policyset.userCertSet.2.default.name=Validity Default
policyset.userCertSet.2.default.params.range=180
policyset.userCertSet.2.default.params.startTime=0
policyset.userCertSet.3.constraint.class_id=keyConstraintImpl
policyset.userCertSet.3.constraint.name=Key Constraint
policyset.userCertSet.3.constraint.params.keyType=RSA
policyset.userCertSet.3.constraint.params.keyParameters=1024,2048,3072,4096
policyset.userCertSet.3.default.class_id=userKeyDefaultImpl
policyset.userCertSet.3.default.name=Key Default
policyset.userCertSet.4.constraint.class_id=noConstraintImpl
policyset.userCertSet.4.constraint.name=No Constraint
policyset.userCertSet.4.default.class_id=authorityKeyIdentifierExtDefaultImpl
policyset.userCertSet.4.default.name=Authority Key Identifier Default
policyset.userCertSet.5.constraint.class_id=noConstraintImpl
policyset.userCertSet.5.constraint.name=No Constraint
policyset.userCertSet.5.default.class_id=authInfoAccessExtDefaultImpl
policyset.userCertSet.5.default.name=AIA Extension Default
policyset.userCertSet.5.default.params.authInfoAccessADEnable_0=true
policyset.userCertSet.5.default.params.authInfoAccessADLocationType_0=URIName
policyset.userCertSet.5.default.params.authInfoAccessADLocation_0=
policyset.userCertSet.5.default.params.authInfoAccessADMethod_0=1.3.6.1.5.5.7.48.1
policyset.userCertSet.5.default.params.authInfoAccessCritical=false
policyset.userCertSet.5.default.params.authInfoAccessNumADs=1
policyset.userCertSet.6.constraint.class_id=keyUsageExtConstraintImpl
policyset.userCertSet.6.constraint.name=Key Usage Extension Constraint
policyset.userCertSet.6.constraint.params.keyUsageCritical=true
policyset.userCertSet.6.constraint.params.keyUsageDigitalSignature=true
policyset.userCertSet.6.constraint.params.keyUsageNonRepudiation=true
policyset.userCertSet.6.constraint.params.keyUsageDataEncipherment=false
policyset.userCertSet.6.constraint.params.keyUsageKeyEncipherment=true
policyset.userCertSet.6.constraint.params.keyUsageKeyAgreement=false
policyset.userCertSet.6.constraint.params.keyUsageKeyCertSign=false
policyset.userCertSet.6.constraint.params.keyUsageCrlSign=false
policyset.userCertSet.6.constraint.params.keyUsageEncipherOnly=false
policyset.userCertSet.6.constraint.params.keyUsageDecipherOnly=false
policyset.userCertSet.6.default.class_id=keyUsageExtDefaultImpl
policyset.userCertSet.6.default.name=Key Usage Default
policyset.userCertSet.6.default.params.keyUsageCritical=true
policyset.userCertSet.6.default.params.keyUsageDigitalSignature=true
policyset.userCertSet.6.default.params.keyUsageNonRepudiation=true
policyset.userCertSet.6.default.params.keyUsageDataEncipherment=false
policyset.userCertSet.6.default.params.keyUsageKeyEncipherment=true
policyset.userCertSet.6.default.params.keyUsageKeyAgreement=false
policyset.userCertSet.6.default.params.keyUsageKeyCertSign=false
policyset.userCertSet.6.default.params.keyUsageCrlSign=false
policyset.userCertSet.6.default.params.keyUsageEncipherOnly=false
policyset.userCertSet.6.default.params.keyUsageDecipherOnly=false
policyset.userCertSet.7.constraint.class_id=noConstraintImpl
policyset.userCertSet.7.constraint.name=No Constraint
policyset.userCertSet.7.default.class_id=extendedKeyUsageExtDefaultImpl
policyset.userCertSet.7.default.name=Extended Key Usage Extension Default
policyset.userCertSet.7.default.params.exKeyUsageCritical=false
policyset.userCertSet.7.default.params.exKeyUsageOIDs=1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.4
policyset.userCertSet.8.constraint.class_id=noConstraintImpl
policyset.userCertSet.8.constraint.name=No Constraint
policyset.userCertSet.8.default.class_id=subjectAltNameExtDefaultImpl
policyset.userCertSet.8.default.name=Subject Alt Name Constraint
policyset.userCertSet.8.default.params.subjAltNameExtCritical=false
policyset.userCertSet.8.default.params.subjAltExtType_0=RFC822Name
policyset.userCertSet.8.default.params.subjAltExtPattern_0=$request.requestor_email$
policyset.userCertSet.8.default.params.subjAltExtGNEnable_0=true
policyset.userCertSet.8.default.params.subjAltNameNumGNs=1
policyset.userCertSet.9.constraint.class_id=signingAlgConstraintImpl
policyset.userCertSet.9.constraint.name=No Constraint
policyset.userCertSet.9.constraint.params.signingAlgsAllowed=SHA256withRSA,SHA512withRSA,SHA256withEC,SHA384withRSA,SHA384withEC,SHA512withEC,SHA256withRSA/PSS,SHA384withRSA/PSS,SHA512withRSA/PSS
policyset.userCertSet.9.default.class_id=signingAlgDefaultImpl
policyset.userCertSet.9.default.name=Signing Alg
policyset.userCertSet.9.default.params.signingAlg=-
|
Bugs rencontrés
Useless login pour ACME
Vous aurez peut être constaté sur certaines versions que rien ne se passe quand on se connecte sur ACME ...
Non ce n'est pas juste une fonction inutile (mais presque quand même ...) c'est dû a une erreur dans le code source ...
Pour la corriger il suffit de lancer le sed ci-dessous et vous aurez enfin accès au menu "Configuration"
[root@linux] # | sed -i 's/data.Roles.Role/data.Roles/' /usr/share/pki/acme/webapps/acme/js/pki-acme.js | dblclick to copy |
KRA et le certificat perdu ...
Lors de l'installation de KRA, j'ai pu constater que le générateur server side ne fonctionnait pas ... En effet il nous dit que son certificat doit être importé dans la NSS DB de la CA .... Et pourtant, il y est ...
Après avoir cherché prêt de 2 jours et tout retourné, j'ai fini par trouver ...
Le nickname n'est pas mis dans la configuration de la CA ...
[root@linux] # | echo "ca.connector.KRA.transportCertNickname=kra_transport" >> /var/lib/pki/pki-dogtag/ca/conf/CS.cfg | dblclick to copy |
SCEP: le listener qui ne fonctionne pas ...
Alors il m'a fallu des heures pour trouver comment le fixer, mais le fixer est au final très simple ...
C'est tout simplement une mauvaise entrée dans le fichier de configuration qui pose problème, ils ont laissé le nom d'une classe disparue ...
Il faut donc tout simplement modifier le fichier CS.cfg ... Enfin j'ai modifié tous les fichiers du serveurs afin de m'assurer qu'aucun ne garde l'ancienne info non fonctionnelle ...
[root@linux] # | sed -i .fixScep 's/com.netscape.cms.servlet.cert.scep.ChallengePassword/org.mozilla.jss.netscape.security.x509.ChallengePassword/' $(find / -name CS.cfg) | dblclick to copy |