[openssl-users] What is the output format of `openssl pkcs12`? How can I make it output a PKCS#1 private key?

James Fisher jameshfisher at gmail.com
Fri Dec 1 19:39:21 UTC 2017


Hi,

I have a `Certificates.p12` file that I wish to convert to a
`certificates.pem` containing an unencrypted private key in PKCS#1 format.
I have previously been able to do this by running:

    openssl pkcs12 -in Certificates.p12 -out certificates.pem -nodes
-clcerts

The resulting `certificates.pem` file has a `PRIVATE KEY` PEM block, as
expected. However, the library I'm using
<https://github.com/sideshow/apns2/blob/master/certificate/certificate.go#L80>
does
not understand this PEM block, because it expects it to be a PKCS#1 private
key. The ASN.1 structure of a PKCS#1 private key is defined by RFC 3447
<https://tools.ietf.org/html/rfc3447#appendix-A.1.2> as:

    RSAPrivateKey ::= SEQUENCE {
        version           Version,
        modulus           INTEGER,  -- n
        publicExponent    INTEGER,  -- e
        privateExponent   INTEGER,  -- d
        prime1            INTEGER,  -- p
        prime2            INTEGER,  -- q
        exponent1         INTEGER,  -- d mod (p-1)
        exponent2         INTEGER,  -- d mod (q-1)
        coefficient       INTEGER,  -- (inverse of q) mod p
        otherPrimeInfos   OtherPrimeInfos OPTIONAL
    }

The bad private key block in my `certificates.pem` does not have this
PKCS#1 structure! Instead, its ASN.1 structure looks like this:

    $ openssl asn1parse -i -in badprivatekey.pem
        0:d=0  hl=4 l=1212 cons: SEQUENCE
        4:d=1  hl=2 l=   1 prim:  INTEGER           :00
        7:d=1  hl=2 l=  13 cons:  SEQUENCE
        9:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption
       20:d=2  hl=2 l=   0 prim:   NULL
       22:d=1  hl=4 l=1190 prim:  OCTET STRING      [HEX
DUMP]:308204A...very long hex...

What is the above format? The documentation for `openssl pkcs12`
<https://wiki.openssl.org/index.php/Manual:Pkcs12(1)> only vaguely says
that its output is "written in PEM format." I need a stronger guarantee
that the private key PEM block is in PKCS#1 format.

The strange thing is that `openssl rsa` understands the strange format of
the "bad" private key, and can convert it to the right PKCS#1 structure
with:

    openssl rsa -in badprivatekey.pem -out goodprivatekey.pem

Although `openssl rsa` understands the input file, the tool seems unable to
tell me _why_, i.e. what the format of the input file is.

What is the output format of `openssl pkcs12`? Specifically what is the
format of its private key block? How do I make `openssl pkcs12` output a
correct PKCS#1 private key?

Thanks,
Jim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mta.openssl.org/pipermail/openssl-users/attachments/20171201/dad3550c/attachment.html>


More information about the openssl-users mailing list