рдкреНрд░рдХреНрд░рд┐рдпрд╛ TOpenSSL.CreateSignedCert (const FileName: String; OutFiles: TStringList;
const рдкрд╛рд╕рд╡рд░реНрдб: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
рд╡реИрдзрддрд╛: рдкреВрд░реНрдгрд╛рдВрдХ; KeySize: рдкреВрд░реНрдгрд╛рдВрдХ; const ExtendedKeyUsage: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
const рд░рд╛рд╖реНрдЯреНрд░рдирд╛рдо, рдИрдореЗрд▓, рд╕рдВрдЧрдарди, рд╕рдВрдЧрдардирд╛рддреНрдордХ рд╕рдВрдЧрдарди, рджреЗрд╢: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
const CAFileSpec, CAPFXFileSpec, CAPStreetKeyPassword: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
рдПрд░реАрдореЗрдиреНрдлрд╝рд┐рд▓реЗрд╕реНрдкреАрдХ: рд╕реНрдЯреНрд░рд┐рдВрдЧ = '';
рдкреНрд░реЛрдЧреНрд░реЗрд╕рдкреНрд░реЛрдХ: рдЯреАрдкреНрд░реЛрдЧреНрд░реЗрд╕рдкреНрд░реЛрдХ = рдиреАрд▓; LogMsgProc: TLogMsgProc = nil);
рд╡рд░
TmpPStreetKeyFileSpec, TmpPublicKeyFileSpec: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
TmpCerFileSpec, TmpPfxFileSpec, TmpCrFileSpec, TmpCASerialFileSpec, TmpExtFileSpec, TmpPemFileSpec: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
TmpCAPStreetKeyFileSpec: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
рд╕реБрдмрдЬ: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
рдЯреЗрдореНрдкреАрдбрд┐рд░: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
рдирд┐рд░рд╕реНрдд: рдмреВрд▓рд┐рдпрди;
рд╡рд╛рд╕реЗрд░реНрд░: рдмреВрд▓рд┐рдпрди;
OutPublicKeyFileSpec: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
рд╢реБрд░реВ рдХрд░рдирд╛
рд╡рд╛рд╕реЗрд░реНрд░: = рд╕рдЪреНрдЪрд╛;
рдЯреЗрдореНрдкреАрдбрд┐рд░: = рдЧреЗрдЯрдЯреЗрдореНрдкрд┐рд░;
рдХреЛрд╢рд┐рд╢
CheckIsFileExists (CAFileSpec);
// рдореВрд▓ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕реЗ рдирд┐рдЬреА рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
TmpCAPStreetKeyFileSpec: = TempDir + ChangeFileExt (ExtractFileName (CAPFXFileSpec), '') + '.pStreetKey.pem';
ExportPStreetKeyFromPfx (CAPFXFileSpec, TmpCAPStreetKeyFileSpec, CAPStreetKeyPassword);
// рд╣рдо рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдХреЗ рд╕рдлрд▓ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рд╣реА - // рд╣рдо рд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ
TmpPStreetKeyFileSpec: = TempDir + FileName + '.pStreetKey.pem';
TmpPublicKeyFileSpec: = TempDir + FileName + '.publicKey.pem';
TmpCerFileSpec: = TempDir + FileName + '.cer';
TmpPemFileSpec: = TempDir + FileName + '.pem';
TmpPfxFileSpec: = TempDir + FileName + '.pfx';
TmpCsrFileSpec: = TempDir + FileName + '.csr';
TmpCASerialFileSpec: = TempDir + FileName + '.srl';
Subj: = GetSubj (рд░рд╛рд╖реНрдЯреНрд░рдордВрдбрд▓, рдИрдореЗрд▓, рд╕рдВрдЧрдарди, рд╕рдВрдЧрдардирд╛рддреНрдордХ рд╕рдВрдЧрдарди, рджреЗрд╢);
рдирд┐рд░рд╕реНрдд: = рдЧрд▓рдд;
рдпрджрд┐ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ (ProgressProc) рддреЛ
рдкреНрд░реЛрдЧреНрд░реЗрд╕рдкреНрд░реЛрдХ (13, 4, рдирд┐рд░рд╕реНрдд, рдкреНрд░рд╛рд░реВрдк ('% s (% d% s) ...' {'рдЬрдирд░реЗрдЯ рдХреАрдЬрд╝ (% d рдмрд┐рдЯреНрд╕) ...'), [StKeysGenerate, KeySize, StBit));
рдпрджрд┐ рдирд┐рд░рд╕реНрдд рд╣реБрдЖ рддреЛ
рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ;
CreatePStreetKey (TmpPStreetKeyFileSpec, TmpPublicKeyFileSpec, KeySize, ARandomFileSpec);
рдпрджрд┐ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ (ProgressProc) рддреЛ
рдкреНрд░реЛрдЧреНрд░реЗрд╕рдкреНрд░реЛрдХ (13, 5, рдирд┐рд░рд╕реНрдд, рдкреНрд░рд╛рд░реВрдк ('% s ...', [StGenerateCert рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ]) {'рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ ...'});
рдпрджрд┐ рдирд┐рд░рд╕реНрдд рд╣реБрдЖ рддреЛ
рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ;
рдпрджрд┐ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ (ProgressProc) рддреЛ
рдкреНрд░реЛрдЧреНрд░реЗрд╕рдкреНрд░реЛрдХ (13, 6, рдирд┐рд░рд╕реНрдд, рдкреНрд░рд╛рд░реВрдк ('% s ...', [StCreateCertificateRequest]) {'рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдПрдБ ...'};
// рдПрдХ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдПрдБ - .csr
RunOpenSSLConsole (рдкреНрд░рд╛рд░реВрдк (
'req -new -key "% s" -out "% s" -days% d -subj% s,'
[TmpPStreetKeyFileSpec, TmpCsrFileSpec, ValidDays, Subj]
), рдЯреНрд░реВ, рдиреАрд▓, рдиреАрд▓);
рдпрджрд┐ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ (ProgressProc) рддреЛ
рдкреНрд░реЛрдЧреНрд░реЗрд╕рдкреНрд░реЛрдХ (13, 7, рдирд┐рд░рд╕реНрдд, рдкреНрд░рд╛рд░реВрдк ('% s ...', [StCreateExtensionsFile]) {'рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ ...');
//
www.openssl.org/docs/apps/x509v3_config.htmlTmpExtFileSpec: = StrToFile (
// 'keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyCertSign' +
'keyUsage = digitalSignature, keyEncipherment' +
iif (ExtendedKeyUsage <> '', # 13 # 10'extendedKeyUsage = '+ ExtendedKeyUsage,' '),
TempDir + FileName + '.extensions.cfg'
);
рдпрджрд┐ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ (ProgressProc) рддреЛ
рдкреНрд░реЛрдЧреНрд░реЗрд╕рдкреНрд░реЛрдХ (13, 8, рдирд┐рд░рд╕реНрдд, рдкреНрд░рд╛рд░реВрдк ('% s ...', [StCreateSignedCertificate]) {'рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛рдПрдБ ...'};
// рдЕрдиреБрд░реЛрдз рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореВрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рджреНрд╡рд╛рд░рд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛рдПрдВ
RunOpenSSLConsole (рдкреНрд░рд╛рд░реВрдк (
'x509 -рд░реЗрдХ-рджрд┐рди% d -passin рдкрд╛рд╕:% s -in "% s" -CAform DER -CA "% s" -CAkey "% s" -CAserial "% s" -CAceseserial -out "% s" - DER -extfile "% s" ',
[рд╡реИрдз, рдкрд╛рд╕рд╡рд░реНрдб, TmpCsrFileSpec, CAFileSpec, TmpCAPStreetKeyFileSpec, TmpCASerialFileSpec, TmpCerFileSpec, TxtExtFileSpec]
), рдЭреВрдареА, рдиреАрд▓, рдиреАрд▓);
рдпрджрд┐ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ (ProgressProc) рддреЛ
рдкреНрд░реЛрдЧреНрд░реЗрд╕рдкреНрд░реЛрдХ (13, 9, рдирд┐рд░рд╕реНрдд, рдкреНрд░рд╛рд░реВрдк ('% s ...', [StConvertCertificate]) {'CER рд╕реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ PEM рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ ...'});
// pfx рдореЗрдВ рдЕрдЧрд▓реА рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП cer => pem рдХрдиреНрд╡рд░реНрдЯ рдХрд░реЗрдВ
RunOpenSSLConsole (рдкреНрд░рд╛рд░реВрдк (
'x509 -рдЗрди "% s" -рдЗрдирдлреЙрд░реНрдо DER -out "% s" -outform PEM',
[TmpCerFileSpec, TmpPemFileSpec]
), рдЭреВрдареА, рдиреАрд▓, рдиреАрд▓);
рдпрджрд┐ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ (ProgressProc) рддреЛ
рдкреНрд░реЛрдЧреНрд░реЗрд╕рдкреНрд░реЛрдХ (13, 10, рдирд┐рд░рд╕реНрдд, рдкреНрд░рд╛рд░реВрдк ('% s ...', [StCreatePFX]) {'PFX рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ ...');
// рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк pem рдФрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рд╕реЗ pfx рдмрдирд╛рдПрдВ
RunOpenSSLConsole (рдкреНрд░рд╛рд░реВрдк (
'pkcs12 -рдкрд╛рд╕рд╡рд░реНрдб рдкрд╛рд╕:% s -export -in "% s" -inkey "% s" -name "% s" -out "% s"',
[рдкрд╛рд╕рд╡рд░реНрдб, TmpPemFileSpec, TmpPStreetKeyFileSpec, FileName, TmpPfxFileSpec]
), рдЭреВрдареА, рдиреАрд▓, рдиреАрд▓);
OutPublicKeyFileSpec: = TmpPublicKeyFileSpec + '.sign'
рдпрджрд┐ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ (ProgressProc) рддреЛ
рдкреНрд░реЛрдЧреНрд░реЗрд╕рдкреНрд░реЛрдХ (13, 11, рдирд┐рд░рд╕реНрдд, рдкреНрд░рд╛рд░реВрдк ('% s ...', [StExportPublicKey]) {'PFX рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ ...');
ExportPublicKeyFromPfx (TmpPfxFileSpec, OutPublicKeyFileSpec, рдкрд╛рд╕рд╡рд░реНрдб);
// рдФрд░ рдкрд░рд┐рдгрд╛рдо рдлрд╝рд╛рдЗрд▓ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ
OutFiles.Add (TmpCerFileSpec);
OutFiles.Add (TmpPfxFileSpec);
OutFiles.Add (TmpPStreetKeyFileSpec);
OutFiles.Add (TmpPublicKeyFileSpec);
OutFiles.Add (OutPublicKeyFileSpec);
рд╡рд╛рд╕реЗрд░реНрд░: = рдЭреВрдареА;
рдЕрдВрдд рдореЗрдВ
// рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣рдЯрд╛рдПрдВ
рдЕрдЧрд░ рд╡рд╛рд╕реЗрд░ рд╣реЛ рддреЛ
рд╢реБрд░реВ рдХрд░рдирд╛
CheckDeleteFile (TmpCerFileSpec);
CheckDeleteFile (TmpPfxFileSpec);
CheckDeleteFile (TmpPStreetKeyFileSpec);
CheckDeleteFile (TmpPublicKeyFileSpec);
CheckDeleteFile (OutPublicKeyFileSpec);
рдЕрдВрдд;
CheckDeleteFile (TmpCsrFileSpec);
CheckDeleteFile (TmpCASerialFileSpec);
CheckDeleteFile (TmpExtFileSpec);
CheckDeleteFile (TmpPemFileSpec);
CheckDeleteFile (TmpCAPStreetKeyFileSpec);
рдЕрдВрдд;
рдЕрдВрдд;