【问题标题】:What are acceptable versions of Keystore on Android?Android 上可接受的 Keystore 版本是什么?
【发布时间】:2019-12-14 15:32:27
【问题描述】:

我刚刚创建了一个 Java 密钥库并在其中放置了一个自签名证书。这个密钥库在独立的 Java 应用程序上完美加载,但在 Android 内部却没有,它抱怨密钥库版本错误。

所以它在任何地方记录了可接受的 Android 密钥库版本是什么?这解决了这个问题,但在 2011 年并使用 JDK 1.6

Wrong version of keystore on android call

BouncyCastle 有什么特别之处我们需要特别使用它吗?

我会使用任何可行的方法,但只是想知道有关 Android Java 安全性的重要信息记录在哪里?

这是我的完整活动代码:

import android.content.res.AssetManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.google.protobuf.ByteString;
import com.test.echo.EchoRequest;
import com.test.echo.EchoResponse;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.Certificate;
import java.util.Arrays;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    testSSLConnection();

    AssetManager am = getAssets();

}

 private void testSSLConnection(){
     System.out.println("Testing SSLConnection ....");
     try{
     echoHttpsTest();
     } catch(Exception e){ }

 }

 private  SSLContext getSSLContext() {
    AssetManager am = getAssets();
    InputStream fis = null;
    try {
         fis = am.open("cacerts.jks");
    } catch (Exception e) {  }



    return null;
 }




    private  SSLContext sslContext(String keystoreFile, String password)
        throws GeneralSecurityException, IOException {
    AssetManager am = getAssets();
    InputStream fis = null;

      KeyStore keystore =   KeyStore.getInstance(KeyStore.getDefaultType());

    try (InputStream in = am.open(keystoreFile)) {
        keystore.load(in, password.toCharArray());
    }
    KeyManagerFactory keyManagerFactory =
               KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    keyManagerFactory.init(keystore, password.toCharArray());

    TrustManagerFactory trustManagerFactory =
            TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init(keystore);

    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(
            keyManagerFactory.getKeyManagers(),
            trustManagerFactory.getTrustManagers(),
            new SecureRandom());

    return sslContext;
}

public void echoHttpsTest() throws java.io.IOException {

    Certificate c = null;

    SSLContext sslContext = null;



    try {

        sslContext = sslContext("cacerts.jks", "Password");
    } catch(Exception e) {
        System.out.println("error "+ e.getMessage());
    }



    String message = "hello";

    byte[] zeroByte = {0};

    byte[] messageBytes = EchoRequest
            .newBuilder()
            .setMessage(message)
            .build().getMessageBytes().toByteArray();
    System.out.println("number Bytes: "+messageBytes.length);


 }

}

【问题讨论】:

    标签: android


    【解决方案1】:

    您必须使用 java.security 包中的 KeyStore 类。 您可以通过带有一些参数的 getInstance 函数获取此类的实例。 最重要的参数是Provider。 建议尽可能使用 Android 密钥库(API 18 及更高版本)。 您可以查看此link 了解更多信息。

    【讨论】:

    • 我已更新以准确显示我在上面使用的代码。如果您发现任何问题,请告诉我。
    • 看不到testSSLConnection();的实现。
    • 对不起,它只是调用 echoHttpsTest() 我已经更新了上面的代码。
    猜你喜欢
    • 2019-11-07
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2011-08-24
    相关资源
    最近更新 更多