lib/csr.ex

defmodule CA.CSR do

  def ca() do
      ca_key = X509.PrivateKey.new_ec(:sect571r1)
      {ca_key, X509.Certificate.self_signed(ca_key,
          "/C=UA/L=Kyiv/O=SYNRC/CN=CSR-CMP", template: :root_ca)}
  end

  def server(cn) do
      {ca_key, ca} = ca()
      server_key = X509.PrivateKey.new_ec(:sect571r1)
        X509.Certificate.new(X509.PublicKey.derive(server_key),
           "/C=UA/L=Kyiv/O=SYNRC/CN=" <> cn, ca, ca_key,
           extensions: [subject_alt_name:
              X509.Certificate.Extension.subject_alt_name(["n2o.dev", "erp.uno"]) ])
  end

  def csr() do
      {ca_key, ca} = ca()
      priv = X509.PrivateKey.new_ec(:sect571r1)
      csr = X509.CSR.new(priv, "/C=UA/L=Kyiv/O=SYNRC",
            extension_request: [X509.Certificate.Extension.subject_alt_name(["n2o.dev"])])
      true = X509.CSR.valid?(csr)
      subject = X509.CSR.subject(csr)
      :io.format '~p~n', [csr]
      X509.Certificate.new(X509.CSR.public_key(csr), subject, ca, ca_key,
         extensions: [subject_alt_name:
           X509.Certificate.Extension.subject_alt_name(["n2o.dev", "erp.uno"]) ])
  end

end