スマートカードにアクセスするためのPKCS11プロバイダーをセットアップしようとしています。システムにPKCS11ライブラリをインストールし、 Java PKCS#11リファレンスガイド の指示に従いました。参照では、単にSun.security.pkcs11.SunPKCS11
のインスタンスを作成し、構成ファイルの名前をコンストラクターに渡します。次のコードをコンパイルしようとすると
Provider p = new Sun.security.pkcs11.SunPKCS11("pkcs11.cfg");
Security.addProvider(p);
次のエラーが発生します。
アクセス制限:必要なライブラリ/usr/lib/jvm/Java-6-Sun-1.6.0.24/jre/lib/ext/sunpkcs11.jarの制限により、コンストラクタSunPKCS11(String)にアクセスできません。
私は何が間違っているのですか? Ubuntux86でEclipse3.5をJava SE1.6で使用しています。
宜しくお願いします。
プロジェクトのプロパティJavaビルドパスペインに移動し、JREシステムライブラリエントリを展開します。 アクセスルールをクリックし、[編集...]ボタンをクリックします。 AccessibleルールパターンSun/security/pkcs11/**にするアクセスルールを追加します。これにより、Eclipseは泣き言を止めます。
64 bit runtime on Windows
を使用する場合、もう1つの原因があります。その場合、必要なクラスは単に存在しません。
解決策:32ビットのランタイムを使用します。
このエラーの理由は、特定のクラスがSun JVMによってのみ使用されることを想定しており、新しいバージョンのEclipseでは、クラスの不適切/違法な使用について開発者に警告する警告チェックが行われたためです。
別のstackoverflowスレッドでは、BouncyCastleの実装を使用することを推奨しています。 Sun.security.pkcs11.SunPKCS11を使用した奇妙な問題:指定されたプロシージャが見つかりませんでしたか?
私が理解している限り、JavaでPKCS#11トークンを使用するには、Sun APIを使用する方法と、独自の実装を使用する方法の2つがあります。それぞれに長所と短所があります。 Sun'APIの主な利点は、PKCS#11トークンを通常のキーストアにマップすることです。したがって、BouncyCastleは、トークンがハードウェアデバイスと相互作用していることを実際に把握することなく、トークン内の秘密鍵にアクセスできます。さらに、ネイティブの依存関係はすでにSunのJVMにバンドルされているため、さまざまなプラットフォームでのネイティブコードの移植やサポートについて心配する必要はありません。主な欠点は、標準ではないため、JVMで見つかるとは限らないことです。商用API(IAIKのPKCS11ラッパーを参照)は優れており、オープンソースでもありますが、2つの欠点があります。別のAPI(料金を支払う必要があります...)で動作するように作成されているため、トークンが公開されません。 KeyStoreとして、BouncyCastleを透過的に使用することはできません。また、それらには、保守および配布する必要のあるネイティブコンポーネントがあります。ブラウザでPKCS#11を使用する必要がある場合は、それがどのような苦痛であるかを知っています...