Bagikan melalui


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();
  }
}