Generare chiavi e certificati per SSO

Google Workspace offre il servizio Single Sign-On (SSO) ai clienti con Google Workspace o Google Workspace for Education. Il servizio Single Sign-On di Google Workspace accetta chiavi pubbliche e certificati generati con gli algoritmi RSA o DSA. Per utilizzare il servizio, è necessario generare una coppia costituita da una chiave pubblica e una chiave privata nonché un certificato X.509 che contenga la chiave pubblica. Una volta creati la chiave pubblica o il certificato, devi registrarli su Google. A tale scopo, è sufficiente caricare la chiave o il certificato tramite la Console di amministrazione Google.

La modalità di generazione di chiavi e certificati spesso dipende dalla piattaforma di sviluppo e dal linguaggio di programmazione in uso. Di seguito sono riportati diversi modi per generare le chiavi e il certificato richiesti dal servizio SSO di Google Workspace.

Se utilizzi OpenSSL

Anche se ci sono diversi metodi per creare coppie di chiavi pubbliche e private, lo strumento open source OpenSSL è uno dei più comunemente utilizzati. Lo strumento è stato reso disponibile in tutte le principali piattaforme e fornisce un'interfaccia a riga di comando di facile utilizzo per la generazione delle chiavi.

Creare la chiave privata RSA

La generazione di chiavi private RSA con OpenSSL richiede un unico passaggio:

openssl genrsa -out rsaprivkey.pem 2048

Questo comando genera una chiave privata con codifica PEM e la archivia nel file rsaprivkey.pem. Questo esempio crea una chiave a 2048 bit che dovrebbe essere adatta a quasi tutti gli scopi. La chiave privata risultante deve essere mantenuta segreta e utilizzata per firmare e decriptare i dati.

Alcune implementazioni, in particolare quelle basate su Java, potrebbero richiedere l'utilizzo dei formati DER o PKCS8 che, ad esempio, possono essere generati utilizzando i seguenti passaggi aggiuntivi:

  1. openssl rsa -in rsaprivkey.pem -pubout -outform DER -out rsapubkey.der
  2. openssl pkcs8 -topk8 -inform PEM -outform DER -in rsaprivkey.pem -out rsaprivkey.der -nocrypt

Il passaggio 1 genera la chiave pubblica in formato DER.

Il passaggio 2 genera la chiave privata nei formati pkcs8 e DER. Una volta generate, puoi utilizzare queste chiavi (rsapubkey.der e rsaprivkey.der).

Creare una chiave privata DSA

La generazione di chiavi DSA comporta due passaggi:

  1. openssl dsaparam -out dsaparam.pem 2048
  2. openssl gendsa -out dsaprivkey.pem dsaparam.pem

Nel primo passaggio viene creato un file di parametri DSA, dsaparam.pem, che in questo caso contiene le istruzioni utilizzate da OpenSSL per creare una chiave a 2048 bit nel passaggio 2. Il file dsaparam.pem non è una chiave e può essere eliminato dopo la creazione delle chiavi pubblica e privata. Nel secondo passaggio viene creata la chiave privata vera e propria, che viene salvata nel file dsaprivkey.pem, che deve essere tenuto segreto.

Per esportare la chiave nel formato binario DER puoi eseguire i seguenti passaggi:

  1. openssl dsa -in dsaprivkey.pem -outform DER -pubout -out dsapubkey.der
  2. openssl pkcs8 -topk8 -inform PEM -outform DER -in dsaprivkey.pem -out dsaprivkey.der -nocrypt

Il primo passaggio estrae la chiave pubblica in un formato DER.

Il passaggio 2 converte la chiave privata nei formati pkcs8 e DER. Una volta eseguita questa operazione, puoi utilizzare la coppia di chiavi pubblica (dsapubkey.der) e privata (dsaprivkey.der).

Crea un certificato

Una volta creata la coppia di chiavi, creare un certificato X.509 è semplice. Il certificato contiene la chiave pubblica corrispondente e alcuni metadati relativi all'organizzazione che ha creato il certificato. Segui questo passaggio per creare un certificato autofirmato da una chiave privata RSA o DSA:

openssl req -new -x509 -key dsaprivkey.pem -out dsacert.pem

Dopo aver risposto ad alcune domande, il certificato verrà creato e salvato come dsacert.pem. Questo è il file che carichi su Google Workspace tramite il pannello di controllo quando configuri SSO.

Creare un'impronta del certificato

Alcune applicazioni richiedono un'impronta del certificato X.509 invece del certificato stesso. Un'impronta è una sintesi del certificato in formato binario x509. Il tipo di impronta dipende dall'algoritmo utilizzato per generarla, ad esempio SHA-1 o SHA-256.

Per creare un'impronta digitale SHA-256 da un certificato X.509, utilizza il seguente comando (sostituendo il nome del file .pem con quello del tuo certificato):

openssl x509 -noout -fingerprint -sha256 -inform pem -in "GoogleIDPCertificate-domain.com.pem"

Se utilizzi Microsoft Visual Studio per .NET

