Java WebプロジェクトでOpenSSLを使用する必要があり、「OpenSSL」については何も知りません。
OpenSSLをプロジェクトに統合するにはどうすればよいですか?これを学ぶための良い基本的なチュートリアルはありますか?
まず第一に、何のためにライブラリが必要ですか?
これらのプロパティのように:
-Djavax.net.ssl.keyStore=keystore_path
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=truststore_path
-Djavax.net.ssl.trustStorePassword=trustword
誰もがBouncyCastleについて話しますが、私たちのユースケースではGnu Cryptoライブラリが勝ちました。ネイティブJava。
一部のお客様は、データベース(aerospike)がJavaでハッシュを計算する時間の少なくとも10%を費やしていますが、これは単にこれらの実装が遅いためです。すべてのLinuxマシンで利用可能な暗号ライブラリのネイティブ実装がある場合、私は歓迎します。一部のJava7 VMにはさらにアルゴリズムが含まれると思っていましたが、まだ見ていません。
最適なソリューション:単純なタスクにはJavaの組み込みセキュリティを使用するか、より高度なタスクにはBouncyCastleを使用します。
JavaからOpenSSLを使用する必要がある場合、2つの選択肢があります。
提案する前にいくつかの重要な質問に答える必要があります
1)JAVAからC++(ネイティブ)実装を本当に呼び出しますか?
2)JCEとBouncycastleで解決できないopensslの機能は何ですか
3)範囲は、opensslによって生成された証明書の使用、opensslによって生成されたファイルの復号化だけに制限されていますか?
多くの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」ファイルを生成します。
import Java.nio.ByteBuffer;
は、C出力バッファを許可するために使用されます。
関連する.cプログラムは次のとおりです。
これはクロスプラットフォームのサポートを念頭に置いて書かれており、良い例です。エクスポートされた関数はすべてJNIEXPORT
で始まる必要があり、各関数名に完全なクラスパスがどのようにあるかを確認できます。
多くの悪いJNIバインディング、文字列の受け渡しなどを見てきました。Javaでの優れたOpenSSL統合の構築に向けて、強固な基盤から始めることは大いに役立ちます。
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バージョンの機能のみに制限されます。