Current section

Files

Jump to
ca lib csr.ex
Raw

lib/csr.ex

defmodule CA.CSR do
@moduledoc "CA/CSR library."
def ca() do
ca_key = X509.PrivateKey.new_ec(:secp384r1)
dn = "/C=UA/L=Київ/O=SYNRC/CN=CA"
:logger.info 'CSR CMP DN ~p~n', [dn]
ca = X509.Certificate.self_signed(ca_key, dn, template: :root_ca)
der = :public_key.der_encode(:ECPrivateKey, ca_key)
pem = :public_key.pem_encode([{:ECPrivateKey, der, :not_encrypted}])
:file.write_file "ca.key", pem
:file.write_file "ca.pem", X509.Certificate.to_pem(ca)
{ca_key, ca}
end
def read_ca() do
# {:ok, ca_key_bin} = :file.read_file "~/.chat/secp384r1/ca.key"
{:ok, ca_key_bin} = :file.read_file "ca.key"
{:ok, ca_bin} = :file.read_file "ca.pem"
{:ok, ca_key} = X509.PrivateKey.from_pem ca_key_bin
{:ok, ca} = X509.Certificate.from_pem ca_bin
{ca_key, ca}
end
def server(name) do
{ca_key, ca} = read_ca()
dn = "/C=UA/L=Київ/O=SYNRC/CN=" <> name
server_key = X509.PrivateKey.new_ec(:secp384r1)
:logger.info 'CSR SERVER DN ~p~n', [dn]
X509.Certificate.new(X509.PublicKey.derive(server_key),
dn, ca, ca_key, extensions: [subject_alt_name:
X509.Certificate.Extension.subject_alt_name(["*.synrc.com"]) ])
end
def csr(user) do
{ca_key, ca} = read_ca()
priv = X509.PrivateKey.new_ec(:secp384r1)
der = :public_key.der_encode(:ECPrivateKey, priv)
pem = :public_key.pem_encode([{:ECPrivateKey, der, :not_encrypted}])
:file.write_file(user <> ".key", pem)
dn = "/C=UA/L=Київ/O=SYNRC/CN=" <> user
:logger.info 'CSR USER DN ~p~n', [dn]
csr = X509.CSR.new(priv, dn, extension_request: [
X509.Certificate.Extension.subject_alt_name(["synrc.com"])])
:file.write_file(user <> ".csr", X509.CSR.to_pem(csr))
true = X509.CSR.valid?(csr)
subject = X509.CSR.subject(csr)
X509.Certificate.new(X509.CSR.public_key(csr),
subject, ca, ca_key, extensions: [subject_alt_name:
X509.Certificate.Extension.subject_alt_name(["synrc.com"]) ])
csr
end
end