XML Key -> PEM

(English version of the article – Converting XML Security private key to the PEM format)

Poněkud nečekaně jsem nedávno zjistil, že nemohu na internetu najít žádnou utilitu, která by uměla zkonvertovat privátní RSA klíč ve formátu XML do obyčejného formátu PEM.

XML formát se používá při elektronickém podepisování XML dokumentů podle doporučení W3C, ale převzal jej také Microsoft do svého .NET 1.1. Je tedy pravděpodobné, že čas od času vyvstane potřeba zkonvertovat tenhle XML klíč do obyčejného PEM formátu. Jenže žádná hotová utilita nějak není na internetu
k nalezení!

Naštěstí jsem záhy narazil na výbornou utilitku PvkConvert, Michela Gallanta, která umí mj. přesně tuto konverzi, akorát opačným směrem — z PEM formátu do XML. Napsat prográmek, který by klíče převáděl správným směrem pak už byla celkem hračka.

XMLSec2PEM

Program XMLSec2PEM tedy převede privátní nebo veřejný RSA klíčXML formátu do formátu PEM. Program sám, podle toho, jak XML vypadá, pozná, jestli jde o privátní nebo veřejný klíč.

Instalace a spuštění

Budete potřebovat Javovské JDK jakékoliv verze (no, prostě verze 1.4 či novější), abyste program přeložili a spustili. Stáhněte si program XMLSec2PEM.java a odstraňte .txt příponu souboru. Přeložíte jej jednoduše příkazem:

 javac XMLSec2PEM.java

Program se spouští příkazem:

 java XMLSec2PEM <XML_keyfile>

Konverze do PKCS#8

Pokud vám zkonvertovaný privátní klíč nefunguje, možná potřebujete klíč v úplném formátu PKCS#8. Utilita totiž vrací privátní klíče v tzv. „tradičním“ formátu, který neumožňuje zašifrování klíče heslem. Pokud potřebujete úplný PKCS#8 formát včetně šifrování klíče, použijte openssl s parametrem -topk8:

openssl pkcs8 -topk8 -in key_rsa.pem -out key.pem

Příklad

Mějme následující privátní klič v XML formátu uložený v souboru key.xml:

<RSAKeyValue>
  <Modulus>wzZYQpFhIItfo5...3CZXgAyOc+w==</Modulus>
  <Exponent>AQAB</Exponent>
  <P>+hhxh9KjXvS...vWL47IlE=</P>
  <Q>x9IxFrOIpj...z3eGi4s=</Q>
  <DP>Dp2bFOr0...26/SWOE=</DP>
  <DQ>oAKxTHx3...zMbn+Tq9gw==</DQ>
  <InverseQ>RapfQxpRbPa...q80Vcl9Pc=</InverseQ>
  <D>A9q412ejcU8PL...WJ1xnKcUWzwQ==</D>
</RSAKeyValue>

Spustíme program a dostaneme následující výstup:

 $ java XMLSec2PEM key.xml
 Determining the key type: seems to be a private XML Security key
 Checking the XML file structure: OK
 Outputting the resulting key:

——-BEGIN PRIVATE KEY——- MIIBTwIBADANBgkqh… ... ...dDVavNFXJfT3 ——-END PRIVATE KEY——-

Pokud potřebujeme úplný PKCS#8 formát, uložíme výstup programu (jen řádky mezi BEGIN a END) do souboru, např. key.pem a zkonvertujeme pomocí openssl:

 $ openssl pkcs8 -topk8 -in a.out.pem  -nocrypt
 -----BEGIN PRIVATE KEY-----
 MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAwzZYQpFhIItfo5Z9
 Ns7HHYWzqRel/OUK2XGyv8qBoZBWxd3DOiPbczbwDtOZDy8c0NejmEcbmk+3CZXg
 AyOc+wIDAQABAkAD2rjXZ6NxTw8uXbRPNrn7vT4U4qCmY6dZL8OFwevZUsVhpsNM
 wmH62l/5Le4zd66atsRohK1+hYnXGcpxRbPBAiEA+hhxh9KjXvS6x1SyB6C2QHrI
 gVyxWmmIVJdvWL47IlECIQDH0jEWs4imMNzvcViwab9GsZVwt5x6hgoufILPd4aL
 iwIgDp2bFOr0bTo0KC4E8Xks7Xu/d//oxXXhZ8Ap26/SWOECIACgArFMfHfwnTBO
 jXV3zzZcZdhFasLjWnLMxuf5Or2DAiBFql9DGlFs9o3f/06UNlFAbQcERTnv13Q1
 WrzRVyX09w==
 -----END PRIVATE KEY-----

Enjoy!

Napsal Matouš Borák - 16. srpen 2008, 10:54 do kategorie
   Linkuj.cz - Jagg.cz

Stín v žáru Vašich
informačních potřeb