Improve example CA setup
The example CA now has more realistic 2 levels with a root CA and a sub CA. Setup script and ca.cnf has been changed to create a root CA and a sub CA that is signed by the root CA. The sub CA is used for signing the end entity certificates. Example CA directory has been changed to example_ca for better readability.
This commit is contained in:
		
							parent
							
								
									1f8c44689e
								
							
						
					
					
						commit
						a960a60ecd
					
				
					 3 changed files with 115 additions and 23 deletions
				
			
		
							
								
								
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -2,6 +2,6 @@ | |||
| .*.swp | ||||
| /translate.*.toml | ||||
| /.idea/ | ||||
| /exampleca/ | ||||
| /example_ca/ | ||||
| /node_modules/ | ||||
| /public/ | ||||
|  |  | |||
							
								
								
									
										94
									
								
								ca.cnf
									
										
									
									
									
								
							
							
						
						
									
										94
									
								
								ca.cnf
									
										
									
									
									
								
							|  | @ -3,22 +3,54 @@ extensions = v3_ext | |||
| [ca] | ||||
| default_ca = EXAMPLECA | ||||
| 
 | ||||
| [rootca] | ||||
| dir              = ./example_ca/root | ||||
| certs            = $dir/certs | ||||
| crl_dir          = $dir/crl | ||||
| database         = $dir/index.txt | ||||
| serial           = $dir/serial | ||||
| new_certs_dir    = $dir/newcerts | ||||
| 
 | ||||
| crl              = $dir/crl.pem | ||||
| certificate      = $dir/ca.crt.pem | ||||
| private_key      = $dir/private/ca.key.pem | ||||
| RANDFILE         = $dir/private/.rand | ||||
| 
 | ||||
| policy           = policy_any | ||||
| unique_subject   = no | ||||
| email_in_dn      = no | ||||
| copy_extensions  = none | ||||
| 
 | ||||
| default_md       = sha256 | ||||
| default_days     = 1825 | ||||
| default_crl_days = 30 | ||||
| 
 | ||||
| [EXAMPLECA] | ||||
| dir             = ./exampleca | ||||
| certs           = $dir/certs | ||||
| crl_dir         = $dir/crl | ||||
| database        = $dir/index.txt | ||||
| new_certs_dir   = $dir/newcerts | ||||
| serial          = $dir/serial | ||||
| crl             = $dir/crl.pem | ||||
| certificate     = $dir/ca.crt.pem | ||||
| serial          = $dir/serial | ||||
| crl             = $dir/crl.pem | ||||
| private_key     = $dir/private/ca.key.pem | ||||
| RANDFILE        = $dir/private/.rand | ||||
| unique_subject  = no | ||||
| email_in_dn     = no | ||||
| default_md      = sha256 | ||||
| dir              = ./example_ca/sub | ||||
| certs            = $dir/certs | ||||
| crl_dir          = $dir/crl | ||||
| database         = $dir/index.txt | ||||
| serial           = $dir/serial | ||||
| new_certs_dir    = $dir/newcerts | ||||
| 
 | ||||
| crl              = $dir/crl.pem | ||||
| certificate      = $dir/ca.crt.pem | ||||
| private_key      = $dir/private/ca.key.pem | ||||
| RANDFILE         = $dir/private/.rand | ||||
| unique_subject   = no | ||||
| email_in_dn      = no | ||||
| 
 | ||||
| default_md       = sha256 | ||||
| default_days     = 365 | ||||
| default_crl_days = 30 | ||||
| 
 | ||||
| [policy_any] | ||||
| countryName            = match | ||||
| stateOrProvinceName    = optional | ||||
| organizationName       = match | ||||
| organizationalUnitName = optional | ||||
| commonName             = supplied | ||||
| emailAddress           = optional | ||||
| 
 | ||||
| [policy_match] | ||||
| commonName      = supplied | ||||
|  | @ -29,3 +61,35 @@ keyUsage               = keyEncipherment,digitalSignature,nonRepudiation | |||
| extendedKeyUsage       = clientAuth,emailProtection | ||||
| subjectKeyIdentifier   = hash | ||||
| authorityKeyIdentifier = keyid:always,issuer:always | ||||
| 
 | ||||