Microsoft Visual Studio 2005 fornisce utilità (nella directory Common7ToolsBin) che possono essere utilizzate per generare un certificato da utilizzare con Google Workspace. Esegui i passaggi indicati di seguito per creare la coppia di chiavi pubblica e privata e il certificato in .NET:

  1. makecert -r -pe -n "CN=Test Certificate" -sky exchange -sv testcert.pvk testcert.cer
  2. pvk2pfx -pvk testcert.pvk -spc testcert.cer -pfx testcert.pfx

Per impostazione predefinita, i comandi riportati sopra utilizzano l'algoritmo RSA. Il passaggio 1 utilizza lo strumento di creazione certificati (makecert.exe) per creare un certificato X.509 autofirmato denominato testcert.cer e la chiave privata corrispondente.

Il passaggio 2 utilizza lo strumento pvk2pfx (pvk2pfx.exe) per creare un file per lo scambio di informazioni personali (PFX) da un file CER e PVK. Il file PFX contiene sia la chiave pubblica sia quella privata.

Il file testcert.cer creato nel passaggio 1 può essere caricato in Google Workspace utilizzando il Pannello di controllo, mentre testcert.pfx del passaggio 2 può essere utilizzato per creare un'istanza di X509Certificate2 (.NET 2.0 e versioni successive) per firmare la risposta SAML.

Utilizzo di Keytool in Java

Gli sviluppatori Java possono utilizzare l'utilità keytool disponibile nel JDK standard per creare la coppia di chiavi pubblica/privata e il certificato X.509. keytool è un'utilità di gestione di chiavi e certificati che consente agli utenti di amministrare le proprie coppie di chiavi pubbliche/private e i certificati associati per l'utilizzo in schemi di autenticazione che richiedono firme digitali. keytool archivia chiavi e certificati in un "keystore" che, per l'implementazione predefinita, è semplicemente un file (.keystore) nella home directory dell'utente. Le chiavi private sono protette da password.

Creare coppie di chiavi DSA

  1. keytool -genkey -alias dsassokey -keyalg "DSA" -keysize 2048 -validity 180 -sigalg "SHA256withDSA"
  2. keytool -export -alias dsassokey -file dsasso.cer

Il passaggio 1 genera una coppia di chiavi pubblica/privata a 2048 bit con una validità di 180 giorni utilizzando l'algoritmo DSA.

Il passaggio 2 genera un certificato X.509 (dsasso.cer) dalla chiave pubblica. Puoi quindi caricare dsasso.cer su Google Workspace utilizzando il Pannello di controllo.

Creare coppie di chiavi RSA

  1. keytool -genkey -alias rsassokey -keyalg "RSA" -keysize 2048 -validity 180
  2. keytool -export -alias rsassokey -file rsasso.cer

Il passaggio 1 genera una coppia di chiavi pubblica/privata a 2048 bit con una validità di 180 giorni utilizzando l'algoritmo RSA.

Il passaggio 2 genera un certificato X.509 (rsasso.cer) dalla chiave pubblica. Puoi quindi caricare rsasso.cer su Google Workspace utilizzando il Pannello di controllo.

Utilizzo di Java Cryptography Architecture

Java Cryptography Architecture (JCA) fornisce un insieme di classi e interfacce di base per generare e manipolare proprietà relative alla sicurezza. JCA include le parti correlate alla crittografia dell'API relativa alla sicurezza dell'SDK di Java 2. Utilizzando questa API puoi generare facilmente le coppie di chiavi pubblica e privata utilizzando l'algoritmo che ritieni più appropriato. Di seguito è riportato un codice di esempio che crea chiavi DSA o RSA da utilizzare con il servizio SSO di Google Workspace.

Creare una coppia di chiavi pubblica e privata

import java.io.*;
import java.security.*;

public class KeyGenDSA {

  public static void main(String[] args) {
        try {
          KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
          SecureRandom random = SecureRandom.getInstanceStrong();
          keyGen.initialize(2048, random);

          KeyPair pair = keyGen.generateKeyPair();
          PrivateKey priv = pair.getPrivate();
          PublicKey pub = pair.getPublic();

          byte[] encPriv = priv.getEncoded();
          FileOutputStream privfos = new FileOutputStream("DSAPrivateKey.key");
          privfos.write(encPriv);
          privfos.close();

          byte[] encPub = pub.getEncoded();
          FileOutputStream pubfos = new FileOutputStream("DSAPublicKey.key");
          pubfos.write(encPub);
          pubfos.close();

   } catch (Exception e) {
         e.printStackTrace();
   }
  }
}

Il codice riportato sopra utilizza KeyPairGenerator per creare una coppia di chiavi DSA. Le chiavi generate saranno in formato binario e verranno salvate in singoli file. Una volta generate le chiavi, puoi registrare la chiave pubblica in Google Workspace e utilizzare la chiave privata per firmare il tuo SAMLResponse. Per generare una coppia di chiavi RSA invece di chiavi DSA, devi semplicemente sostituire "DSA" con "RSA" nel codice.

Registrare il certificato o la chiave pubblica in Google Workspace

Una volta completate le operazioni più articolate necessarie per creare le chiavi e i certificati, la fase successiva è piuttosto semplice. Per registrare il certificato o la chiave pubblica in Google Workspace, devi aprire la Console di amministrazione e accedere come amministratore. Seleziona Sicurezza, poi Configura Single Sign-On (SSO) e compila tutti i campi della pagina in Configura SSO con provider di identità di terze parti.