Create a directory to contain everything
mkdir -p ./root
cd ./root
touch certindex
echo 1000 > certserial
echo 1000 > crlnumber
vi rootca.conf
[ ca ]
default_ca = myca
[ crl_ext ]
issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always
[ myca ]
dir = ./
new_certs_dir = $dir
unique_subject = no
certificate = $dir/rootca.crt
database = $dir/certindex
private_key = $dir/rootca.key
serial = $dir/certserial
default_days = 730
default_md = sha256
policy = myca_policy
x509_extensions = myca_extensions
crlnumber = $dir/crlnumber
default_crl_days = 730
[ myca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = optional
emailAddress = optional
organizationName = supplied
organizationalUnitName = optional
[ myca_extensions ]
basicConstraints = critical,CA:TRUE
keyUsage = critical,any
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign
extendedKeyUsage = serverAuth
[ v3_ca ]
basicConstraints = critical,CA:TRUE,pathlen:0
keyUsage = critical,any
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign
extendedKeyUsage = serverAuth
openssl genrsa -out rootca.key 8192
openssl req -sha256 -new -x509 -days 3650 -key rootca.key -out rootca.crt
Then fill in required info
cd ../
mkdir -p ./interca1
cd ./interca1
touch certindex
echo 1000 > certserial
echo 1000 > crlnumber
vi interca1.conf
[ ca ]
default_ca = myca
[ crl_ext ]
issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always
[ myca ]
dir = ./
new_certs_dir = $dir
unique_subject = no
certificate = $dir/interca1.crt
database = $dir/certindex
private_key = $dir/interca1.key
serial = $dir/certserial
default_days = 365
default_md = sha256
policy = myca_policy
x509_extensions = myca_extensions
crlnumber = $dir/crlnumber
default_crl_days = 365
[ myca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = optional
emailAddress = optional
organizationName = supplied
organizationalUnitName = optional
[ myca_extensions ]
basicConstraints = critical,CA:FALSE
keyUsage = critical,any
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
keyUsage = digitalSignature,keyEncipherment
extendedKeyUsage = serverAuth
vi interca1_client.conf
[ ca ]
default_ca = myca
[ crl_ext ]
issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always
[ myca ]
dir = ./
new_certs_dir = $dir
unique_subject = no
certificate = $dir/interca1.crt
database = $dir/certindex
private_key = $dir/interca1.key
serial = $dir/certserial
default_days = 365
default_md = sha256
policy = myca_policy
x509_extensions = myca_extensions
crlnumber = $dir/crlnumber
default_crl_days = 365
[ myca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = optional
emailAddress = optional
organizationName = supplied
organizationalUnitName = optional
[ myca_extensions ]
basicConstraints = critical,CA:FALSE
keyUsage = critical,any
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
keyUsage = digitalSignature,keyEncipherment
extendedKeyUsage = clientAuth
openssl genrsa -out interca1.key 8192
openssl req -sha256 -new -key interca1.key -out interca1.csr
Then fill in required info. Skip challenge password and optional company name
cd ../root
openssl ca -batch -config rootca.conf -notext -in ../interca1/interca1.csr -out ../interca1/interca1.crt
cd ../interca1
mkdir certs
openssl genrsa -out certs/example.com.key 4096
openssl req -new -sha256 -key certs/example.com.key -out certs/example.com.csr
Then fill in required info. Skip challenge password and optional company name
openssl ca -batch -config interca1.conf -notext -in certs/example.com.csr -out certs/example.com.crt
openssl ca -batch -config interca1_client.conf -notext -in certs/example.com.csr -out certs/example.com.crt
cat ../root/rootca.crt interca1.crt > certs/example.com.chain
Send the following files to whoever requested the certificate
- certs/example.com.crt
- certs/example.com.key
- certs/example.com.chain
openssl x509 -in example.com.crt -text -noout
openssl crl2pkcs7 -nocrl -certfile example.com.chain | openssl pkcs7 -print_certs -text -noout