Penandatanganan HLK dengan HSM
Perkenalan
Topik ini menjelaskan beberapa masalah penyiapan dan konfigurasi yang dapat terjadi saat menggunakan Modul Keamanan Perangkat Keras (HSM) berbasis jaringan pihak ketiga untuk menyimpan Sertifikat Validasi Diperpanjang (EV).
Latar
Kemasan HLK
File paket HLKX menggunakan Konvensi Kemasan Terbuka. Spesifikasinya adalah bagian dari grup kerja ISO, menyiratkan bahwa file HLKX tidak kompatibel dengan Signtool.
Penandatanganan Paket HLK
Ketika HLK menandatangani paket, tanda tangan dan hubungan ditempatkan dalam paket bersama data HLK. Ini adalah data yang System.IO.Packaging.PackageDigitalSignature
menggunakan untuk memvalidasi tanda tangan pada data dalam paket.
Catatan
Saat ini, penandatanganan paket HLK hanya mendukung sertifikat RSA dan DSA, seperti yang ditentukan oleh pustaka .NET yang digunakan untuk menandatangani System.Security.Cryptography.Xml.SignedXml
Penyedia Layanan Kriptografi
Penyedia layanan kriptografi (CSP) berisi implementasi standar dan algoritma kriptografi. Minimal, CSP terdiri dari pustaka tautan dinamis (DLL) yang mengimplementasikan fungsi di CryptoSPI ( antarmuka program sistem). Sebagian besar CSP berisi implementasi semua fungsi mereka sendiri. Namun, beberapa CSP mengimplementasikan fungsinya terutama dalam program layanan berbasis Windows yang dikelola oleh manajer kontrol layanan Windows. Yang lain menerapkan fungsi dalam perangkat keras, seperti kartu pintar atau coprocessor aman. Jika CSP tidak menerapkan fungsinya sendiri, DLL bertindak sebagai lapisan pass-through, memfasilitasi komunikasi antara sistem operasi dan implementasi CSP yang sebenarnya.
Penyimpanan Sertifikat dan Registri
Sertifikat di Penyimpanan Sertifikat semua peta ke DLL CSP yang akan melakukan penandatanganan akhir. Ini dapat dilihat pada entri registri di bawah ini.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider]
"Image Path"="%SystemRoot%\\system32\\dssenh.dll"
"SigInFile"=dword:00000000
"Type"=dword:0000000d
Penandatanganan Paket HLKX dengan Sertifikat yang dihosting oleh HSM Berbasis Jaringan
Konfigurasi Pengontrol
Untuk menyiapkan pengontrol HLK untuk menandatangani dengan sertifikat HSM, berikut ini harus ada pada sistem:
- Otoritas Sertifikat (CA) dari HSM
- File CSP dari HSM
Instruksi tentang cara mengonfigurasi klien HSM dengan komponen ini harus didokumenkan oleh penyedia HSM Anda.
Menandatangani dengan HLK
Jika pengontrol dikonfigurasi dengan benar, Anda harus dapat mengarahkan ke sertifikat dari HSM seperti yang Anda lakukan pada sertifikat yang diinstal secara lokal dari HLK dan menandatangani paket.
Menguji Konfigurasi HSM
Menggunakan Signtool
Langkah pertama untuk memahami apakah kita dapat menandatangani adalah dengan mencoba menandatangani file menggunakan signtool. Ini akan memungkinkan kami memverifikasi bahwa alur kerja penandatanganan berfungsi dengan benar. Pertama kita akan menandatangani file PE (exe atau dll). Misalnya, penandatanganan menggunakan nama:
signtool sign /f HighValue.cer /csp "Hardware Cryptography Module" /kHighValueContainerMyControl.exe
signtool sign /n "My Company Certificate" MyFile.exe
atau untuk menandatangani menggunakan hash SHA1 dari sertifikat yang diinstal:
signtool sign /sha1 0cf1d2f7befc7d143678f86963aef5572b710cf2 MyFile.exe
Nama sertifikat ditemukan di Informasi Subjek dan hash SHA1 ditemukan di Thumbprint. Saat menggunakan hash, hapus semua spasi dan karakter khusus yang ada di hash sehingga formatnya terlihat seperti contoh di atas. Anda juga dapat menandatangani menggunakan file Pertukaran Informasi Pribadi (PFX). Ini kemungkinan besar bukan apa yang ingin Anda lakukan, karena file PFX dapat berisi kunci privat, di mana sertifikat hanya berisi kunci umum.
signtool sign /f certdata.pfx MyFile.exe
Anda dapat memverifikasi tanda tangan menggunakan signtool
signtool verify /v /pa MyFile.exe
Jika Anda dapat menandatangani dan memverifikasi file menggunakan apa pun kecuali file PFX, Anda dapat mencoba menandatangani paket HLK. Jika Anda tidak dapat menandatangani, silakan lihat bagian Pemecahan Masalah.
Menggunakan PackageDigitalSignature
Ada contoh kode penandatanganan menggunakan PackageDigitalSignature
di akhir dokumen ini di bagian Sampel Kode. Anda seharusnya juga mendapatkan file C# lengkap ketika Anda menerima dokumen ini. Untuk menggunakan contoh ini, Anda harus menyediakan jalur lengkap ke paket yang tidak ditandatangani dan thumbprint sertifikat yang akan Anda gunakan untuk penandatanganan. Jika Anda tidak dapat menandatangani, silakan lihat bagian Pemecahan Masalah.
Pemecahan masalah
Penyebab paling mungkin adalah bahwa tidak ada sertifikat dan CSP terkait yang diinstal pada sistem Anda dari HSM Anda. Beberapa hal yang dapat Anda coba adalah sebagai berikut:
- Dapatkah Anda masuk ke sistem ini hanya menggunakan alat yang didukung oleh vendor HSM Anda?
- Apakah vendor HSM Anda menginstal sertifikat dan CSP pada sistem ini?
- Apa saja properti sertifikat?
- Apakah vendor HSM Anda mendukung dan mendokumen menggunakan signtool? Jika file dapat ditandatangani menggunakan Signtool dengan HSM, ini adalah indikator bahwa sistem telah dikonfigurasi dengan benar dan menyiratkan bahwa HLK juga dapat menandatangani paket HLKX.
- Saat menjalankan kode contoh (HSM_example.cs) apa yang dicetak untuk CspKeyContainerInfo.ProviderName
- Apakah nama penyedia tersebut memetakan ke DLL CSP yang disediakan vender yang benar. Informasi tersebut dapat ditemukan di registri seperti yang ditunjukkan di atas.
Sampel Kode
PackageDigitalSignatureManager
public static void Sign(string package, X509Certificate2 certificate)
{
// Open the package to sign it
Package packageToSign = Package.Open(package);
// Specify that the digital signature should exist
// embedded in the signature part
PackageDigitalSignatureManager signatureManager = new PackageDigitalSignatureManager(packageToSign);
signatureManager.CertificateOption = CertificateEmbeddingOption.InCertificatePart;
// We want to sign every part in the package
List<Uri> partsToSign = new List<Uri>();
foreach (PackagePart part in packageToSign.GetParts())
{
partsToSign.Add(part.Uri);
}
// We will sign every relationship by type
// This will mean the signature is invalidated if *anything* is modified in //the package post-signing
List<PackageRelationshipSelector> relationshipSelectors = new List<PackageRelationshipSelector>();
foreach (PackageRelationship relationship in packageToSign.GetRelationships())
{
relationshipSelectors.Add(new PackageRelationshipSelector(relationship.SourceUri, PackageRelationshipSelectorType.Type, relationship.RelationshipType));
}
try
{
signatureManager.Sign(partsToSign, certificate, relationshipSelectors);
}
finally
{
packageToSign.Close();
}
}