ECC
ECC X.509
$ mkdir -p cert/ecc
$ : > cert/ecc/index.txt
$ echo 00 > cert/ecc/serial
$ echo 10 > cert/ecc/crlnumber
CA KEY
$ openssl ecparam -genkey -name secp384r1 |
openssl ec -aes256 -passout pass:0 \
-out cert/ecc/caroot.key
$ openssl req -config cert/ecc/synrc.cnf -days 3650 -batch \
-new -x509 -passin pass:0 -passout pass:0 \
-key cert/ecc/caroot.key -out cert/ecc/caroot.pem \
-subj "/C=UA/ST=Kyiv/O=SYNRC/CN=CA"
CA CRL
$ openssl ca -config cert/ecc/synrc.cnf \
-passin pass:0 -gencrl -out cert/ecc/eccroot.crl
SERVER KEY
$ export SERVER=server
$ openssl req -config cert/ecc/synrc.cnf \
-passin pass:0 -passout pass:0 \
-new -newkey ec:<(openssl ecparam -name secp384r1) \
-keyout cert/ecc/$SERVER.key.enc \
-out cert/ecc/$SERVER.csr \
-subj "/C=UA/ST=Kyiv/O=SYNRC/CN="$SERVER
$ openssl ec -in cert/ecc/$SERVER.key.enc \
-out cert/ecc/$SERVER.key -passin pass:0 -passout pass:0
SERVER CERT
$ openssl ca -config cert/ecc/synrc.cnf -days 730 -batch \
-in cert/ecc/$SERVER.csr -out cert/ecc/$SERVER.pem \
-keyfile cert/ecc/caroot.key -cert cert/ecc/caroot.pem \
-passin pass:0 -extensions server_cert
CLIENT KEY
$ export CLIENT=client
$ openssl req -config cert/ecc/synrc.cnf -batch -passout pass:0 \
-new -newkey ec:<(openssl ecparam -name secp384r1) \
-keyout cert/ecc/$CLIENT.key \
-out cert/ecc/$CLIENT.csr \
-subj "/C=UA/ST=Kyiv/O=SYNRC/CN="$CLIENT
$ openssl ec -in cert/ecc/$CLIENT.key.enc -out cert/ecc/$CLIENT.key -passin pass:0
CLIENT CERT
$ openssl ca -config cert/ecc/synrc.cnf \
-extensions usr_cert -batch -days 365 -passin pass:0 \
-in cert/ecc/$CLIENT.csr -out cert/ecc/$CLIENT.pem \
-cert cert/ecc/caroot.pem -keyfile cert/ecc/caroot.key
CLIENT PFX
$ openssl pkcs12 -export -passin pass:0 -passout pass:0 \
-inkey cert/ecc/$CLIENT.key -in cert/ecc/$CLIENT.pem \
-out cert/ecc/$CLIENT.p12
ECC CNF
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/maxim/depot/synrc/ca/cert/ecc
certs = $dir
crl_dir = $dir
new_certs_dir = $dir
database = $dir/index.txt
serial = $dir/serial
RANDFILE = $dir/.rand
private_key = $dir/caroot.key
certificate = $dir/caroot.pem
crlnumber = $dir/crlnumber
crl = $dir/eccroot.crl
crl_extensions = crl_ext
default_crl_days = 3650
default_md = sha384
name_opt = ca_default
cert_opt = ca_default
default_days = 3650
preserve = no
policy = policy_strict
[ policy_strict ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
string_mask = utf8only
default_md = sha384
x509_extensions = v3_ca
[ req_distinguished_name ]
countryName = UA
countryName_default = UA
0.organizationName = SYNRC
0.organizationName_default = SYNRC
commonName = CA
commonName_default = CA
stateOrProvinceName = Kyiv
stateOrProvinceName_default = Kyiv
localityName = Kyiv
localityName_default = Kyiv
organizationalUnitName = HQ
organizationalUnitName_default = HQ
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ v3_intermediate_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
crlDistributionPoints = @crl_info
authorityInfoAccess = @ocsp_info
[ usr_cert ]
basicConstraints = CA:FALSE
nsCertType = client, email
nsComment = "SYNRC CLIENT"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, emailProtection
subjectAltName = @alt_names
[ server_cert ]
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "SYNRC SERVER"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
crlDistributionPoints = @crl_info
authorityInfoAccess = @ocsp_info
subjectAltName = @alt_names
[alt_names]
DNS.0 = localhost
[ crl_ext ]
authorityKeyIdentifier=keyid:always
[ ocsp ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, OCSPSigning
[crl_info]
URI.0 = http://crl.n2o.dev:8081/eccroot.crl
[ocsp_info]
caIssuers;URI.0 = http://crl.n2o.dev:8081/eccroot.crt
OCSP;URI.0 = http://ocsp.n2o.dev:8081/
LibreSSL
openssl s_server -accept 8772 \
-key cert/ecc/server.key \
-cert cert/ecc/server.pem \
-CAfile cert/ecc/caroot.pem -Verify 1
openssl s_client -connect localhost:8772 \
-key cert/ecc/client.key \
-cert cert/ecc/client.pem \
-CAfile cert/ecc/caroot.pem -showcerts
˙