web-dev-qa-db-ja.com

OpenSSL with Java

Java WebプロジェクトでOpenSSLを使用する必要があり、「OpenSSL」については何も知りません。

OpenSSLをプロジェクトに統合するにはどうすればよいですか?これを学ぶための良い基本的なチュートリアルはありますか?

20
123Ex

まず第一に、何のためにライブラリが必要ですか?

  • 単純な暗号化機能を使用する場合は、JDKでデプロイされた Java SEセキュリティコンポーネント を使用します。
  • より高度な機能(デジタル署名形式など)が必要な場合は、暗号化ライブラリを使用します( BouncyCastle は最も一般的なものの1つです)
  • ただし、JavaコードからSSL接続を開き、証明書認証などを処理する場合は、これらのいずれも必要ありません。
    • Java EEコンテナで作業している場合、コンテナは着信SSLリクエストを検証できます。設定の問題です。
    • また、SSLポートに接続する必要がある場合、JDKはそのためのいくつかの基本クラスを提示します( この例 を参照)。この場合、Javaコマンドでいくつかのシステムプロパティを設定する必要があります。

これらのプロパティのように:

-Djavax.net.ssl.keyStore=keystore_path
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=truststore_path
-Djavax.net.ssl.trustStorePassword=trustword
22
Tomas Narros

誰もがBouncyCastleについて話しますが、私たちのユースケースではGnu Cryptoライブラリが勝ちました。ネイティブJava。

一部のお客様は、データベース(aerospike)がJavaでハッシュを計算する時間の少なくとも10%を費やしていますが、これは単にこれらの実装が遅いためです。すべてのLinuxマシンで利用可能な暗号ライブラリのネイティブ実装がある場合、私は歓迎します。一部のJava7 VMにはさらにアルゴリズムが含まれると思っていましたが、まだ見ていません。

5
Brian Bulkowski

最適なソリューション:単純なタスクにはJavaの組み込みセキュリティを使用するか、より高度なタスクにはBouncyCastleを使用します。

JavaからOpenSSLを使用する必要がある場合、2つの選択肢があります。

  1. Javaからプロセスとしてopensslを呼び出します。
  2. OpenSSLにJNIレイヤーを作成しますが、それは私にとっては時間の無駄です。それらのどれもそれを行うのに本当に良い方法ではありません。
4
Miyagi

提案する前にいくつかの重要な質問に答える必要があります

1)JAVAからC++(ネイティブ)実装を本当に呼び出しますか?

2)JCEとBouncycastleで解決できないopensslの機能は何ですか

3)範囲は、opensslによって生成された証明書の使用、opensslによって生成されたファイルの復号化だけに制限されていますか?

4
kiran.kumar M

多くのJava暗号化用のネイティブライブラリです。ただし、一般にOpenSSLとの相互運用性は完全ではありません遅い(以下のサイトのメトリックを参照)、すべてのプラットフォームでサポートされているわけではありません。OpenSSLはほぼすべてのプラットフォームで確実にサポートされており、一般にパフォーマンスが向上しています。

そうは言っても、VMベースの暗号を使用することにはセキュリティ上の利点がいくつかあります。これも考慮すべきです。

Apacheグループは、Javaのライブラリを構築しました。これは、JNIを使​​用してAES暗号化のopensslにアクセスします。opensslにアクセスするJNIの最も一般的な例です。 。

https://github.com/Apache/commons-crypto

必要に応じて、ライブラリのJNIバインディング部分を引き出して、必要な機能を実装できます。

このメイクファイルは、javahを使用して、.classから必要なものを取得して.cコードをビルドする方法を示しています。

https://github.com/Apache/commons-crypto/blob/master/Makefile

特に、Makefileの次の行はjavah:$(JAVAH) -force -classpath $(TARGET)/classes -o $@ org.Apache.commons.crypto.cipher.OpenSslNativeを呼び出して、OpenSslNative.classに基づいて正しい「OpenSslNative.h」ファイルを生成します。

https://github.com/Apache/commons-crypto/blob/master/src/main/Java/org/Apache/commons/crypto/cipher/OpenSslNative.Java

import Java.nio.ByteBuffer;は、C出力バッファを許可するために使用されます。

関連する.cプログラムは次のとおりです。

https://github.com/Apache/commons-crypto/blob/master/src/main/native/org/Apache/commons/crypto/cipher/OpenSslNative.c

これはクロスプラットフォームのサポートを念頭に置いて書かれており、良い例です。エクスポートされた関数はすべてJNIEXPORTで始まる必要があり、各関数名に完全なクラスパスがどのようにあるかを確認できます。

多くの悪いJNIバインディング、文字列の受け渡しなどを見てきました。Javaでの優れたOpenSSL統合の構築に向けて、強固な基盤から始めることは大いに役立ちます。

0
Erik Aronesty

Apache Tomcat Native Libraryが解決策です。 https://github.com/Apache/Tomcat-native

TLS/SSL機能にOpenSSLを使用します。スタンドアロンライブラリとして(私がしたように)使用したり、Tomcatを接続したりできます。よく文書化されたJavaコード。

Tomcatネイティブなのはなぜですか?

JSSEは遅く、使いにくいです。私のプロジェクトでは、最高のパフォーマンスを得るために、OpenSSL用のJNIラッパーを検索/作成することにしました。その場で証明書をアップグレードする可能性は疑問符であり、キーストアが複雑すぎるためです。

Bouncy Castle Crypto APIはJavaで記述されているため、最高の効率は期待できません。

Tomcat Nativeはラッパーであるため、OpenSSLバージョンの機能のみに制限されます。

0
Tomasz