3

I have a certificate ("gridcert.p12") in PKCS12 format that I'm trying to convert to a keypair that I can use in PuTTY.

I'm using OpenSSL to convert the PKCS12 file to a pair of PEM files, one for a private key, the other for a public key. However, PuTTY won't accept the PEM keys. Hence, I am trying to convert the private PEM key to PPK format via the PuTTY Key Generator ("puttygen.exe"). When I try to load the key, however, the PuTTY Key Generator gives me the titular error message.

My work documentation is pasted below. Any ideas are greatly appreciated.

# 12:45 22.04.2015 #

goal: convert "gridcert.p12" to a PuTTY-useable keypair.

first, secluded prior work to subdirectory "old attempts".
i decided to keep "gridcert.p12" as-is, rather than regenerate it.

current OpenSSL version is "OpenSSL 1.0.2 22 Jan 2015" by The OpenSSL Project.
no snapshot; just the stable release.
it's meant for a 32-bit system, i think (it's stored in directory "OpenSSL-Win32").

current download of "putty.exe" and "puttygen.exe" from Simon Tatham (http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html).
downloaded versions for Windows on Intel x86.
"puttygen.exe": beta 0.64.0.0
"putty.exe"   : beta 0.63.10188.0

using Windows 8.1 on 64-bit Acer laptop.

created mixed public/private key file with:
    13:05:21,98>C:\OpenSSL-Win32\bin\openssl pkcs12 -in gridcert.p12 -out keys.pem -nodes
    Enter Import Password:
    MAC verified OK

created individual private and public keys, respectively, with:
    13:10:40,36>C:\OpenSSL-Win32\bin\openssl pkcs12 -in gridcert.p12 -out privatekey.pem -nodes -nocerts
    Enter Import Password:
    MAC verified OK

    13:11:25,53>C:\OpenSSL-Win32\bin\openssl pkcs12 -in gridcert.p12 -out publickey.pem -nodes -nokeys
    Enter Import Password:
    MAC verified OK

both keys start with "MII" and end with "==".
the private key starts with "MIIEvwIBADANBgk...".
the public key starts with "MIIIxzCCBq+gAwI...".
the mixed-key file corroborates these observations.
both files seem to end with a new-line in both Notepad and Notepad++.
the private key has 1653 characters in its body, counting line breaks (not at the beginning or end).
the public key has 3050 characters in its body, counting line breaks (not at the beginning or end).

opening "puttygen.exe", pushing "Load", and selecting any of "privatekey.pem", "publickey.pem", and "key.pem" generates the error box "Couldn't load private key (not a private key)".
running "puttygen.exe" as administrator and trying to Load "privatekey.pem" generates the same error.

tried recreating public/private keys with no "-nodes" specifier, instead using "-clcerts":
    14:51:12,59>C:\OpenSSL-Win32\bin\openssl pkcs12 -in gridcert.p12 -out publickey_clcerts.pem -clcerts -nokeys
    Enter Import Password:
    MAC verified OK

    15:06:56,17>C:\OpenSSL-Win32\bin\openssl pkcs12 -in gridcert.p12 -out privatekey_clcerts.pem -clcerts -nocerts
    Enter Import Password:
    MAC verified OK
    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:

"puttygen.exe" still gives the same error when i try to Load "privatekey_clcerts.pem" and "publickey_clcerts.pem".

the "_clcerts.pem" files look very similar to "privatekey.pem" and "publickey.pem".
their bodies both start with "MII" and end with "=".
i think that the new public key file is the same as the old.
the new private key file is definitely somewhat different from the old.

in "puttygen.exe", tried clicking "Conversions -> Import" and selecting "privatekey.pem", but the same error message was returned.

tried generating a PuTTY key to see if it runs into same problems.
opened "puttygen.exe" and clicked "Generate".
moved mouse in blank space to generate randomness (that is so cool).
entered a passphrase.
clicked "Save private key" and saved it as "privateputty.ppk".
clicked "Save public key" and saved it as "publicputty", no extension.
clicked "Load" and selected "privateputty.ppk".
clicked "Conversions -> Export OpenSSH key", saved it as "privateputtySSH.pem".
clicked "Load" and selected "privateputtySSH.pem".
a box prompted me for the passphrase, which i entered.
a box appeared telling me that i'd successfully imported an OpenSSH SSH-2 private key.
i clicked "Okay"  and the PuTTY Key Generator stood before me.

the PuTTY-generated private key is quite different from the OpenSSL-generated key.
it begins right with "-----BEGIN RSA PRIVATE KEY-----
"; i.e., no header information.
additionally, "privatekey.pem" indicated the key body with "-----BEGIN PRIVATE KEY-----".
instead of launching straight into the body after it's "----" intro, "privateputtySSH.pem" has some header info before its gobbledygook body.
it almost certainly doesn't start the body with "MII", but it's a bit difficult to tell where the body starts.
it terminates the body with "==", like before.
finally, it closes with "-----END RSA PRIVATE KEY-----" and a newline.
6

BEGIN PRIVATE KEY marks the PKCS#8 private key format that OpenSSL has started using recently, while PuTTY only expects the 'traditional' / 'PEM' BEGIN RSA PRIVATE KEY format.

Feed the key through openssl rsa to convert it to the old format.

Both keys start with MII… because that's just how an ASN.1 sequence starts, when encoded in Base64, but PKCS#8 additionally has the key type inside, instead of relying on the PEM "BEGIN…" header. You can see the differences using openssl asn1parse.

  • That does it; thank you very much!! I'd upvote if I could. – Jordan Apr 23 '15 at 6:38
  • 1
    Small clarification: OpenSSL overall has supported PKCS#8 a long time, but some commandline operations including pkcs12 switched to it as of 1.0.0 in 2010. – dave_thompson_085 Apr 24 '15 at 10:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.