| [req] | ||||
| default_bits       = 3072 | ||||
| default_keyfile    = privkey.pem | ||||
| distinguished_name = req_distinguished_name | ||||
| attributes         = req_attributes | ||||
| x509_extensions    = root_ca | ||||
| 
 | ||||
| [req_distinguished_name] | ||||
| countryName            = Country Name (2 letter code) | ||||
| countryName_default    = CH | ||||
| countryName_min        = 2 | ||||
| countryName_max        = 2 | ||||
| 
 | ||||
| localityName           = Locality Name (eg, city) | ||||
| 
 | ||||
| organizationName       = Organization Name (eg, company) | ||||
| organizationalUnitName = Organizational Unit Name (eg, section) | ||||
| 
 | ||||
| commonName             = Common Name (e.g. server FQDN or YOUR name) | ||||
| commonName_max         = 64 | ||||
| 
 | ||||
| [req_attributes] | ||||
| 
 | ||||
| [root_ca] | ||||
| basicConstraints       = critical,CA:true,pathlen:1 | ||||
| subjectKeyIdentifier   = hash | ||||
| 
 | ||||
| [sub_ca] | ||||
| basicConstraints       = critical,CA:true,pathlen:0 | ||||
| subjectKeyIdentifier   = hash | ||||
| authorityKeyIdentifier = keyid:always,issuer:always | ||||
|  | @ -1,11 +1,39 @@ | |||
| #!/bin/sh | ||||
| 
 | ||||
| if [ ! -d "exampleca" ]; then | ||||
|   mkdir -p exampleca/newcerts | ||||
|   touch exampleca/index.txt | ||||
| set -eu | ||||
| 
 | ||||
| COUNTRY_CODE=CH | ||||
| ORGANIZATION="Acme Ltd." | ||||
| 
 | ||||
| if [ ! -d "example_ca" ]; then | ||||
|   mkdir -p example_ca/root/newcerts example_ca/sub/newcerts | ||||
|   touch example_ca/root/index.txt example_ca/sub/index.txt | ||||
|   umask 077 | ||||
|   mkdir exampleca/private | ||||
|   openssl req -new -x509 -keyout exampleca/private/ca.key.pem -out exampleca/ca.crt.pem -days 3650 \ | ||||
|     -subj "/CN=Example CA" -nodes -newkey rsa:3072 -addext "basicConstraints=critical,CA:true,pathlen:0" | ||||
|   chmod +r exampleca/ca.crt.pem | ||||
|   mkdir example_ca/root/private example_ca/sub/private | ||||
|   openssl req -new -x509 \ | ||||
|     -config ca.cnf \ | ||||
|     -keyout example_ca/root/private/ca.key.pem \ | ||||
|     -newkey rsa:3072 \ | ||||
|     -nodes \ | ||||
|     -subj "/CN=Example Root CA/C=${COUNTRY_CODE}/O=${ORGANIZATION}" \ | ||||
|     -utf8 \ | ||||
|     -days 3650 \ | ||||
|     -out example_ca/root/ca.crt.pem | ||||
|   chmod +r example_ca/root/ca.crt.pem | ||||
|   openssl req -new \ | ||||
|     -config ca.cnf \ | ||||
|     -keyout example_ca/sub/private/ca.key.pem \ | ||||
|     -newkey rsa:3072 \ | ||||
|     -nodes \ | ||||
|     -subj "/CN=Example Sub CA/C=${COUNTRY_CODE}/O=${ORGANIZATION}" \ | ||||
|     -utf8 \ | ||||
|     -out example_ca/sub/ca.csr.pem | ||||
|   openssl ca \ | ||||
|     -config ca.cnf \ | ||||
|     -name rootca \ | ||||
|     -in example_ca/sub/ca.csr.pem \ | ||||
|     -extensions sub_ca \ | ||||
|     -out example_ca/sub/ca.crt.pem \ | ||||
|     -create_serial \ | ||||
|     -batch | ||||
| fi | ||||
		Reference in a new issue