Generating Digital Certificates using OpenSSL
- Generating a self-signed certificate
Generate a private key.
openssl genrsa | openssl pkcs8 -topk8 -nocrypt -out rsa.pri
Generate self signed certificate.
openssl req -x509 -key rsa.pri -sha256 -days 365 -out test.cer
Viewing a certificate.
openssl x509 -in test.cer -noout -text
Generating RSA private key and certificate all in one go.
openssl req -x509 -newkey rsa:2048 -sha256 -nodes -days 365 -out test.cer
- Generating ECDSA private key and a certificate in one go.
Generate ECDSA private key.
openssl ecparam -name secp384r1 -noout -genkey -out ec.pri
Generate self-signed certificate.
openssl req -x509 -key ec.pri -days 365 -sha256 -subj '/CN=Test' -out test.cer
View certificate.
openssl x509 -in test.cer -noout -text
- Adding subject to a certificate.
openssl req -x509 -newkey rsa:2048 -sha256 -nodes -days 365 -out test.cer -subj '/CN=Test'
openssl req -x509 -newkey rsa:2048 -keyout rsa.pri -sha256 -nodes -days 365 -out test.cer -subj '/CN=Test/O=Acme Inc./OU=Cyber Security/C=IN'
openssl req -x509 -newkey rsa:2048 -keyout rsa.pri -sha256 -nodes -days 365 -out test.cer -subj '/CN=Test/O=Acme Inc./OU=Cyber Security/C=IN/emailAddress=pki@acme-inc.com'
https://www.openssl.org/docs/man3.0/man5/x509v3_config.html
- Adding Certificate Extensions.
Basic Constraints.
openssl req -x509 -newkey rsa:2048 -keyout rsa.pri -sha256 -nodes -days 365 -out test.cer -subj '/CN=Test/O=Acme Inc./OU=Cyber Security/C=IN/ST=UP/emailAddress=pki@acme-inc.com' -addext "basicConstraints=critical, CA:false, pathlen:1"
Subject Alternate names.
openssl req -x509 -newkey rsa:2048 -keyout rsa.pri -sha256 -nodes -days 365 -out test.cer -subj '/CN=Test/O=Acme Inc./OU=Cyber Security/C=IN/ST=UP/emailAddress=pki@acme-inc.com' -addext "basicConstraints=critical, CA:false" -addext "subjectAltName = DNS:acme-inc.com,IP:127.0.0.1"
Key Usages.
openssl req -x509 -newkey rsa:2048 -keyout rsa.pri -sha256 -nodes -days 365 -out test.cer -subj '/CN=Test/O=Acme Inc./OU=Cyber Security/C=IN/ST=UP/emailAddress=pki@acme-inc.com' -addext "keyUsage = critical,digitalSignature,keyEncipherment,keyAgreement,cRLSign"
Extended KeyUsage.
openssl req -x509 -newkey rsa:2048 -keyout rsa.pri -sha256 -nodes -days 365 -out test.cer -subj '/CN=Test/O=Acme Inc./OU=Cyber Security/C=IN/ST=UP/emailAddress=pki@acme-inc.com' -addext "extendedKeyUsage = codeSigning, serverAuth, clientAuth"
- Using configuration files for generating certificates.
Sample configuration file.
[req]
distinguished_name = dname
x509_extensions = cert_ext
prompt = no
# DNAME RELATED INFORMATION.
[ dname ]
commonName = cyberhashira.com
countryName = XY
stateOrProvinceName = Some State
localityName = Some City
organizationName = Cyber Hashira
organizationalUnitName = Cyber Security
emailAddress = pki@cyberhashira.com
# CERTIFICATE EXTENSIONS
[ cert_ext ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation
extendedKeyUsage = codeSigning
crlDistributionPoints=URI:http://myCA/ca.crl
subjectAltName = @sans
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
authorityInfoAccess = OCSP;URI:http://ocsp.myCA/
authorityInfoAccess = caIssuers;URI:http://myCA/ca.cer
certificatePolicies= 1.2.4.5.6.7
# SUBJECT ALTERNATE NAME.
[sans]
IP.1 = 127.0.0.1
DNS.1 = blog.cyberhashira.com
DNS.2 = video.cyberhashira.com
This command would use a configuration file to read detailed information about a certificate you want to generate.
openssl req -x509 -config my.cnf -nodes -keyout rsa.pri -out test.cer
- Generating Signed certificates.
>> To generate a signed certificate, we need a certificate authority that will sign a certificate request. So our first step would be to generate CA keys and certificates. For that we'll use a configuration file containing information about the CA as follows -
[req]
distinguished_name = dname
x509_extensions = cert_ext
prompt = no
[ dname ]
CN = RootCA
C = XY
ST = Some State
L = Some City
O = Cyber Hashira
OU = Cyber Security
emailAddress = pki@cyberhashira.com
[ cert_ext ]
basicConstraints = CA:TRUE, pathlen:0
keyUsage = keyCertSign, cRLSign
subjectKeyIdentifier=hash
>> We'll now use this configuration file to setup a Root CA.
openssl req -x509 -config root.cnf -nodes -keyout root.pri -out root.cer
>> Now we'll use our CA keys to sign a certificate request. For this example, we'll sign a webserver certificate and use the following configuration file.
[req]
distinguished_name = dname
req_extensions = req_ext
prompt = no
[ dname ]
CN = CyberHashira.com
C = XY
ST = Some State
L = Some City
O = Cyber Hashira
OU = Cyber Security
emailAddress = pki@cyberhashira.com
[ req_ext ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation
extendedKeyUsage = serverAuth, clientAuth
subjectKeyIdentifier=hash
subjectAltName = @sans
certificatePolicies= 1.2.4.5.6.7
authorityInfoAccess = OCSP;URI:http://ocsp.myCA/
authorityInfoAccess = caIssuers;URI:http://myCA/ca.cer
[sans]
DNS.1 = blog.cyberhashira.com
DNS.2 = video.cyberhashira.com
We'll first generate a certificate request.
openssl req -new -config cyberHashira.cnf -nodes -keyout cyberHashira.pri -out cyberHashira.csr
You can examine the generated certificate request using the command below -
openssl req -in cyberhashira.csr -noout -text
Now we'll sign the certificate request for a webserver using our CA.
openssl x509 -req -days 730 -in cyberHashira.csr -CA root.cer -CAkey root.pri -CAcreateserial -out cyberHashira.cer
openssl x509 -req -days 730 -in cyberHashira.csr -CA root.cer -CAkey root.pri -CAcreateserial -out cyberHashira.cer -extensions req_ext -extfile cyberHashira.cnf
- Useful links
https://www.openssl.org/docs/man3.0/man1/openssl-req.html
https://www.openssl.org/docs/man3.0/man5/x509v3_config.html