===== Create a certificate request ===== ==== Create a ECC key ==== Create a ECC private key using the prime256v1 algorithm ((https://www.digicert.com/kb/ecc-csr-creation-ssl-installation-apache.htm)) openssl ecparam -out server.key -name prime256v1 -genkey using secp384r1 openssl ecparam -out server.key -name prime256v1 -genkey Create CSR from key openssl req -new -nodes -key server.key -out $(hostname -f).csr\ -subj "/C=US/ST=IL/L=Springfield/O=ACME Inc/OU=roadrunner/CN=$(hostname -f)"\ -addext "subjectAltName=DNS:$(hostname -f)" One-liner for ECC key openssl req -new -nodes -newkey ec -pkeyopt ec_paramgen_curve:secp384r1 \ -keyout $(hostname -f).key -out $(hostname -f).csr \ -subj "/C=US/ST=IL/L=Springfield/O=ACME Inc/OU=roadrunner/CN=$(hostname -f)"\ -addext "subjectAltName=DNS:$(hostname -f)" ==== Create a RSA key ==== openssl req -new -nodes -keyout newkey.pem -out newreq.pem Create rsa key and csr openssl req -new -newkey rsa:2048 -nodes -out example.com.csr \ -keyout example.com.key \ -subj "/C=US/ST=IL/L=Springfield/O=ACME Inc/OU=roadrunner/CN=example.com" \ -addext "subjectAltName=DNS:example.com" one liner for RSA key and csr using system FQDN openssl req -new -sha256 -nodes -out $(hostname -f).csr -newkey rsa:2048 -keyout $(hostname -f).key -subj "/C=US/ST=IL/L=Springfield/O=ACME Inc/OU=roadrunner/CN=$(hostname -f)" \ -addext "subjectAltName=DNS:$(hostname -f)" ===== get cert modulus and compare to private key ===== if [[ "$(openssl x509 -noout -in ${SIGNED_CERT} -modulus)" != "$(openssl rsa -noout -in ${PRIVATE_KEY} -modulus)" ]] ; then echo "they don't match" fi =====pkcs12 ===== ====Create pkcs12 ==== for a web browser from a certificate and it's key openssl pkcs12 -export -in newcert.pem -inkey newreq.pem -out chrome.p12 If the private and public key are in the same file openssl pkcs12 -export -in mycert.CRT -out mycertoutput.p12 ====Convert pkcs12 to pem==== first extract the certificate openssl pkcs12 -in mycert.P12 -nodes -clcerts -out cert second, extract the key openssl pkcs12 -in mycert.P12 -nodes -nocerts -out key Both into one file openssl pkcs12 -in mycert.P12 -nodes -out mycert.CRT ===== Create CRL ===== http://gagravarr.org/writing/openssl-certs/ca.shtml#ca-revoke openssl ca -gencrl -keyfile CA/private/cakey.pem -cert CA/cacert.pem -out CA/isd_crl.crl openssl ca -revoke CA/newcerts/F069A9B2CEE10A6E.pem -keyfile CA/private/cakey.pem -cert CA/cacert.pem openssl ca -gencrl -keyfile CA/private/cakey.pem -cert CA/cacert.pem -out CA/my_crl.pem To display the contents of a CRL certificate: openssl crl -in my_crl.pem -text Convert a PEM formatted CRL to DER format for Firefox openssl crl -in crl.pem -outform DER -out new_crl.der ===== Create a certificate hash ===== openssl x509 -noout -subject_hash -in selfsigned.pem === Display === Display contents of a certificate file openssl x509 -in cacert.pem -text Display certificate request (CSR) openssl req -in cert.csr -text ===== openssl s_client ===== view the details of what the server wants openssl s_client -connect example.com:443 -prexit Using a client certificate openssl s_client -cert client.crt -key client.key -connect example.com:44 With certificate verification openssl s_client -connect example.com:443 -cert mycert.pem -key mykey.pem -CAfile cacert.pem Retrieve just the RSA public key if the site has both ECDSA & RSA openssl s_client -sigalgs "RSA-PSS+SHA256" -connect google.com:443 to retrieve the EC cert use "ECDSA+SHA256" for sigalgs For more examples of using signature algorithms see https://node-security.com/posts/openssl-testing-signature-algorithm/ wget and openssl s_client wget --certificate=mycert.pem --private-key=mykey.pem --ca-certificate=cacert.pem https://example.com --verbose ===== Encrypting using openssl ===== openssl enc -e -k 1234 -aes256 -in text.txt -out text.txt.enc openssl enc -e -k 1234 -aes256 -pbkdf2 -in text.txt -out text.txt.enc openssl enc -d -k 1234 -aes256 -pbkdf2 -in text.txt -out text.txt.enc #Signing files date +%s > restore.txt #sign using rasutl openssl rsautl -sign -in restore.txt -inkey mykey.pem -out restore.sig #verify using rsautl openssl rsautl -verify -in restore.sig -inkey mycert.pem -certin #smime - Sign and verify openssl smime -sign -in restore.txt -text -out mail.msg -signer mycert.pem -inkey mykey.pem openssl smime -verify -in mail.msg -CAfile cacert.pem -out signedtext.txt openssl.cnf Should change default_bits to 2048 change nsCertType to just client for client certificates nsComment =====index.txt format ===== mostly copied from http://www.mail-archive.com/openssl-users@openssl.org/msg45982.html Column 1 -- (V)erified, (E)xpired, and (R)evoked First of all the format of index.txt is undocumented. Probably because it might change sometime. Or it was a fast hack to get the demo application running. Or something like that. Having said this, it currently (openssl 0.9.8b) is a text database where a tab separates the columns and newline separates the rows. The columns are defined as #define DB_type 0 /* Status of the certificate */ #define DB_exp_date 1 /* Expiry date */ #define DB_rev_date 2 /* Revocation date */ #define DB_serial 3 /* Serial No., index - unique */ #define DB_file 4 #define DB_name 5 /* DN, index - unique when active and not disabled */ DB_type is defined as #define DB_TYPE_REV 'R' /* Revoked */ #define DB_TYPE_EXP 'E' /* Expired */ #define DB_TYPE_VAL 'V' /* Valid */ 'E' is currently not used by "openssl ca", I guess because it is redundant to DB_exp_date. So expired certificates still have status 'V' DB_file currently is always 'unknown' and not used by "openssl ca". I guess the original idea was to store the filename of the generated certificate file here. The dates are in ASN1_UTCTIME-format. revoke_date=`date +%y%m%d%H%M%SZ` ===== compare key with signed cert ===== openssl x509 -noout -modulus -in openssl rsa -noout -modulus -in and compare the two ===== References ===== https://www.digicert.com/kb/ecc-csr-creation-ssl-installation-apache.htm https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs https://dev.to/benjaminblack/obtaining-an-elliptic-curve-dsa-certificate-with-lets-encrypt-51bc https://blog.dnsimple.com/2022/10/ecc-support-for-certificates/ https://soatok.blog/2022/05/19/guidance-for-choosing-an-elliptic-curve-signature-algorithm-in-2022/