Java alled,与其他答案不同,“确保两个文件使用相同的密码[…],否则会出现奇怪的失败”我想我爱你对我来说,新存储可以有不同的密码是有道理的。如果钥匙工具不能处理两个不同的密码,为什么它会提示输入两个不同的密码?我不明白。@Ape inago不知道;由于任何

Java alled,与其他答案不同,“确保两个文件使用相同的密码[…],否则会出现奇怪的失败”我想我爱你对我来说,新存储可以有不同的密码是有道理的。如果钥匙工具不能处理两个不同的密码,为什么它会提示输入两个不同的密码?我不明白。@Ape inago不知道;由于任何,java,ssl,keystore,Java,Ssl,Keystore,alled,与其他答案不同,“确保两个文件使用相同的密码[…],否则会出现奇怪的失败”我想我爱你对我来说,新存储可以有不同的密码是有道理的。如果钥匙工具不能处理两个不同的密码,为什么它会提示输入两个不同的密码?我不明白。@Ape inago不知道;由于任何合法的使用最终都将不得不处理密码管理,而这正是实用密码系统的弱点所在。“让我们公开它,因为我们可以!”这似乎是许多加密库的一个特性,可能也是它们几乎普遍享有可怕声誉的原因……嗯。我尝试了你的建议,但在第一个openssl命令中失败了——它报告解


alled,与其他答案不同,“确保两个文件使用相同的密码[…],否则会出现奇怪的失败”我想我爱你对我来说,新存储可以有不同的密码是有道理的。如果钥匙工具不能处理两个不同的密码,为什么它会提示输入两个不同的密码?我不明白。@Ape inago不知道;由于任何合法的使用最终都将不得不处理密码管理,而这正是实用密码系统的弱点所在。“让我们公开它,因为我们可以!”这似乎是许多加密库的一个特性,可能也是它们几乎普遍享有可怕声誉的原因……嗯。我尝试了你的建议,但在第一个openssl命令中失败了——它报告解密错误。我测试的原始密钥库是与jarsigner一起使用的例程。失败既发生在cygwin的工具下,也发生在Fedora的工具下。它对我有效,我在网上搜索了这个解决方案,感谢diyismKeyMan页面链接已更改为(永无止境的url 404/重写!)。下载链接在页面的右上角。您需要一个IBM ID。。。你可以免费创建一个。我选择下载第一个zip选项。要使其在Windows上工作,您需要将其解压缩到C:\Program Files\IBM\BlueZ\KeyMan,或者需要将其解压缩到任意位置,并更改km.bat的第一行以获得包含km.bat的文件夹的路径。然后不带任何参数运行km.bat。只要java在您的路径上,它就应该工作。因为我不知怎么地得到了一个错误。也许是因为我的密钥库可以追溯到1900年左右。导出的唯一方法是使用JXplorer。谢谢!:)
    // Load input stream into keystore
    keystore.load(is, password.toCharArray());

    // List the aliases
    Enumeration aliases = keystore.aliases();
    for (; aliases.hasMoreElements(); ) {
        String alias = (String)aliases.nextElement();

        // Does alias refer to a private key?
        boolean b = keystore.isKeyEntry(alias);

        // Does alias refer to a trusted certificate?
        b = keystore.isCertificateEntry(alias);
    }
import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;
import sun.misc.BASE64Encoder;

