Java - цифровая подпись с использованием закрытого ключа для отправки данных на внешний веб-сервис - PullRequest
0 голосов
/ 11 мая 2011

Мне нужно подключиться к внешнему веб-сервису из моего Java-приложения, работающего на Tomcat 6. У меня есть сертификат SSL для моего домена, купленный и установленный на моем сервере.Теперь мне нужно подключиться к внешней службе и использовать свой закрытый ключ сертификата для цифровой подписи любых данных, поступающих в службу, используя хэш SHA-256 и солт-длину 128 бит.Как я могу использовать закрытый ключ для создания этой подписи?Могу ли я выбрать какие-либо значения для соли?Смогут ли они расшифровать его, используя мой открытый ключ из сертификата SSL?

Могу ли я использовать для этого библиотеку Bouncy Castle ?Любой код или учебники по этому вопросу будут оценены.

Ответы [ 2 ]

0 голосов
/ 17 мая 2011

Я бы настоятельно рекомендовал использовать для этого стек веб-сервиса: например,.подход для клиента WS-Security с использованием Apache CXF - http://cxf.apache.org/docs/ws-security.html

Еще одна полезная ссылка: http://www.jroller.com/gmazza/entry/cxf_x509_profile

0 голосов
/ 17 мая 2011

В документации JCA приведен пример использования Signature (в разделе Создание и проверка подписи с использованием сгенерированных ключей . Вы бы использовали SHA256withRSA вместо SHA1withDSA, поскольку это поддерживается SunRsaSignProvider (при условии, что это ключ RSA). Для этого вам не нужен BouncyCastle.

Если вы хотите использовать BouncyCastle, вам нужно будет что-то сделать в этом направлении (Я не пробовал этот конкретный код):

AsymmetricKeyParameter keyParam = PrivateKeyFactory.createKey(...);
// You might need to cast to private key to RSAPrivateKey 
// and get its attributes manually here.

SHA256Digest digest = new SHA256Digest();
RSADigestSigner signer = new RSADigestSigner(digest);
signer.init(true, keyParam);
signer.update(... data to sign, start, length, ...);
byte[] signature = signer.generatedSignature();

(Если вы делаете это из веб-приложения, вам также потребуется веб-приложение, чтобы иметь возможность получить доступ к этому секретному ключу, который можетбыть угрозой безопасности, если веб-приложение будет скомпрометировано. Возможно, стоит рассмотреть возможность использования другого ключа / сертификата, даже самоподписанного, если удаленная сторона желает его принять.)

...