证书类型的Android问题

证书类型的Android问题,android,certificate,Android,Certificate,我需要在Android应用程序中签署PDF文件的证书。似乎我只能使用pfx或p12类型(在iText中)对它们进行签名。 我现在所拥有的: Android应用向服务器生成证书签名请求 服务器以以下格式返回证书数据: -----开始证书----- -----结束证书----- 服务器返回X509证书,我无法使用该证书签署PDF。有没有办法将cer(由上述数据构成)转换为p12?如有任何信息,将不胜感激。我已找到。希望能有帮助 String password = "password"

我需要在Android应用程序中签署PDF文件的证书。似乎我只能使用pfx或p12类型(在iText中)对它们进行签名。 我现在所拥有的:

  • Android应用向服务器生成证书签名请求
  • 服务器以以下格式返回证书数据:
  • -----开始证书----- -----结束证书-----

    服务器返回X509证书,我无法使用该证书签署PDF。有没有办法将cer(由上述数据构成)转换为p12?如有任何信息,将不胜感激。

    我已找到。希望能有帮助

            String password = "password";
            String text = "545048";
            KeyStore keyStore = KeyStore.getInstance("pkcs12");
            InputStream inputStream = activity.getResources().openRawResource(R.raw.am_client);
            keyStore.load(inputStream, password.toCharArray());
    
            String alias = keyStore.aliases().nextElement();
            PrivateKey privateKey = (PrivateKey)keyStore.getKey(alias, password.toCharArray());
            X509Certificate certificate = (X509Certificate)keyStore.getCertificate(alias);
    
            //Sign Data
            byte[] dataToSign = text.getBytes("UTF-8"); //change to UTF-16 if needed
            Signature signature1 = Signature.getInstance("SHA1WithRSA");
            signature1.initSign(privateKey);
            signature1.update(dataToSign);
            byte[] signedData = signature1.sign();
            String signed = new String(signedData, "UTF-8"); //change to UTF-16 if needed
            Log.d("MESSAGE", "string = " + signed);
    

    一般来说,要对文档进行数字签名,您需要一个私钥和一个证书(可能还有证书链),并且您有:

    • 私钥用于对发送到服务器的证书签名请求进行签名(其中包括一些证书数据,如
      CN
      和公钥)

    • 服务器返回证书(可能还有链)

    我不擅长itext,但您可以看到签名是用私钥和链完成的。pkcs12密钥库仅用于提取密钥和链

    public void signPdfFirstTime(String src, String dest)
        throws IOException, DocumentException, GeneralSecurityException {
        String path = properties.getProperty("PRIVATE");
        String keystore_password = properties.getProperty("PASSWORD");
        String key_password = properties.getProperty("PASSWORD");
        KeyStore ks = KeyStore.getInstance("pkcs12", "BC");
        ks.load(new FileInputStream(path), keystore_password.toCharArray());
        String alias = (String)ks.aliases().nextElement();
        PrivateKey pk = (PrivateKey) ks.getKey(alias, key_password.toCharArray());
        Certificate[] chain = ks.getCertificateChain(alias);
        // reader and stamper
        PdfReader reader = new PdfReader(src);
        FileOutputStream os = new FileOutputStream(dest);
        PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
        // appearance
        PdfSignatureAppearance appearance = stamper .getSignatureAppearance();
        appearance.setImage(Image.getInstance(RESOURCE));
        appearance.setReason("I've written this.");
        appearance.setLocation("Foobar");
        appearance.setVisibleSignature(new Rectangle(72, 732, 144, 780), 1,    "first");
        // digital signature
        ExternalSignature es = new PrivateKeySignature(pk, "SHA-256", "BC");
        ExternalDigest digest = new BouncyCastleDigest();
        MakeSignature.signDetached(appearance, digest, es, chain, null, null, null, 0, CryptoStandard.CMS);
    }
    

    您好,写证书是指公共部分,即.cer?是的,证书是公共部分。.cer文件包含一个证书