UnsupportedDataTypeException: нет объекта DCH для приложения типа MIME/pkcs7-mime

Я пытаюсь создать зашифрованную почту на Android, используя:

  1. библиотеки Javamail из здесь,
  2. Библиотеки SpongyCastel Core-1.51.0.0.jar, pg-1.51.0.0.jar, pkix-1.51.0.0.jar, prov-1.51.0.0.jar и scmail-jdk15on-1.47.0.3.jar.

Ниже приведен код [скопирован из источника примера spongycastel]:

MailcapCommandMap mailcap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mailcap.addMailcap("application/pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_signature");
mailcap.addMailcap("application/pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_mime");
mailcap.addMailcap("application/x-pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_signature");
mailcap.addMailcap("application/x-pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_mime");
mailcap.addMailcap("multipart/signed;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.multipart_signed");

CommandMap.setDefaultCommandMap(mailcap);

if (Security.getProvider("SC") == null) {
    Security.addProvider(new BouncyCastleProvider());
}

KeyStore ks = KeyStore.getInstance("PKCS12", "SC");
ks.load(new FileInputStream("keystorefile.pfx"), "passwd".toCharArray());
Enumeration e = ks.aliases();
String keyAlias = null;
while (e.hasMoreElements()) {
    String alias = (String) e.nextElement();
    if (ks.isKeyEntry(alias)) {
        keyAlias = alias;
    }
}
if (keyAlias == null) {
    System.err.println("can't find a private key!");
    System.exit(0);
}
Certificate[] chain = ks.getCertificateChain(keyAlias);
SMIMEEnvelopedGenerator gen = new SMIMEEnvelopedGenerator();
gen.addRecipientInfoGenerator(new JceKeyTransRecipientInfoGenerator((X509Certificate) chain[0]).setProvider("SC"));
MimeBodyPart msg = new MimeBodyPart();
msg.setText("Hello world welcome!");
MimeBodyPart mp = gen.generate(msg, new JceCMSContentEncryptorBuilder(CMSAlgorithm.RC2_CBC).setProvider("SC").build());
Properties props = System.getProperties();
Session session = Session.getDefaultInstance(props, null);
Address fromUser = new InternetAddress("\"abc cdf\"<[email protected]>");
Address toUser = new InternetAddress("[email protected]");
MimeMessage body = new MimeMessage(session);
body.setFrom(fromUser);
body.setRecipient(Message.RecipientType.TO, toUser);
body.setSubject("example encrypted message");
body.setContent(mp.getContent(), mp.getContentType());
body.saveChanges();
body.writeTo(new FileOutputStream("/sdcard/smime.p7m"));

когда он вызывает body.writeTo(), возникает следующее исключение. Пожалуйста, дайте мне знать, как я могу решить эту проблему:

javax.activation.UnsupportedDataTypeException: no object DCH for MIME type application/pkcs7-mime; name="smime.p7m"; smime-type=enveloped-data
W/System.err( 7226):    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:905)
W/System.err( 7226):    at javax.activation.DataHandler.writeTo(DataHandler.java:330)
W/System.err( 7226):    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1403)
W/System.err( 7226):    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1745)
W/System.err( 7226):    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1721)
W/System.err( 7226):    at com.agy.createmail.SignEncryptMail.createSignedEncryptedMail(EncryptMail.java:151)
W/System.err( 7226):    at com.agy.createmail.MainActivity$CreateMailTask.doInBackground(MainActivity.java:32)
W/System.err( 7226):    at com.agy.createmail.MainActivity$CreateMailTask.doInBackground(MainActivity.java:1)
W/System.err( 7226):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
W/System.err( 7226):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err( 7226):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
W/System.err( 7226):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err( 7226):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/System.err( 7226):    at java.lang.Thread.run(Thread.java:841)

person Rajesh N    schedule 22.08.2014    source источник


Ответы (1)


Проблема существует в определении этой строки,

application/pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_signature

Подпакет smime.handlers.* в spongycastle больше не существует под org.bouncycastle, поэтому вам нужно изменить bouncyCastle на spongyCastle и попробовать еще раз, но это не сработает, чувак, я борюсь с этим, потому что он опирается на java.awt.* из JDK, я даже пытался полагаться на дополнения .jar из проекта android-mail но все равно зря, не могу понять как заставить его работать, у вас получилось заставить его работать?

person Mohamed Ibrahim    schedule 18.08.2015