2012-10-22

PKCS#12 to GnuPG: Extract and import RSA key

X509 p12 (pfx) file và GnuPG (OpenPGP) không tương thích nhau. Tuy nhiên có thể export RSA key từ p12 file, convert rồi import vào gpg. Theo lý thuyết cả 2 đều thao tác trên public/private cryptography có dùng RSA.


Thực ra nếu xem xét ASCII-armored và PEM chúng ta sẽ thấy khá là giống nhau ngoại trừ BEGIN/END markers thì PGP còn có thêm 1 dòng (line cuối cùng) là checksum. Mình không rõ nhưng theo RFC 4880 là CRC24.

Ví dụ xem xét public key PGP ASCII-armored và RSA PEM

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)

mQINBE9NBIQBEADMSzN6b0FaPP0rGiLDWKfH4ehN66Z0SAIynXm6lBHjmO69pNsm
....
5NsttvIOclBY5A==
=Zqph
-----END PGP PUBLIC KEY BLOCK-----




-----BEGIN RSA PUBLIC KEY-----
mQINBE9NBIQBEADMSzN6b0FaPP0rGiLDWKfH4ehN66Z0SAIynXm6lBHjmO69pNsm
...
5NsttvIOclBY5A==
-----END RSA PUBLIC KEY-----

Tại Sysmic.org có chỉ cách convert từ OpenSSL sang GnuPG tuy nhiên là gpgsm (with S/MIME)

Có thể thực hiện như sau:
sudo apt-get install dirmngr
GPG_TTY="tty"
gpgsm --import -v file.p12

Tuy nhiên không thể dùng với gpg. Nếu làm manual thì có lẽ rất vất vả, phải nói là không khả thi. Để import RSA key từ OpenSSL sang GPG mình thực hiện như sau:

Extract private key with passphrase
openssl pkcs12 -in file.p12 -nocerts -out private.pem

Remove passphrase
openssl rsa -in private.pem -out rsa-private.key

Dùng pem2openpgp để convert sang OpenPGP với một string là $USERID (lưu ý install monkeysphere trước để có pem2openpgp)

PEM2OPENPGP_USAGE_FLAGS=authenticate,certify,sign pem2openpgp "Some desc for User ID <any@gmail.com>" < rsa-private.key | gpg --import

Lưu ý: biến môi trường PEM2OPENPGP_USAGE_FLAGS xác định usage là SCA, mặc định pem2openpgp sẽ convert với usage là certify.

gpg: key AC37D3E3: secret key imported

gpg: key AC37D3E3: public key "Some desc for User ID <any@gmail.com>" imported


gpg: Total number processed: 1

gpg:               imported: 1  (RSA: 1)
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

$ gpg --list-secret-keys
/home/xxxx/.gnupg/secring.gpg
------------------------------
sec   2048R/AC37D3E3 2012-10-22
uid                 

Some desc for User ID

<
any@gmail.com

>

Sau khi import xong nhớ thực hiện --edit-key với ID eg 
AC37D3E3 thực hiện enable và trust