Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Generate a CSR with SAN (Subject Alternative Name) Extension

See more CSR Examples

Demonstrates how to generate a private key and a Certificate Signing Request (CSR) that includes the SAN extension.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.FileAccess,
  Chilkat.PrivateKey,
  Chilkat.Rsa,
  Chilkat.Csr;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  rsa: TRsa;
  privKey: TPrivateKey;
  csr: TCsr;
  pemStr: string;
  fac: TFileAccess;

begin
  success := False;

  //  This requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  //  First generate an RSA private key.
  //  (It is also possible to create CSRs based on ECDSA private keys..)
  rsa := TRsa.Create;

  //  Generate a random 2048-bit RSA key.
  privKey := TPrivateKey.Create;
  success := rsa.GenKey(2048,privKey);
  if (success = False) then
    begin
      WriteLn(rsa.LastErrorText);
      Exit;
    end;

  //  Create the CSR object and set properties.
  csr := TCsr.Create;

  //  Specify the Common Name. 
  csr.CommonName := 'mysubdomain.mydomain.com';

  //  Country Name (2 letter code)
  csr.Country := 'GB';

  //  State or Province Name (full name)
  csr.State := 'Yorks';

  //  Locality Name (eg, city)
  csr.Locality := 'York';

  //  Organization Name (eg, company)
  csr.Company := 'Internet Widgits Pty Ltd';

  //  Organizational Unit Name (eg, secion/division)
  csr.CompanyDivision := 'IT';

  //  Email address
  csr.EmailAddress := 'support@mydomain.com';

  //  Add Subject Alternative Names
  //  (The AddSan method is added in Chilkat v9.5.0.84)
  //  Call AddSan for each alternative name.
  success := csr.AddSan('dnsName','mydomain.com');
  success := csr.AddSan('dnsName','mysubdomain.mydomain.com');
  success := csr.AddSan('ipAddress','192.168.0.123');

  //  Create the CSR using the private key.
  pemStr := csr.GenCsrPem(privKey);
  if (csr.LastMethodSuccess <> True) then
    begin
      WriteLn(csr.LastErrorText);
      Exit;
    end;

  //  Save the private key and CSR to a files.
  privKey.SavePkcs8EncryptedPemFile('password','qa_output/privKey1.pem');

  fac := TFileAccess.Create;
  fac.WriteEntireTextFile('qa_output/csr1.pem',pemStr,'utf-8',False);

  //  Show the CSR.
  WriteLn(pemStr);

  //  Sample output:

  //  	-----BEGIN CERTIFICATE REQUEST-----
  //  	MIIC6jCCAdICAQAwgaQxITAfBgNVBAMMGG15c3ViZG9tYWluLm15ZG9tYWluLmNv
  //  	bTELMAkGA1UEBhMCR0IxDjAMBgNVBAgMBVlvcmtzMQ0wCwYDVQQHDARZb3JrMSEw
  //  	HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxCzAJBgNVBAsMAklUMSMw
  //  	IQYJKoZIhvcNAQkBFhRzdXBwb3J0QG15ZG9tYWluLmNvbTCCASIwDQYJKoZIhvcN
  //  	AQEBBQADggEPADCCAQoCggEBALnQ0un/wF8whk+gPuiAlf3qvx14jgAOV6Erm6EB
  //  	H7WACPCpnKcm/8KP+7uoPiwRQaENhMeCgf45vcivl2p6aAn/spLXyEkXyw2d8wFb
  //  	YYAGRkiz4Xf7ASJiKuwcOtORz+sSDzgtdfokHfXU1cYeFE2yQhSdLUY5fMn425+g
  //  	KoEEsRSjSDe6AKru4+4iGNrLKd8pB9IA5/jOE139IkWlB9r5fEPD5bUTsgqXk9eb
  //  	68O0gc712V2eZK07N24lDmFC4bIMTD4csDWocR5hFHXj7NX7c8sOBDcpEb9mPIk4
  //  	elxubnhkfnjhOi4J3lDHcT/0ALnbLhf9LnaiKqs+5VcVZvECAwEAAaAAMA0GCSqG
  //  	SIb3DQEBBQUAA4IBAQC0AETLIcP3foh5nbu2hVFS8uCUNZ5hEIR1eXmYZmZoBQq2
  //  	26ZAoT4CZwixlggC+n7WvAXJ5Pzxpl4wLV4loTiQzaKPX1w0ERo5ZRwLy0n56oG2
  //  	6QG+WTViT1C8rlgtVwkCFNOXr0kSSRs8FdaPllqKxK1hxYSL7zwNpumsk39F2cDt
  //  	vhcekvH0V3BuGrQFm3dKN/0azW6GOod9+Vq4VzSyOe3kp15oxLBsZOFOu/REujcw
  //  	Tzu2jt1asQKUm60CZ9wNHpYepR0Ww40uP1slbehEaFDa6V8b60/tlHHmBbJ4/fy5
  //  	hJnYCvjzFz4O9VtT+JtP9ldRHWV3KpZ8ne3AjD+F
  //  	-----END CERTIFICATE REQUEST-----


  rsa.Free;
  privKey.Free;
  csr.Free;
  fac.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.