JEP 131 によると、Java 8 は 64 ビット Windows 用の PKCS#11 Crypto プロバイダーを提供する必要があります: https://blogs.oracle.com/mullan/entry/jep_131_pkcs_11_crypto。
それを念頭に置いて、次の手順を使用して、NSPR を使用して 32 ビット バージョンと 64 ビット バージョンの両方の NSS をダウンロードしてビルドしました 。
Windows 64 ビルド b118 用の Java 8 をダウンロードし、java.security ファイルを構成して、nss.cfg ファイルを作成しました。
java.security ファイルからの抜粋:
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider SunPKCS11-NSS
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.pkcs11.SunPKCS11 /devel/nss.cfg
nss.cfg:
# Use NSS as a FIPS-140 compliant cryptographic token
# SunPKCS11-NSS
name = NSS
#32 bit
nssLibraryDirectory = C:\devel\nss\nss-3.15.3.1\dist\WINNT6.1_DBG.OBJ\lib
#64 bit
#nssLibraryDirectory = C:\devel\nss\nss-3.15.3.1\dist\WINNT6.1_64_DBG.OBJ\lib
#non FIPS
#nssDbMode = noDb
#attributes = compatibility
#FIPS
nssSecmodDirectory = c:\devel\fipsdb
nssModule = fips
NSS に付属のテスト スイートを実行したところ、すべての暗号化/復号化テストに合格したように見えます (ホスト名/ドメイン名を必要とするテストにいくつか問題がありましたが、これは Windows 環境に関係しています)。
ここに問題があります。32 ビット バージョンの NSS を使用して Java 7 32 ビットでテスト暗号化アプリを実行すると、すべて正常に動作します。64 ビット NSS で Java 8 64 ビットを実行しようとすると、次のエラーが発生します。
java.security.ProviderException: Could not initialize NSS
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:212)
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:103)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at sun.security.jca.ProviderConfig$2.run(Unknown Source)
at sun.security.jca.ProviderConfig$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.security.jca.ProviderConfig.doLoadProvider(Unknown Source)
at sun.security.jca.ProviderConfig.getProvider(Unknown Source)
at sun.security.jca.ProviderList.getProvider(Unknown Source)
at sun.security.jca.ProviderList.getIndex(Unknown Source)
at sun.security.jca.ProviderList.getProviderConfig(Unknown Source)
at sun.security.jca.ProviderList.getProvider(Unknown Source)
at java.security.Security.getProvider(Unknown Source)
at sun.security.ssl.SunJSSE.<init>(Unknown Source)
at sun.security.ssl.SunJSSE.<init>(Unknown Source)
at com.sun.net.ssl.internal.ssl.Provider.<init>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at sun.security.jca.ProviderConfig$2.run(Unknown Source)
at sun.security.jca.ProviderConfig$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.security.jca.ProviderConfig.doLoadProvider(Unknown Source)
at sun.security.jca.ProviderConfig.getProvider(Unknown Source)
at sun.security.jca.ProviderList.getProvider(Unknown Source)
at sun.security.jca.ProviderList$ServiceList.tryGet(Unknown Source)
at sun.security.jca.ProviderList$ServiceList.access$200(Unknown Source)
at sun.security.jca.ProviderList$ServiceList$1.hasNext(Unknown Source)
at javax.crypto.KeyGenerator.nextSpi(KeyGenerator.java:323)
at javax.crypto.KeyGenerator.<init>(KeyGenerator.java:158)
at javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:208)
at STSAESEncryption.generateKeyWithGenerator(STSAESEncryption.java:74)
at Main.main(Main.java:24)
Caused by: java.io.IOException: %1 is not a valid Win32 application.
at sun.security.pkcs11.Secmod.nssLoadLibrary(Native Method)
at sun.security.pkcs11.Secmod.initialize(Secmod.java:210)
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:207)
... 36 more
Sean Mullan のブログ (上記のリンク) にメッセージを投稿し、質問への返信を投稿しました。ブログにはまだありません (承認が必要です)。
Windows 64 ビットで Java 8 64 ビットで NSS を動作させようとした人はいますか?
Alex Pakka のコメントに基づく更新 1:
返信してくれてありがとう。Java 8 64 ビットを使用している場合、64 ビット NSS ライブラリを使用しています。32ビットと64ビットの両方をテストしながら、前後に切り替えています。
コードを添付してステップスルーしましたが、platformPath 変数を表示しようとすると、「platformPath を変数に解決できません」というメッセージが表示されます。私はEclipseにあまり詳しくないので、何か間違っているのではないかと思っています。
どのようなエラーが発生するかを確認するために入力しているパスを編集しようとしましたが、nssLibraryPath を別のディレクトリ (nss ライブラリなし) に変更すると、win32 とは異なるエラーが発生します。
nss が Linux (およびおそらく他のプラットフォーム) の Java 8 64 ビットで動作することは知っていますが、Windows 64 ビットでは検証済みです。これは Java 8 と Windows 64 ビットの新機能であり、Java 7 は Windows 43 ビットのみをサポートしています。
返信ありがとうございます。それは役に立ちました。私はまだこれを理解しようとしています。