GNU/Linux >> Znalost Linux >  >> Linux

Nainstalujte SoftHSM a přistupujte k němu prostřednictvím programu Java

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 softhsm
Stará 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.


Linux
  1. Jak nainstalovat proxychains a přistupovat k internetu přes proxy v CentOS?

  2. Debian – Nainstalovat Java Jdk And Jre na Debian 8?

  3. Jak nainstalovat a spravovat verze Java na Rocky Linux 8

  1. Vydán LibreOffice 7.0 – Nainstalujte jej přes PPA na Ubuntu a Mint

  2. Jak odstranit starou verzi Javy a nainstalovat novou verzi

  3. Povolit procesu bez oprávnění root navázat se na port 80 a 443?

  1. Jak nainstalovat a nakonfigurovat OpenVPN Access Server

  2. Jak nainstalovat Javu (JDK a JRE) na Debian 10

  3. Jak nainstalovat a nakonfigurovat Solr 5.5 na Ubuntu 14.04