2

Java で秘密鍵を読み取ろうとしています。そのためには、完全な証明書から秘密鍵を pfx 形式で抽出する必要があることを学びました。以下の open ssl コマンドを使用して pfx を pem に変換してから pk8 に変換しようとしましたが、Java でキーを読み取ろうとすると、無効なキー形式と表示されます

pfx を pem に変換する

      openssl pkcs12 -in C:\Documents\xbox-token\conversion\xbox
  token-FullCert.pfx -nocerts -out C:\Documents\xbox-token\conversion\xboxkey.pem

パスワード保護の削除

openssl rsa -in C:\Documents\xbox-token\conversion\xboxkey.pem  -out C:\Documents\xbox-token\conversion\xboxkey.pem

pem を pk8 に変換する

openssl pkcs8 -topk8 -in C:\Documents\xbox-token\conversion\xboxkey.pem -out C:\Documents\xbox-token\conversion\xboxprv.pk8

Javaコードで

  byte[] encodedPrivateKey=null;
    File privateKeyFile = new File("C:/Documents/xbox-token/conversion/xboxprv.pk8");
    FileInputStream inputStreamPrivateKey = null;
    try {
        inputStreamPrivateKey = new FileInputStream(privateKeyFile);
          encodedPrivateKey = new byte[(int)privateKeyFile.length()];
            inputStreamPrivateKey.read(encodedPrivateKey);
            inputStreamPrivateKey.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    // Create the private key.
    PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
    System.out.println(encodedPrivateKey);
    System.out.println(privateKeySpec);
    RSAPrivateKey privateKey = null;
    try {
        privateKey = (RSAPrivateKey)KeyFactory.getInstance("RSA").generatePrivate(privateKeySpec);
    } catch (InvalidKeySpecException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format が発生しています

誰でも助けることができますか

4

2 に答える 2

3

秘訣は、opensslで少し実行してから、keytoolで実際の作業をすべて実行することだと思います。したがって、opensslを使用して、既存の証明書とキーをPKCS12ファイルに変換します。opensslを使用すると、次のようなものになります。

openssl pkcs12 \
  -export -in cert.crt \
  -inkey cert.key \
  -certfile ica.crt \
  -name "yourKey" \
  -out cert.p12

そして、魔法は、.p12を別のキーストアであるかのようにキーストアにインポートすることです。

$JAVA_HOME/bin/keytool \
  -importkeystore -deststorepass secret \
  -destkeypass secret -destkeystore $KEYSTORE \
  -srckeystore cert.p12 \
  -srcstoretype PKCS12 \
  -srcstorepass secret \
  -alias "yourKey"

これをJava内で使用するためのオプションがありますが、完全な答えには次のことが含まれると思います。

import java.security.KeyStore;
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream instream = new FileInputStream(new File("/your/keystore"));
trustStore.load(instream, "secret".toCharArray());

それがうまくいくことを願っています!

于 2012-09-10T22:16:14.570 に答える
0

OpenSSL コマンドの出力形式を指定しないと、PEM でエンコードされたファイルが取得されます。Java は DER エンコードを予期します。最後の openssl 呼び出しの代わりに、次を試してください。

openssl pkcs8 -topk8 -inform=PEM -outform=DER
              -in C:\Documents\xbox-token\conversion\xboxkey.pem 
              -out C:\Documents\xbox-token\conversion\xboxprv.pk8

「-inform」パラメーターは必須ではありませんが (デフォルトのようです)、「-outform」はおそらく必須です。

使用している形式を確認する場合: PEM ファイルは ASCII (Base64 エンコード)、DER ファイルはバイナリです。あなたのテキスト エディタが気に入ったとしても、Java は気に入らないでしょう。

于 2013-01-09T05:00:39.380 に答える