GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Installieren Sie SoftHSM und greifen Sie über das Java-Programm darauf zu

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 softhsm
Alte 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.


Linux
  1. Wie installiere ich Proxychains und greife über Proxy in CentOS auf das Internet zu?

  2. Debian – Installieren Sie Java Jdk und Jre auf Debian 8?

  3. LibreOffice 7.0 veröffentlicht – Installieren Sie es über PPA auf Ubuntu und Mint

  4. So installieren und verwalten Sie Java-Versionen unter Rocky Linux 8

  5. Nicht-Root-Prozess erlauben, sich an Port 80 und 443 zu binden?

So installieren Sie Oracle Java 8 auf Ubuntu 16.10 über PPA

So installieren Sie Java unter Ubuntu und Linux Mint

So installieren Sie Java 16 in Rocky Linux und AlmaLinux

So installieren und verwalten Sie Java unter Debian 11

So installieren Sie Tomcat und Java unter CentOS 8

Remotezugriff auf Windows 10 über Ubuntu Linux und Vise Versa