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

Convert Let's Encrypt PEM Files to a PFX

See more PFX/P12 Examples

Demonstrates how to convert the .pem files provided by Let's Encrypt to a single PFX.

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.Pfx,
  Chilkat.StringBuilder;

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

procedure RunDemo;
var
  success: Boolean;
  sbPem: TStringBuilder;
  sbFullChainPem: TStringBuilder;
  pfx: TPfx;
  pfxPassword: string;

begin
  success := False;

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

  //  Let's Encrypt provides four .pem files
  //  1. fullchain.pem
  //  2. privkey.pem
  //  3. cert.pem
  //  4. chain.pem

  //  The cert.pem and chain.pem are redundant. 
  //  The fullchain.pem is composed of the cert.pem and chain.pem.

  //  To convert the PEM's to a single .pfx, we don't need the redundant data.
  //  The privkey.pem and fullchain.pem provide the required data.
  //  We can ignore cert.pem and chain.pem (because those certs are already found in fullchain.pem).

  //  We need a single .pem file that contains both the private key, the cert,
  //  and the certs in the chain of authentication.
  //  Let's combine priveky.pem and fullchain.pem into a single .pem

  sbPem := TStringBuilder.Create;
  success := sbPem.LoadFile('qa_data/pem/lets_encrypt/privkey.pem','utf-8');
  if (success = False) then
    begin
      WriteLn('Failed to load privkey.pem');
      Exit;
    end;

  //  To be safe, append a blank line..
  sbPem.AppendLine('',False);

  sbFullChainPem := TStringBuilder.Create;
  success := sbFullChainPem.LoadFile('qa_data/pem/lets_encrypt/fullchain.pem','utf-8');
  if (success = False) then
    begin
      WriteLn('Failed to load fullchain.pem');
      Exit;
    end;

  //  Append the full cert chain PEM to the private key PEM.
  sbPem.AppendSb(sbFullChainPem);

  //  Load the combined PEM into a Chilkat PFX object.
  pfx := TPfx.Create;
  success := pfx.LoadPem(sbPem.GetAsString(),'no password required');
  if (success = False) then
    begin
      WriteLn(pfx.LastErrorText);
      Exit;
    end;

  //  Write the PFX w/ a password.
  pfxPassword := 'secret';
  success := pfx.ToFile(pfxPassword,'qa_output/sample.pfx');
  if (success = False) then
    begin
      WriteLn(pfx.LastErrorText);
      Exit;
    end;

  WriteLn('Success!');


  sbPem.Free;
  sbFullChainPem.Free;
  pfx.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.