SoftHSM ist eine Software-Implementierung von HSM (Hardware Security Module) und zielt darauf ab, alle Funktionen auszuführen, die ein richtiges HSM ausführen würde, ohne die Hardware-Sicherheitsschutzmaßnahmen bereitzustellen, die ein echtes HSM bietet. Wenn Sie ein Benutzer sind, der nicht bereit ist, in ein neues Hardwaregerät zu investieren, können Sie SoftHSM verwenden, einen kryptografischen Speicher, auf den über eine PKCS#11-Schnittstelle zugegriffen werden kann. Es wurde im Rahmen des OpenDNSSEC-Projekts entwickelt, um die Anforderungen von OpenDNSSEC zu erfüllen, kann aber aufgrund seiner PKCS#11-Schnittstelle auch mit anderen kryptografischen Produkten zusammenarbeiten. Dieser Artikel hilft Ihnen bei der Installation von SoftHSM.
So installieren Sie SoftHSM
Sie können SoftHSM auf mehrere Arten installieren. Sehen wir uns zunächst Paketmanager wie apt-get
an für Ubuntu und yum
für CentOS.
SoftHSM hängt von der folgenden kryptografischen Bibliothek und ihrer erforderlichen Version ab:
Botan 2.0.0 (Use at least 2.6.0 for better performance) or OpenSSL 1.0.0
So installieren Sie SoftHSM auf Ubuntu
Verwenden Sie die folgenden Befehle, um SoftHSM zu installieren
# sudo apt-get install softhsmAlte SoftHSM-Version
Wenn die SoftHSM-Version alt ist und Sie die neueste Version benötigen, folgen Sie der Quellinstallation unten.
So installieren Sie SoftHSM auf CentOS
Verwenden Sie YUM, um SoftHSM zu installieren
$ sudo yum install softhsm
Sie können auch das SoftHSM-RPM-Paket herunterladen und wie folgt installieren:
$ 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
So installieren Sie SoftHSM durch Quellkompilierung
Stellen Sie sicher, dass Sie GNU Autotools (Autoconf, Automake, Libtool) zum Erstellen der Software haben. Es wird auch empfohlen, pkg-config
zu installieren damit das configure-Skript die installierte Software finden kann. Sie benötigen außerdem libp11-kit-dev
um SoftHSM als PKCS#11-Modul auf dem System zu installieren.
Schritt 1: Stellen Sie sicher, dass die Git-Pakete automake, autoconf, libtool, pkg-config installiert sind
Schritt 2: Laden Sie das SoftHSM-Paket herunter
# git clone https://github.com/opendnssec/SoftHSMv2.git # cd SoftHSMv2
Schritt 3: Konfigurieren Sie das Installationsskript
$ ./configure
Folgen Sie, wenn Sie feststellen, dass die OpenSSL-Bibliothek keine GOST-Unterstützung hat
Schritt 4: Kompilieren
$ make
Schritt 5: Installieren Sie SoftHSM
$ sudo make install
So verwenden Sie SoftHSM
Nach der Installation von SoftHSM können Sie wie unten gezeigt über die Befehle des SoftHSM-Dienstprogramms darauf zugreifen.
$ softhsm2-util
Um das Softtoken zu initialisieren, führen Sie den folgenden Befehl aus:
$ softhsm2-util --init-token --slot 0 --label "encryptionkey"
Beim Initialisieren des Softtokens werden Sie aufgefordert, die Benutzer-PIN und die SO-PIN festzulegen. Die Benutzer-PIN wird von einer Anwendung verwendet, um mit dem Token und dem SO-Pin zu interagieren zum Reinitialisieren des Tokens. Sie müssen sich also den Pin merken, den Sie setzen werden.
Der folgende Befehl listet Slots auf:
$ 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:
Das SoftHSM wurde erfolgreich installiert und konfiguriert. Sollen wir jetzt programmatisch mit ihm kommunizieren?
Um mit SoftHSM zu kommunizieren, müssen wir eine Konfigurationsdatei erstellen, die im Stammverzeichnis des Projekts gespeichert werden muss.
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 }Steckplatz ersetzen
Sie müssen die Steckplatz-ID durch Ihre eigene ersetzen.
Lassen Sie mich Sie durch ein Java-Programm zur Kommunikation mit SoftHSM führen. Das Programm nimmt einen String als Eingabe, verschlüsselt ihn und entschlüsselt ihn wieder für uns.
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 { } } }
Beispielausgabe:
Wenn Sie mit einem Fehler stecken bleiben:Unzulässige Blockgrößenausnahme – CKR_ENCRYPTED_DATA_LEN_RANGE, dann ist hier die Lösung, um dasselbe zu beheben.