SoftHSM je softwarová implementace HSM (Hardware Security Module), jejímž cílem je provádět všechny funkce, které by vykonával správný HSM, aniž by poskytoval hardwarové bezpečnostní ochrany poskytované skutečným HSM. Pokud jste uživatel, který není ochoten investovat do nového hardwarového zařízení, můžete použít SoftHSM, což je kryptografické úložiště přístupné přes rozhraní PKCS#11. Je vyvinut jako součást projektu OpenDNSSEC navrženého tak, aby splňoval požadavky OpenDNSSEC, ale může také spolupracovat s jinými kryptografickými produkty díky rozhraní PKCS#11. Tento článek vám pomůže nainstalovat SoftHSM.
Jak nainstalovat SoftHSM
SoftHSM můžete nainstalovat několika způsoby. Nejprve se podívejme na správce balíčků, jako je apt-get
pro Ubuntu a yum
pro CentOS.
SoftHSM závisí na níže uvedené kryptografické knihovně a její požadované verzi:
Botan 2.0.0 (Use at least 2.6.0 for better performance) or OpenSSL 1.0.0
Jak nainstalovat SoftHSM na Ubuntu
K instalaci SoftHSM
použijte níže uvedené příkazy# sudo apt-get install softhsmStará verze SoftHSM
Pokud je verze SoftHSM stará a potřebujete nejnovější verzi, postupujte podle zdrojové instalace níže.
Jak nainstalovat SoftHSM na CentOS
K instalaci SoftHSM
použijte YUM$ sudo yum install softhsm
Můžete si také stáhnout balíček SoftHSM rpm a nainstalovat jej níže:
$ wget http://mirror.centos.org/centos/7/os/x86_64/Packages/softhsm-2.1.0-3.el7.x86_64.rpm
$ sudo yum install softhsm-2.1.0-3.el7.x86_64.rpm -y or $ sudo rpm -Uvh softhsm-2.1.0-3.el7.x86_64.rpm
Jak nainstalovat SoftHSM prostřednictvím kompilace zdroje
Ujistěte se, že máte k sestavení softwaru GNU Autotools (Autoconf, Automake, Libtool). Doporučuje se také nainstalovat pkg-config
aby konfigurační skript mohl najít nainstalovaný software. Potřebujete také libp11-kit-dev
nainstalovat SoftHSM jako modul PKCS#11 do systému.
Krok 1: Ujistěte se, že máte nainstalované balíčky automake, autoconf, libtool, pkg-config git
Krok 2: Stáhněte si balíček SoftHSM
# git clone https://github.com/opendnssec/SoftHSMv2.git # cd SoftHSMv2
Krok 3: Nakonfigurujte instalační skript
$ ./configure
Postupujte, pokud zjistíte, že knihovna OpenSSL nemá podporu GOST
Krok 4: Kompilace
$ make
Krok 5: Nainstalujte SoftHSM
$ sudo make install
Jak používat SoftHSM
Po instalaci SoftHSM k němu můžete přistupovat pomocí příkazů nástroje SoftHSM, jak je uvedeno níže.
$ softhsm2-util
Chcete-li inicializovat softwarový token, proveďte níže uvedený příkaz:
$ softhsm2-util --init-token --slot 0 --label "encryptionkey"
Při inicializaci softwarového tokenu budete požádáni o nastavení PIN uživatele a kódu SO. Uživatelský PIN je používán aplikací k interakci s tokenem a SO pinem pro reinicializaci tokenu. Musíte si tedy zapamatovat pin, který se chystáte nastavit.
Níže uvedený příkaz zobrazí seznam slotů:
$ softhsm2-util --show-slots Available slots: Slot 462451351 Slot info: Description: SoftHSM slot ID 0x1b907297 Manufacturer ID: SoftHSM project Hardware version: 2.5 Firmware version: 2.5 Token present: yes Token info: Manufacturer ID: SoftHSM project Model: SoftHSM v2 Hardware version: 2.5 Firmware version: 2.5 Serial number: 360a5ad59b907297 Initialized: yes User PIN init.: yes Label: encryptionkey Slot 1 Slot info: Description: SoftHSM slot ID 0x1 Manufacturer ID: SoftHSM project Hardware version: 2.5 Firmware version: 2.5 Token present: yes Token info: Manufacturer ID: SoftHSM project Model: SoftHSM v2 Hardware version: 2.5 Firmware version: 2.5 Serial number: Initialized: no User PIN init.: no Label:
To je vše, SoftHSM byl úspěšně nainstalován a nakonfigurován. Budeme s ním nyní komunikovat programově?
Abychom mohli komunikovat se SoftHSM, musíme vytvořit konfigurační soubor, který musí být uložen v kořenovém adresáři projektu.
name = SoftHSM library = /usr/local/lib/softhsm/libsofthsm2.so slot = 462451351 attributes(generate, *, *) = { CKA_TOKEN = true } attributes(generate, CKO_CERTIFICATE, *) = { CKA_PRIVATE = false } attributes(generate, CKO_PUBLIC_KEY, *) = { CKA_PRIVATE = false }Vyměňte slot
Musíte nahradit ID slotu svým vlastním.
Dovolte mi, abych vás provedl Java programem pro komunikaci se SoftHSM. Program vezme řetězec jako vstup, zašifruje jej a dešifruje zpět.
package tg.blr; import java.io.FileWriter; import java.io.IOException; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.Provider; import java.security.Security; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.util.Scanner; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class SoftHsmTest { private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding"; public static String encodedString = new String(); static { Security.addProvider(new BouncyCastleProvider()); } static byte[] decryptbytes; public static void main(String[] args) { System.out.println("Enter the text to be encrypted: "); Scanner s = new Scanner(System.in); String inputtext = s.nextLine(); s.close(); try { String filePath = "/usr/local/lib/softhsm/libsofthsm2.so"; //To create softhsm.cfg FileWriter fw = new FileWriter("softhsm.cfg"); fw.write("name = SoftHSM\n" + "library = " + filePath); //Change the slot ID fw.write("\n slot = 462451351\n" + "attributes(generate, *, *) = {\n"); fw.write("\t CKA_TOKEN = true\n}\n" + "attributes(generate, CKO_CERTIFICATE, *) = {\n"); fw.write("\t CKA_PRIVATE = false\n}\n" + "attributes(generate, CKO_PUBLIC_KEY, *) = {\n"); fw.write("\t CKA_PRIVATE = false\n}\n"); fw.close(); } catch (IOException e2) { e2.printStackTrace(); } String pkcs11ConfigData = "softhsm.cfg"; Provider pkcs11Provider = Security.getProvider("SunPKCS11"); pkcs11Provider = pkcs11Provider.configure(pkcs11ConfigData); if (-1 == Security.addProvider(pkcs11Provider)) { throw new RuntimeException("could not add security provider"); } else { System.out.println("provider initialized !!!"); } Security.addProvider(pkcs11Provider); //User pin created while initializing soft token char[] pin = "sukumar123".toCharArray(); KeyStore keyStore; try { keyStore = KeyStore.getInstance("PKCS11", pkcs11Provider); keyStore.load(null, pin); SecretKeySpec secretKeySpec = new SecretKeySpec("0123456789ABCDEF".getBytes(), 0, 16, "AES"); Key key = new SecretKeySpec(secretKeySpec.getEncoded(), 0, 16, "AES"); keyStore.setKeyEntry("AA", key, "sukumar123".toCharArray(), null); keyStore.store(null); SecretKey key1 = (SecretKey) keyStore.getKey("AA", "sukumar123".toCharArray()); System.out.println("the algorithm: "+key1.getAlgorithm()+", the key: "+key1.toString()+", format: "+key1.serialVersionUID); String encryptedString = performEncryption(key1, inputtext); System.out.println("encryptedString : "+encryptedString); performDecryption(key1, encryptedString); } catch (KeyStoreException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (UnrecoverableKeyException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } private static String performEncryption(Key secretKey, String inputtext) throws Exception { String encryptedText = new String(); Cipher cipher; try { cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] cipherText = cipher.doFinal(inputtext.getBytes("utf-8")); encryptedText = java.util.Base64.getEncoder().encodeToString(cipherText); } catch (NoSuchAlgorithmException e) { System.out.println("No such algorithm exception"); e.printStackTrace(); } catch (NoSuchPaddingException e) { System.out.println("No such padding exception"); e.printStackTrace(); } catch (InvalidKeyException e) { System.out.println("Invalid key exception"); e.printStackTrace(); } catch (IllegalBlockSizeException e) { System.out.println("Illegal block size exception"); e.printStackTrace(); } catch (BadPaddingException e) { System.out.println("Bad padding exception"); e.printStackTrace(); } finally { } return encryptedText; } private static void performDecryption(Key key, String encryptedString) throws Exception { Key secretKey = key; Cipher cipher; try { cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] deciphered = cipher.doFinal(java.util.Base64.getDecoder().decode(encryptedString)); System.out.println("decrypted text: "+new String(deciphered)); } catch (NoSuchAlgorithmException e) { System.out.println("No such algorithm exception"); e.printStackTrace(); } catch (NoSuchPaddingException e) { System.out.println("No such padding exception"); e.printStackTrace(); } catch (InvalidKeyException e) { System.out.println("Invalid key exception"); e.printStackTrace(); } catch (IllegalBlockSizeException e) { System.out.println("Illegal block size exception"); e.printStackTrace(); } catch (BadPaddingException e) { System.out.println("Bad padding exception"); e.printStackTrace(); } finally { } } }
Ukázkový výstup:
Pokud narazíte na chybu:Výjimka pro neplatnou velikost bloku – CKR_ENCRYPTED_DATA_LEN_RANGE, pak je zde řešení, jak to opravit.