X.509 (* .cer拡張子のファイル)は、一般情報(バージョン、シリアル番号、署名アルゴリズム、発行者情報、有効期限、所有者情報、電子指紋)に加えて、公開鍵を含む証明書形式です。 暗号化されたメッセージを交換したい他のユーザーに送信します。
PKCS#12 (* .pfx拡張子のファイル)は、一般的な情報に加えて、公開キーだけでなく秘密キーも含むことができる唯一の証明書形式です。 それを使用して、公開鍵を使用して他のユーザーによって暗号化されたメッセージを復号化し、デジタル署名も入れます。
証明機関として機能するCyberSafe暗号化プログラムを使用して証明書を作成します。 CyberSafe Certification Authorityのルート証明書はWindowsの信頼できるトラスティに自動的に追加され、PKCS#12証明書は個人セクションに、X.509はその他のユーザーセクションに保存されます 。
最初に、上記の証明書、公開鍵と秘密鍵、およびその他の情報を含む個人証明書を作成します。 プログラムを起動し、[ キーと証明書 ]タブに移動して、[ 作成 ]を選択し、必要なフィールドに入力して、[ 次へ ]をクリックします。
キーが生成され、証明書が作成されてプログラムデータベースに書き込まれます。 [作成後に公開 ]オプションが選択された場合、証明書はCyberSafeサーバーで公開され、公開鍵は他のユーザーにダウンロード可能になります。
次に、Outookで作業する必要がある証明書を個別のファイルにエクスポートします。
CyberSafeの証明書はOpenSSLライブラリに基づいて作成されます。証明書を作成するためのコードは次のとおりです。
コードを表示
プロシージャ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.html
TmpExtFileSpec:= 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);
終わり;
終わり;
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.html
TmpExtFileSpec:= 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);
終わり;
終わり;
エクスポートされた証明書をPKCS#12形式でWindowsストアにインストールします。 これを行うには、pfxファイルをダブルクリックし、証明書のインポートウィザードの指示に従います。 この証明書には秘密鍵が含まれているため、インポートプロセス中に、作成時に指定されたパスワードを入力する必要があります。
次に、Outlookを開き、 [ファイル]> [設定]> [セキュリティセンター]> [セキュリティセンターの設定]> [メール保護]に移動します。 [ 暗号化された電子メール]セクションで、[daws]のボックスをオンにします。
- 送信メッセージのコンテンツと添付ファイルを暗号化する
- 送信メッセージにデジタル署名を追加する
次に、ストアにインストールされている証明書のリストから、デジタル署名の暗号化と作成に使用する証明書を選択する必要があります。 これを行うには、[ オプション... ]をクリックし、証明書を選択して選択します。
それは基本的にすべてです:)。 ただし、すべてが正しく機能することを確認し、「自分用に」暗号化チェックを実行しましょう。
新しい連絡先を作成します。 [ホーム]> [連絡先]> [連絡先の作成]をクリックします。 [全般]タブで、[ 氏名]および[ メール]フィールドに入力するだけです。 mail 、その後、[ 証明書 ]タブに移動し、[ インポート ]をクリックします。
Windowsエクスプローラーで、* .cer形式の証明書を見つけます
証明書がインポートされ、 証明書(デジタル署名)ウィンドウに表示されていることを確認します。 [ 保存して閉じる]をクリックします 。 これで、暗号化されたメッセージを自分で送信できます。 これを行うには、 [メール]> [ホーム]> [メッセージの作成]に移動します 。 [ 宛先]フィールドで、アドレス帳から選択して連絡先を追加します。
手紙を送る。 受信トレイに移動し、そこに送信したメッセージを見つけます。 左上隅に青いロックが付いたアイコンが示すように、暗号化されています。 それをマウスでクリックして、自動的に復号化して開きます。
送信されたレターが受信ボックスに表示されない場合は、[ 送受信 ]タブに移動し、[ フォルダーの更新 ]をクリックします 。
メッセージのセキュリティプロパティまたはデジタル署名に関する情報を表示するには、メッセージに関する一般情報を含むフィールドの対応するアイコンをクリックします。
「それ自体」での暗号化機能の検証が完了しました。
次に、デジタル署名で認証されたメッセージを他のユーザーに送信し、署名されたメッセージを取得します。 これにより、署名されたレターに公開鍵が含まれるため、公開鍵を相互に交換できます。
別のユーザーからこのような手紙を受け取ったら、それを連絡先 (アドレス帳)に追加します。 次に、X.509ユーザー証明書をファイルにエクスポートし、Windowsストアにインストールする必要があります。 これを行うには、レターに関する一般情報を含むフィールドで、デジタル署名アイコンをクリックします [ 詳細]> [ 詳細]> [証明書を表示]> [構成]> [ファイルにコピー]を選択し、証明書エクスポートウィザードの指示に従います 。 「自分用に」暗号化機能をチェックしたときと同じ方法で、エクスポートされた証明書をユーザーの連絡先に追加します。
まだ証明書(および通信員の公開鍵)を持っていない場合、最初のメッセージを送信するとき、暗号化機能を無効にする必要があります。そうしないと、Outlookは暗号化できず、エラーが発生します。 [設定 ]タブで、暗号化機能を無効にして、デジタル署名機能を有効のままにすることができます。
結論として、公開鍵をCyberSafeサーバーなどの公開鍵サーバーで公開することにより、公開鍵を他のユーザーが利用できるようにすることができます。 当然、そこにあなたが興味を持っているユーザーの公開鍵を見つけようとすることもできます。
公開キーが信頼できないサーバーからダウンロードされた場合、または電子メールで受信した場合、そのようなキーが本物であることを確認することはできません。 この攻撃者は、友人のキーの代わりに「偽の」キーを送信したことが判明する場合があります。 その後、彼はあなたがあなたの友人に送信するすべての暗号化されたメッセージを読むことができますが、あなたの友人はこれを行うことができません。
したがって、この場合、公開鍵の信頼性は電子指紋によって検証する必要があります。 指紋を確認する最も簡単な方法の1つは、Skypeまたは電話で公開キーの所有者に電話をかけることです。