2015-12-09 2 views
4

Я хочу подписать содержимое файла с сертификатом в java.файл знака с надувным замком в java

С терминалом и OpenSSL, я могу это сделать:

openssl smime -sign -in nosign.mobileconfig -out signed.mobileconfig -signer server.crt -inkey server.key -certfile cacert.crt -outform der -nodetach 

server.crt и .key являются файлы подписать, и я думаю, что я понимаю, что cacert.crt вложен внутрь из содержания.

Наконец-то, у меня есть файл, подписанный и доверенный.

В Java я не могу использовать openssl (не хочу запускать команду openssl), поэтому я должен подписать его с помощью lib.

Чтобы сделать это, я использую Надувной замок (версия 1,53)

вот мой код:

byte[] profile = ...; // I can have it also in String 

    // the certificate in -certfile 
    FileInputStream inputStream = new FileInputStream("src/main/resources/cacert.crt"); 

    byte[] caCertificate = ByteStreams.toByteArray(inputStream); 

    // the certificate to sign : server.crt, embedded in p12 
    X509Certificate serverCertificate = (X509Certificate) this.keyStore.getCertificate("1"); 

    // Private key is the server.key 
    ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(this.privateKey); 

    CMSSignedDataGenerator generator = new CMSSignedDataGenerator(); 
    generator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(
      new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(sha1Signer, serverCertificate)); 

    // the embedded certificate : cacert.crt, but I don't know if it is good to do that this way 
    X509CertificateHolder holder = new X509CertificateHolder(caCertificate); 

    generator.addCertificate(holder); 

    CMSProcessableByteArray bytes = new CMSProcessableByteArray(profile); 
    CMSSignedData signedData = generator.generate(bytes, true); 

    System.out.println("signedData : \n" + signedData.getEncoded()); 

Можете ли вы помочь мне иметь хорошие подписанные данные, пожалуйста? Благодаря !

EDIT: я получил ошибку в

X509CertificateHolder holder = new X509CertificateHolder(caCertificate); 

java.io.IOException: неизвестный тег 13 встречается

+0

Вы читали этот учебник https://docs.oracle .com/javase/tutorial/security/apisign/step3.html –

+0

В чем проблема/вопрос? Вы получаете сообщения об ошибках или что-то еще? – JimmyB

+0

У меня ошибка в X509Certificate Держатель для хранения = новый X509CertificateHolder (caCertificate); java.io.IOException: неизвестный тег 13 столкнулся Я проверяю cacert, и он хорошо сформирован .. – zarghol

ответ

2

Файл сертификата CA, очевидно, в PEM (ASCII) формат. Для конструктора X509CertificateHolder требуется BER/DER (двоичное) кодирование сертификата.

Вы можете преобразовать его, добавив следующее:

PEMParser pemParser = new PEMParser(new FileReader("src/main/resources/cacert.crt")); 
X509CertificateHolder caCertificate = (X509CertificateHolder) pemParser.readObject(); 

Вы должны добавить сертификат подписи на структуру CMS, а также:

generator.addCertificate(new X509CertificateHolder(serverCertificate.getEncoded())); 
+0

спасибо! это помогает мне внедрить cacert.crt, теперь уже не ошибка. Для записи PEMReader больше не существует, но я могу использовать парсер PEMParser = новый PEMParser (fileReader); parser.readObject(); Мой профиль сгенерирован, но он все еще не распознается, как подписан моей операционной системой. – zarghol

+0

@zarghol. Я обновил свой ответ. Помимо того, что вы не добавляете сертификат подписчика, ваш код выглядит отлично. Однако есть много вещей, которые вы не учитывали, и часто возникают проблемы с файлами p12, если они не сгенерированы с помощью Java. Если у вас все еще возникают проблемы, создайте [MCVE] (http://stackoverflow.com/help/mcve). – Omikron

+0

Я использовал generator.addCertificate ((X509CertificateHolder) parser.readObject()); и он работает, так как мой комментарий 3 часа назад, но, он работает сейчас, он признан подписанным! Я попробую некоторые изменения, но это работает во всем мире. Спасибо за вашу помощь ! – zarghol