【发布时间】: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