【问题标题】:Save a PFX Certificate on Internal Storage在内部存储上保存 PFX 证书
【发布时间】:2014-06-30 10:44:19
【问题描述】:

我正在尝试将 .PFX 证书保存到我的应用程序的内部存储中。

当我从资产或原始获取 de .pfx 时,获得的 InputStream 很好,并且工作正常。但是,如果我将此 InputStream 存储在内部存储(或 Sharedprefences)上,则 .PFX 不起作用...并在加载密钥库时出现此错误:

java.io.IOException:流不代表 PKCS12 密钥库

此代码有效,但我需要将证书存储在内存中,而不是从资产中获取...:

InputStream is = AppConstants.appContext.getResources().openRawResource(R.raw.XXXX);

这是保存.PFX的代码:

InputStream is = AppConstants.appContext.getResources().openRawResource(R.raw.XXXX);
        String filename = "XXXX";
        String string = is.toString();
        FileOutputStream outputStream;
        try {
            outputStream = AppConstants.appContext.openFileOutput(filename, AppConstants.appContext.MODE_PRIVATE);
            outputStream.write(string.getBytes());
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

这是加载存储的 .PFX 的代码:

String filename = Uri.parse(PFX_FILE).getLastPathSegment();
        File file = File.createTempFile(filename, null, AppConstants.appContext.getCacheDir());
keyStore.load(new FileInputStream(file), "xxxx".toCharArray());

如何将证书保存在内存中?

【问题讨论】:

    标签: java android ssl certificate pfx


    【解决方案1】:

    初始化空密钥库:

    KeyStore keyStore = KeyStore.getInstance("BKS");
    keyStore.load(null, password);
    

    解析你从网络服务获得的证书,检索X509CertificatePrivateKey

    将其存储在密钥库中:

     keyStore.setKeyEntry(alias, privateKey, password, new X509Certificate []{certificate});
    

    保存密钥库:

    OutputStream outputStream = context.openFileOutput(filename, Context.MODE_PRIVATE);
    keyStore.store(outputStream, password);
    

    然后,当您需要保存的密钥库时,从文件中加载它:

    InputStream in;
    try {
        in = context.openFileInput(filename);
        try {
            keyStore.load(in, password);
        } finally {
            in.close();
        }
    

    【讨论】:

    • 嗨,我们如何将 .pfx 文件的内容存储在 Sqlite DB 中并在执行 sql 查询后安装它?因为如果我将 .pfx 文件的 byte[] 存储在 DB 中并稍后获取它,它就无法正常工作。请提出建议。
    • @SanatPandey 您可以将其存储为 .PEM 格式,因为 PEM 只是一个字符串
    【解决方案2】:

    您想将文件从资产复制到内存。

    String string = is.toString();
    

    这不会为您提供该文件的内容。相反,您必须创建一个循环,从输入流中读取某些内容并将其写入输出流。

    本网站上有很多示例如何准确地做到这一点。

    【讨论】:

    • 好的greenapps!但在最终代码中,pfx 将被下载,而不是从资产中设置...
    • 我的错误/错字。但是从资源中复制是一样的。 “已下载”是什么意思?
    • 证书是从互联网服务下载的
    • 您在帖子中无处可说。重读时确实很不清楚你在做什么或你想要什么。
    猜你喜欢
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多