2012-05-15 4 views
1

У меня в настоящее время возникают некоторые трудности с тем, чтобы BouncyCastle работал. Просматривая это на пару дней, я надеюсь, что вы сможете предоставить любую полезную информацию.BouncyCastle на стороне сервера с телефонами Android как клиенты

Вот настройка. Используя REST-протокол, Android-клиент отправляет POST-сообщения на сервер. Я сделал отдельный проект с классами, представляющими эти сообщения, поэтому я могу включить это как библиотеку как на клиента, так и на сервер. Сначала объекты сообщений сначала разбираются в строку JSON, а затем интерпретируются на сервере.

Для обеспечения целостности данных сообщение содержит цифровую подпись (DSA). Я задал вопрос по этому вопросу earlier об обмене открытым ключом. Ответ, который я получил, был полезен, поскольку это, похоже, работает правильно.

Однако проверка не срабатывает. Ответ Николая Еленкова в другой теме упоминает возможную причину: «Кстати, вам, вероятно, будет проще, если вы имеете дело с одним провайдером, так что вы можете захотеть использовать Bouncy Castle на сервере». Здесь я получаю проблемы (и поскольку это своего рода другая проблема, я сделал для них новую тему)

Вот выдержка из кода из класса сообщений (из общей библиотеки):

import org.bouncycastle.jce.provider.BouncyCastleProvider; 

// .... 

private byte[] signature; 

// .... 

public void sign(DSAPrivateKey key) throws Exception { 
    Security.addProvider(new BouncyCastleProvider()); 
    Signature signer = Signature.getInstance("SHA1withDSA"); 
    signer.initSign(key); 
    signer.update(this.toByteArray()); 
    this.signature = signer.sign(); 
} 

public boolean verifySignature(DSAPublicKey key) throws Exception { 
    Security.addProvider(new BouncyCastleProvider()); 
    Signature signer = Signature.getInstance("SHA1withDSA"); 
    signer.initVerify(key); 
    signer.update(this.toByteArray()); 
    return (signer.verify(this.signature)); 
} 

Я включил bcprov-jdk15on-147.jar в пути к классам каждого проекта: на клиенте (не думаю, что было необходимо, но кто знает), в протоколе-проекта и в сервер-проект.

Сервер, кажется, не в состоянии справиться с этим, как я получаю исключение, которое, по-видимому рода общие для BouncyCastle:

java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider 
at java.lang.Class.getDeclaredConstructors0(Native Method) 
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389) 
at java.lang.Class.getConstructor0(Class.java:2699) 
at java.lang.Class.getDeclaredConstructor(Class.java:1985) 
at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:82) 
at com.google.gson.internal.ConstructorConstructor.getConstructor(ConstructorConstructor.java:66) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:71) 
at com.google.gson.Gson.getAdapter(Gson.java:353) 
at com.google.gson.Gson.fromJson(Gson.java:754) 

Следующая строка является вызов gson.fromJson() для класс сообщения.

Последнее, что я должен упомянуть, это то, что я работаю над Mac OS X с сервером Apache Felix. При завершении проекта серверный модуль должен быть легко переносимым на другую машину.

Итак, где я иду не так? Спасибо за любую помощь уже.

+0

На устройстве уже есть версия BouncyCastle (которая может быть довольно старой и сломанной). Это может мешать. Попробуйте переупаковенную версию, например [SpongyCastle] (https: // github.com/rtyley/spongycastle) - это в основном просто рефакторинга BouncyCastle, которая не будет мешать тому, что сломанное POS находится на вашем устройстве. – Jens

ответ

0

Я не знаю, как работает загрузка классов Apache Felix, но вы не должны добавлять провайдера несколько раз. Переместите часть Security.addProvider(new BouncyCastleProvider()); в статический инициализатор или зарегистрируйте надувной замок в файле java.security файла JDK.

В чем заключается класс исключения? Почему вы вызываете код JCE в конструкторе по умолчанию? Вероятно, это плохая идея, особенно при использовании автоматического маршалинга, предлагаемого Gson. Сначала создайте свои объекты и вызовите любой проверочный код, который у вас есть.

0

Apache Felix - это OSGi-окружение. Поэтому правильным способом было бы добавить необходимые пакеты BouncyCastle в зависимости от вашего пакета и установить BouncyCastle JAR как Bundle.

Примерно через год файлы JAR BouncyCastle уже являются правильными пучками - они уже включают все необходимые данные в MANIFEST.MF.