Project

General

Profile

Actions

Ricodificare un file PKCS12 per OpenVPN con OpenSSL

Può capitare che con dei certificati PKCS12 di OpenVPN generati prima del passaggio a OpenSSL 3, che depreca una serie di codifiche interne degli stessi, questi diventino illeggibili sulle macchine che hanno questa nuova versione, rendendo impossibile lanciare il servizio. Questo accade in particolare nel passaggio di OpenVPN da Bullseye a Bookworm, che quando si utilizza un .p12 generato con una vecchia versione. In questo caso OpenVPN fallisce con un errore del tipo:

2023-10-02 17:06:30 OpenSSL: error:11800071:PKCS12 routines::mac verify failure
2023-10-02 17:06:30 OpenSSL: error:0308010C:digital envelope routines::unsupported
2023-10-02 17:06:30 Decoding PKCS12 failed. Probably wrong password or unsupported/legacy encryption
2023-10-02 17:06:30 Error: private key password verification failed
2023-10-02 17:06:30 Exiting due to fatal error

che è abbastanza fuorviante, perché pure se dovuto alla seconda ipotesi della terza riga (unsupported/legacy encryption) riportando come errore finale: "private key password verification failed" induce a pensare ad un errore nella password che nel caso non c'è.

Quando si usa direttamente openssl l'errore si verifica ad esempio provando ad esportare i dati del certificato in formato PEM, e ad esempio si ottiene:

root@bookworm:~# openssl pkcs12 -in cert.p12 -out temp.pem --nodes
Enter Import Password:
Error outputting keys and certificates
4067C4EF727F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:373:Global default library context, Algorithm (RC2-40-CBC : 0), Properties ()

ed in questo caso l'errore è molto più chiaramente identificabile.

Dato che il problema è nella codifica del .p12 e non nei certificati, per poterli utilizzare con OpenSSL 3.0 occorre eseguire l'esportazione degli stessi e poi ricodificare un certificato .p12 con un algoritmo supportato. Per questo si deve eseguire l'esportazione con l'opzione aggiuntiva --legacy che consente di leggere i dati anche con le codifiche non più supportate, eseguendo:

openssl pkcs12 -in cert.p12 -out temp.pem --nodes --legacy

che genera un .pem con tutte le informazioni contenute nel .p12 da cui poi si potrà passare a ricreare un PKCS12 ex-novo con codifica corretta con:

openssl pkcs12 -export -in temp.pem -out nuovo.p12

che richiede due volte una passphrase e salva il nuovo certificato in nuovo.p12.

Updated by Simone Piccardi 5 months ago · 2 revisions