プロシージャTOpenSSL.CreateSignedCert(const FileName:String; OutFiles:TStringList;
constパスワード:文字列。
ValidDays:整数; KeySize:整数; const ExtendedKeyUsage:文字列。
const CommonName、Email、Organization、OrganizationalUnit、Country:文字列。
const CAFileSpec、CAPFXFileSpec、CAPrivateKeyPassword:文字列。
ARandomFileSpec:文字列= '';
ProgressProc:TProgressProc = nil; LogMsgProc:TLogMsgProc = nil);
var
TmpPrivateKeyFileSpec、TmpPublicKeyFileSpec:ストリング;
TmpCerFileSpec、TmpPfxFileSpec、TmpCsrFileSpec、TmpCASerialFileSpec、TmpExtFileSpec、TmpPemFileSpec:ストリング;
TmpCAPrivateKeyFileSpec:ストリング;
Subj:文字列;
TempDir:文字列;
中止:ブール値。
WasError:ブール値。
OutPublicKeyFileSpec:文字列;
始める
WasError:= True;
TempDir:= GetTempDir;
試してみる
CheckIsFileExists(CAFileSpec);
//ルート証明書から秘密鍵を取得します
TmpCAPrivateKeyFileSpec:= TempDir + ChangeFileExt(ExtractFileName(CAPFXFileSpec)、 '')+ '.privateKey.pem';
ExportPrivateKeyFromPfx(CAPFXFileSpec、TmpCAPrivateKeyFileSpec、CAPrivateKeyPassword);
//すべてのファイルを一時ディレクトリに作成し、すべてのファイルが正常に作成された後にのみ-//永続的なストレージの場所に転送します
TmpPrivateKeyFileSpec:= TempDir + FileName + '.privateKey.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(CommonName、Email、Organization、OrganizationalUnit、Country);
中止:= False;
割り当てられた場合(ProgressProc)
ProgressProc(13、4、Aborted、Format( '%s(%d%s)...' {'Generate Keys(%d bits)...'}、[StKeysGenerate、KeySize、StBit]);
中止された場合
出口
CreatePrivateKey(TmpPrivateKeyFileSpec、TmpPublicKeyFileSpec、KeySize、ARandomFileSpec);
割り当てられた場合(ProgressProc)
ProgressProc(13、5、Aborted、Format( '%s ...'、[StGenerateCertificate]){'Generate certificate ...'});
中止された場合
出口
割り当てられた場合(ProgressProc)
ProgressProc(13、6、Aborted、Format( '%s ...'、[StCreateCertificateRequest]){'Create the certificate request ...'});
//リクエストを作成します-.csr
RunOpenSSLConsole(形式(
'req -new -key "%s" -out "%s" -days%d -subj%s'、
[TmpPrivateKeyFileSpec、TmpCsrFileSpec、ValidDays、Subj]
)、True、nil、nil);
割り当てられた場合(ProgressProc)
ProgressProc(13、7、Aborted、Format( '%s ...'、[StCreateExtensionsFile]){'Create the extensions file ...'});
//
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)
ProgressProc(13、8、Aborted、Format( '%s ...'、[StCreateSignedCertificate]){'Create the signed certificate ...'});
//リクエストに基づいて、ルート証明書によって署名された証明書を作成します
RunOpenSSLConsole(形式(
'x509 -req -days%d -passin pass:%s -in "%s" -CAform DER -CA "%s" -CAkey "%s" -CAserial "%s" -CAcreateserial -out "%s"- DER -extfile "%s" 'を出力します'、
[ValidDays、パスワード、TmpCsrFileSpec、CAFileSpec、TmpCAPrivateKeyFileSpec、TmpCASerialFileSpec、TmpCerFileSpec、TmpExtFileSpec]
)、False、nil、nil);
割り当てられた場合(ProgressProc)
ProgressProc(13、9、Aborted、Format( '%s ...'、[StConvertCertificate]){'証明書をCERからPEM形式に変換する...'});
// cer => pemをpfxの次のエクスポートコマンドに変換します
RunOpenSSLConsole(形式(
'x509 -in "%s" -inform DER -out "%s" -outform PEM'、
[TmpCerFileSpec、TmpPemFileSpec]
)、False、nil、nil);
割り当てられた場合(ProgressProc)
ProgressProc(13、10、Aborted、Format( '%s ...'、[StCreatePFX]){'Create the PFX certificate file ...'});
//結果のPEMとキーからPFXを作成します
RunOpenSSLConsole(形式(
'pkcs12 -password pass:%s -export -in "%s" -inkey "%s" -name "%s" -out "%s"'、
[パスワード、TmpPemFileSpec、TmpPrivateKeyFileSpec、FileName、TmpPfxFileSpec]
)、False、nil、nil);
OutPublicKeyFileSpec:= TmpPublicKeyFileSpec + '.signed';
割り当てられた場合(ProgressProc)
ProgressProc(13、11、Aborted、Format( '%s ...'、[StExportPublicKey]){'PFX証明書ファイルから公開キーをエクスポート...'});
ExportPublicKeyFromPfx(TmpPfxFileSpec、OutPublicKeyFileSpec、パスワード);
//そして、結果がファイルリストに追加されます
OutFiles.Add(TmpCerFileSpec);
OutFiles.Add(TmpPfxFileSpec);
OutFiles.Add(TmpPrivateKeyFileSpec);
OutFiles.Add(TmpPublicKeyFileSpec);
OutFiles.Add(OutPublicKeyFileSpec);
WasError:= False;
ついに
//一時ファイルを削除します
WasErrorの場合
始める
CheckDeleteFile(TmpCerFileSpec);
CheckDeleteFile(TmpPfxFileSpec);
CheckDeleteFile(TmpPrivateKeyFileSpec);
CheckDeleteFile(TmpPublicKeyFileSpec);
CheckDeleteFile(OutPublicKeyFileSpec);
終わり;
CheckDeleteFile(TmpCsrFileSpec);
CheckDeleteFile(TmpCASerialFileSpec);
CheckDeleteFile(TmpExtFileSpec);
CheckDeleteFile(TmpPemFileSpec);
CheckDeleteFile(TmpCAPrivateKeyFileSpec);
終わり;
終わり;