public class DumpPrivateKey {
     /**
     * Provides the missing functionality of keytool
     * that Apache needs for SSLCertificateKeyFile.
     *
     * @param args  <ul>
     *              <li> [0] Keystore filename.
     *              <li> [1] Keystore password.
     *              <li> [2] alias
     *              </ul>
     */
    static public void main(String[] args)
    throws Exception {
        if(args.length < 3) {
          throw new IllegalArgumentException("expected args: Keystore filename, Keystore password, alias, <key password: default same tha
n keystore");
        }
        final String keystoreName = args[0];
        final String keystorePassword = args[1];
        final String alias = args[2];
        final String keyPassword = getKeyPassword(args,keystorePassword);
        KeyStore ks = KeyStore.getInstance("jks");
        ks.load(new FileInputStream(keystoreName), keystorePassword.toCharArray());
        Key key = ks.getKey(alias, keyPassword.toCharArray());
        String b64 = new BASE64Encoder().encode(key.getEncoded());
        System.out.println("-----BEGIN PRIVATE KEY-----");
        System.out.println(b64);
        System.out.println("-----END PRIVATE KEY-----");
    }
    private static String getKeyPassword(final String[] args, final String keystorePassword)
    {
       String keyPassword = keystorePassword; // default case
       if(args.length == 4) {
         keyPassword = args[3];
       }
       return keyPassword;
    }
}
javac -classpath .:commons-codec-1.4/commons-codec-1.4.jar DumpPrivateKey.java
import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;
//import sun.misc.BASE64Encoder;
import org.apache.commons.codec.binary.Base64;

public class DumpPrivateKey {
     /**
     * Provides the missing functionality of keytool
     * that Apache needs for SSLCertificateKeyFile.
     *
     * @param args  <ul>
     *              <li> [0] Keystore filename.
     *              <li> [1] Keystore password.
     *              <li> [2] alias
     *              </ul>
     */
    static public void main(String[] args)
    throws Exception {
        if(args.length < 3) {
          throw new IllegalArgumentException("expected args: Keystore filename, Keystore password, alias, <key password: default same tha
n keystore");
        }
        final String keystoreName = args[0];
        final String keystorePassword = args[1];
        final String alias = args[2];
        final String keyPassword = getKeyPassword(args,keystorePassword);
        KeyStore ks = KeyStore.getInstance("jks");
        ks.load(new FileInputStream(keystoreName), keystorePassword.toCharArray());
        Key key = ks.getKey(alias, keyPassword.toCharArray());
        //String b64 = new BASE64Encoder().encode(key.getEncoded());
        String b64 = new String(Base64.encodeBase64(key.getEncoded(),true));
        System.out.println("-----BEGIN PRIVATE KEY-----");
        System.out.println(b64);
        System.out.println("-----END PRIVATE KEY-----");
    }
    private static String getKeyPassword(final String[] args, final String keystorePassword)
    {
       String keyPassword = keystorePassword; // default case
       if(args.length == 4) {
         keyPassword = args[3];
       }
       return keyPassword;
    }
}
java -classpath .:commons-codec-1.4/commons-codec-1.4.jar DumpPrivateKey $HOME/.keystore changeit tomcat
KeyStore keys = ...
char[] password = ...
Enumeration<String> aliases = keys.aliases();
while (aliases.hasMoreElements()) {
  String alias = aliases.nextElement();
  if (!keys.isKeyEntry(alias))
    continue;
  Key key = keys.getKey(alias, password);
  if ((key instanceof PrivateKey) && "PKCS#8".equals(key.getFormat())) {
    /* Most PrivateKeys use this format, but check for safety. */
    try (FileOutputStream os = new FileOutputStream(alias + ".key")) {
      os.write(key.getEncoded());
      os.flush();
    }
  }
}
keytool -importkeystore -srckeystore keystore.jks \
    -destkeystore intermediate.p12 -deststoretype PKCS12
openssl pkcs12 -in intermediate.p12 -out extracted.pem -nodes
keytool.exe -importkeystore -srcstoretype JKS -srckeystore my-release-key.keystore -deststoretype PKCS12 -destkeystore keys.pk12.der
openssl.exe pkcs12 -in keys.pk12.der -nodes -out private.rsa.pem
openssl.exe base64 -d -in private.rsa.pem -out private.rsa.der
keytool.exe -exportcert -keystore my-release-key.keystore -storepass <KEYSTORE_PASSWORD> -alias alias_name -file public.x509.der
java -jar SignApk.jar public.x509.der private.rsa.der input.apk output.apk
import java.security.Key
import java.security.KeyStore

if (args.length < 3)
        throw new IllegalArgumentException('Expected args: <Keystore file> <Keystore format> <Keystore password> <alias> <key password>')

def keystoreName = args[0]
def keystoreFormat = args[1]
def keystorePassword = args[2]
def alias = args[3]
def keyPassword = args[4]

def keystore = KeyStore.getInstance(keystoreFormat)
keystore.load(new FileInputStream(keystoreName), keystorePassword.toCharArray())
def key = keystore.getKey(alias, keyPassword.toCharArray())

println "-----BEGIN PRIVATE KEY-----"
println key.getEncoded().encodeBase64()
println "-----END PRIVATE KEY-----"