Я создаю ключ RSA на Java с помощью Bouncy Castle. Я сохраняю этот ключ в файле PKCS1 и хочу загрузить этот файл в другую часть программы обратно в объект файла ключа.
Мое хранилище ключей:
public static void writeKey(PemObject obj, String filename) throws IOException {
try (JcaPEMWriter pemWriter = new JcaPEMWriter(new FileWriter(filename)))
{
pemWriter.writeObject(obj);
pemWriter.close();
} catch (IOException ex) {
Logger.getLogger(Conversion.class.getName()).log(Level.SEVERE, null, ex);
}
}
Я конвертирую объект KeyPair с помощью:
public static PemObject createPrivateObject(KeyPair key) throws Exception {
return new PemObject("RSA PRIVATE KEY", key.getPrivate().getEncoded());
}
Это экспортируется в файл, который на первый взгляд выглядит хорошо. OpenSSL может читать этот файл и показывать информацию о значениях ключа.
Однако позже я пытаюсь загрузить ключ из файла с помощью:
public static KeyPair readKeyPair(String path)
{
File privateKeyFile = new File(path);
try (PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile))){
Object object = pemParser.readObject();
KeyPair kp;
JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
kp = converter.getKeyPair((PEMKeyPair) object);
pemParser.close();
return kp;
} catch (FileNotFoundException ex) {
Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
} catch (PEMException ex) {
Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
Когда я пытаюсь это сделать, я получаю сообщение об ошибке
org.bouncycastle.openssl.PEMException: malformed sequence in RSA private key
(Полное сообщение после текста)
Когда я еще раз взглянул на OpenSSl, я увидел, что OPENSSL напечатал в конце разные значения для одного и того же ключа. ,
ключ в файле начинается с
-----BEGIN RSA PRIVATE KEY-----
MIIEugIBADAN[...]
Выходы OpenSSL
openssl rsa -text -in Userkey.pem
Private-Key: (2048 bit)
modulus:
[...]
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIIEoAIBAAKC[...]
для ключевого файла, созданного и сохраненного, как описано выше. Если я попытаюсь вручную скопировать выходные данные OpenSSL в файл и загрузить его с помощью своей программы, все будет работать нормально. Итак, я предполагаю, что что-то не так в подпрограмме writeKey, но я не могу понять, что в этом не так. Кто-нибудь это знает?
Полное сообщение об ошибке:
org.bouncycastle.openssl.PEMException: m a l f o r m e d s e q u e n c e i n R S A p r i v a t e k e y < b r / > a t o r g . b o u n c y c a s t l e . o p e n s s l . P E M P a r s e r $ K e y P a i r P a r s e r . p a r s e O b j e c t ( U n k n o w n S o u r c e ) < b r / > a t o r g . b o u n c y c a s t l e . o p e n s s l . P E M P a r s e r . r e a d O b j e c t ( U n k n o w n S o u r c e ) < b r / > a t c e r t i f i c a t e m a n a g e m e n t . C r y p t o . r e a d K e y P a i r ( C r y p t o . j a v a : 2 5 7 ) < b r / > a t c e r t i f i c a t e m a n a g e m e n t . G u i D e s i g n C o n t r o l l e r . C r e a t e C e r t i f i c a t e P r e s s e d ( G u i D e s i g n C o n t r o l l e r . j a v a : 2 5 0 ) < b r / > a t s u n . r e f l e c t . N a t i v e M e t h o d A c c e s s o r I m p l . i n v o k e 0 ( N a t i v e M e t h o d ) < b r / > a t s u n . r e f l e c t . N a t i v e M e t h o d A c c e s s o r I m p l . i n v o k e ( N a t i v e M e t h o d A c c e s s o r I m p l . j a v a : 6 2 ) < b r / > a t s u n . r e f l e c t . D e l e g a t i n g M e t h o d A c c e s s o r I m p l . i n v o k e ( D e l e g a t i n g M e t h o d A c c e s s o r I m p l . j a v a : 4 3 ) < b r / > a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( M e t h o d . j a v a : 4 9 8 ) < b r / > a t s u n . r e f l e c t . m i s c . T r a m p o l i n e . i n v o k e ( M e t h o d U t i l . j a v a : 7 1 ) < b r / > a t s u n . r e f l e c t . G e n e r a t e d M e t h o d A c c e s s o r 1 . i n v o k e ( U n k n o w n S o u r c e ) < b r / > a t s u n . r e f l e c t . D e l e g a t i n g M e t h o d A c c e s s o r I m p l . i n v o k e ( D e l e g a t i n g M e t h o d A c c e s s o r I m p l . j a v a : 4 3 ) < b r / > a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( M e t h o d . j a v a : 4 9 8 ) < b r / > a t s u n . r e f l e c t . m i s c . M e t h o d U t i l . i n v o k e ( M e t h o d U t i l . j a v a : 2 7 5 ) < b r / > a t j a v a f x . f x m l . F X M L L o a d e r $ M e t h o d H a n d l e r . i n v o k e ( F X M L L o ader.java:1769)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8411)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.bouncycastle.openssl.PEMException: malformed sequence in RSA private key
at org.bouncycastle.openssl.PEMParser$RSAKeyPairParser.parse(Unknown Source)
... 70 more
Подробнее здесь: https://stackoverflow.com/questions/394 ... -with-java
Загрузка ранее сохраненных ключей не удалась в BouncyCastle с Java ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1734542332
Anonymous
Я создаю ключ RSA на Java с помощью Bouncy Castle. Я сохраняю этот ключ в файле PKCS1 и хочу загрузить этот файл в другую часть программы обратно в объект файла ключа.
Мое хранилище ключей:
public static void writeKey(PemObject obj, String filename) throws IOException {
try (JcaPEMWriter pemWriter = new JcaPEMWriter(new FileWriter(filename)))
{
pemWriter.writeObject(obj);
pemWriter.close();
} catch (IOException ex) {
Logger.getLogger(Conversion.class.getName()).log(Level.SEVERE, null, ex);
}
}
Я конвертирую объект KeyPair с помощью:
public static PemObject createPrivateObject(KeyPair key) throws Exception {
return new PemObject("RSA PRIVATE KEY", key.getPrivate().getEncoded());
}
Это экспортируется в файл, который на первый взгляд выглядит хорошо. OpenSSL может читать этот файл и показывать информацию о значениях ключа.
Однако позже я пытаюсь загрузить ключ из файла с помощью:
public static KeyPair readKeyPair(String path)
{
File privateKeyFile = new File(path);
try (PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile))){
Object object = pemParser.readObject();
KeyPair kp;
JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
kp = converter.getKeyPair((PEMKeyPair) object);
pemParser.close();
return kp;
} catch (FileNotFoundException ex) {
Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
} catch (PEMException ex) {
Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
Когда я пытаюсь это сделать, я получаю сообщение об ошибке
org.bouncycastle.openssl.PEMException: malformed sequence in RSA private key
(Полное сообщение после текста)
Когда я еще раз взглянул на OpenSSl, я увидел, что OPENSSL напечатал в конце разные значения для одного и того же ключа. ,
ключ в файле начинается с
-----BEGIN RSA PRIVATE KEY-----
MIIEugIBADAN[...]
Выходы OpenSSL
openssl rsa -text -in Userkey.pem
Private-Key: (2048 bit)
modulus:
[...]
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIIEoAIBAAKC[...]
для ключевого файла, созданного и сохраненного, как описано выше. Если я попытаюсь вручную скопировать выходные данные OpenSSL в файл и загрузить его с помощью своей программы, все будет работать нормально. Итак, я предполагаю, что что-то не так в подпрограмме writeKey, но я не могу понять, что в этом не так. Кто-нибудь это знает?
Полное сообщение об ошибке:
org.bouncycastle.openssl.PEMException: m a l f o r m e d s e q u e n c e i n R S A p r i v a t e k e y < b r / > a t o r g . b o u n c y c a s t l e . o p e n s s l . P E M P a r s e r $ K e y P a i r P a r s e r . p a r s e O b j e c t ( U n k n o w n S o u r c e ) < b r / > a t o r g . b o u n c y c a s t l e . o p e n s s l . P E M P a r s e r . r e a d O b j e c t ( U n k n o w n S o u r c e ) < b r / > a t c e r t i f i c a t e m a n a g e m e n t . C r y p t o . r e a d K e y P a i r ( C r y p t o . j a v a : 2 5 7 ) < b r / > a t c e r t i f i c a t e m a n a g e m e n t . G u i D e s i g n C o n t r o l l e r . C r e a t e C e r t i f i c a t e P r e s s e d ( G u i D e s i g n C o n t r o l l e r . j a v a : 2 5 0 ) < b r / > a t s u n . r e f l e c t . N a t i v e M e t h o d A c c e s s o r I m p l . i n v o k e 0 ( N a t i v e M e t h o d ) < b r / > a t s u n . r e f l e c t . N a t i v e M e t h o d A c c e s s o r I m p l . i n v o k e ( N a t i v e M e t h o d A c c e s s o r I m p l . j a v a : 6 2 ) < b r / > a t s u n . r e f l e c t . D e l e g a t i n g M e t h o d A c c e s s o r I m p l . i n v o k e ( D e l e g a t i n g M e t h o d A c c e s s o r I m p l . j a v a : 4 3 ) < b r / > a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( M e t h o d . j a v a : 4 9 8 ) < b r / > a t s u n . r e f l e c t . m i s c . T r a m p o l i n e . i n v o k e ( M e t h o d U t i l . j a v a : 7 1 ) < b r / > a t s u n . r e f l e c t . G e n e r a t e d M e t h o d A c c e s s o r 1 . i n v o k e ( U n k n o w n S o u r c e ) < b r / > a t s u n . r e f l e c t . D e l e g a t i n g M e t h o d A c c e s s o r I m p l . i n v o k e ( D e l e g a t i n g M e t h o d A c c e s s o r I m p l . j a v a : 4 3 ) < b r / > a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( M e t h o d . j a v a : 4 9 8 ) < b r / > a t s u n . r e f l e c t . m i s c . M e t h o d U t i l . i n v o k e ( M e t h o d U t i l . j a v a : 2 7 5 ) < b r / > a t j a v a f x . f x m l . F X M L L o a d e r $ M e t h o d H a n d l e r . i n v o k e ( F X M L L o ader.java:1769)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8411)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.bouncycastle.openssl.PEMException: malformed sequence in RSA private key
at org.bouncycastle.openssl.PEMParser$RSAKeyPairParser.parse(Unknown Source)
... 70 more
Подробнее здесь: [url]https://stackoverflow.com/questions/39412297/loading-previously-stored-keys-fails-in-bouncycastle-with-java[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия