2017-02-05 2 views
0

Мне нужны сертификаты для подписи файлов PDF в приложении для Android. Кажется, я могу подписывать их, используя только типы pfx или p12 (в iText). Что у меня до сих пор:Андроид с типами сертификатов

  1. Приложение для Android генерирует запрос на сертификацию на сервер;
  2. Данные сервер возвращает сертификат в виде

----- BEGIN CERTIFICATE ----- ----- END СЕРТИФИКАТ -----

Сервер возвращает X509, который я не могу использовать для подписания PDF-файлов. Есть ли способ конвертировать из cer (который построен из приведенных выше данных) в p12? Будем благодарны вам за любую информацию.

ответ

0

Я нашел this. надеюсь, что это помогает

 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); 
1

В общем, для цифровой подписи документа вам нужен закрытый ключ и сертификат (и, возможно, цепочку сертификации), и вы оба:

  • закрытый ключ используется для подписания запроса на подпись сертификата, отправленного на сервер (который включает некоторые данные сертификата, такие как CN и открытый ключ)

  • Сертификат (и, возможно, цепь) возвращается сервером

Я не эксперт в IText, но вы можете увидеть в this example, что подпись сделана с закрытым ключом и цепью. Хранилище 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); 
} 
+0

привет, письменным свидетельством, вы имеете в виду общественную часть, которая является? – BekaBot

+0

Да, сертификат является публичной частью. Файл .cer содержит сертификат – pedrofb

Смежные вопросы