Convertire un certificato PEM in JKS

Quando si ottiene un certificato SSL, spesso questo viene fornito in formato PEM. E, quando si crea un server API con Spark Java, bisogna fornire il certificato sotto forma di JKS (Jav Key Store) perchè, andiamo, altrimenti Java non sarebbe Java se non pretendesse le cose a modo suo. Fortunatamente è possibile effettuare una conversione rapida e indolore.

Il certificato PEM di solito viene messo a disposizione mediante tre file distinti:

  • server_certificate.pem: il certificato del server.
  • ca_certificate.pem: il certificato della CA che ha rilasciato il certificato del server.
  • private_key.pem: la chiave privata corrispondente al certificato del server.

Per prima cosa è necessario concatenare il file contenente il certificato server e il file contenente il certificato della CA in un unico file (che qui chiamiamo all_certs, e che potrà poi essere cancellato alla fine della procedura):

cat server_certificate.pem > all_certs
cat ca_certificate.pem >> all_certs

Il file prodotto avrà un aspetto del genere:

-----BEGIN CERTIFICATE-----
MIIC5DCCAcygAwIBAgIBATANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAhNeVRl
....
J53C4xDj8R1GzTxP8vYTtAXiqaveeNmw
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICxjCCAa6gAwIBAgIJAPi2bC4vJmSxMA0GCSqGSIb3DQEBCwUAMBMxETAPBgNV
...
NA5slGJVDXRpI6uFF4M1ae/mzmWiQOhhaIRFrJh9ORFtN/K8JWci1Gjg
-----END CERTIFICATE-----

A questo punto si più create il keystore in formato PKCS12 utilizzando il programma openssl (di solito installato di default su Linux). Viene chiesto di impostare una password per proteggere il file.

openssl pkcs12 \
  -export \
  -clcerts \
  -in all_certs \
  -inkey private_key.pem \
  -out keystore.pkcs12

Il keystore creato viene poi convertito in JKS. Viene chiesta la password del certificato creato nel punto precedente e una nuova password per proteggere il nuovo file. Quest'ultima password deve essere riportata nella configurazione del server rest.

keytool \
  -importkeystore \
  -srckeystore keystore.pkcs12 \
  -srcstoretype pkcs12 \
  -destkeystore keystore.jks \
  -deststoretype jks