3

根据 JEP 131,Java 8 应该为 64 位 Windows 提供 PKCS#11 Crypto 提供程序: https ://blogs.oracle.com/mullan/entry/jep_131_pkcs_11_crypto 。

考虑到这一点,我使用以下说明下载并使用 NSPR 构建了 32 位和 64 位版本的 NSS: https ://developer.mozilla.org/en-US/docs/NSS_Sources_Building_Testing

我下载了 Java 8 for Windows 64 build b118,配置了 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 的博客(上面链接)发布了一条消息,并回复了这个问题:一切都在 64 位运行,我无法让它在非 FIPS 模式下工作(同样的错误),但我的回复没有出现在博客上(需要批准)。

有没有其他人试图让 NSS 在 Windows 64 位上使用 Java 8 64 位?

基于 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 位。

再次感谢您的回复,它有所帮助,我仍在努力解决这个问题。

4

3 回答 3

1

考虑到这一点,我使用以下说明下载并使用 NSPR 构建了 32 位和 64 位版本的 NSS:https ://developer.mozilla.org/en-US/docs/NSS_Sources_Building_Testing ...

在这里我可能会跑题......

我不相信 NSS 是经过 FIPS 140-2 验证的源格式,如 OpenSSL。NSS 是一种更传统的验证,如 Crypto++、Certicom 等。对于 NSS,您必须从 Mozilla 获取预构建的二进制文件。

如果 Mozilla 没有为 Windows 提供经过 FIPS 140-2 验证的二进制文件,或者没有为您需要的 Windows 平台提供经过 FIPS 140-2 验证的二进制文件,那么我认为您不走运。

最简单的判断方法可能是通过NIST 存档的网络安全服务 (NSS) 加密模块版本 3.12.4 FIPS 140-2 安全策略。(我可能有版本错误,因为我不使用 NSS;请务必检查其最新的安全策略)。

根据1中提到的安全策略,似乎只有两个平台 vlaidated,Windows 也没有。请参阅第 2.2 节,平台列表(第 8 页):

Model                         |Operating System and Version
------------------------------+----------------------------
x86_64 Nehalem Xeon 5500      |Wind River Linux Secure 1.0
------------------------------+----------------------------
x86_64 Pentium core2 duo      |Wind River Linux Secure 1.0

从上表中,您需要使用 Wind River Linux Secure 1.0。如果您使用的是 Wind River,那么您必须拥有 Xeon 5500 或 Core2 Duo。否则,您没有使用Validated Cryptography

同样,Crypto++ 在 Windows 上具有三个 FIPS 140-2 验证(证书 343、562 和 819)。但是,您需要从 Crypto++ 网站下载预构建的二进制文件,并且需要根据 NIST 提交的 Crypto++ 安全策略使用它们。这些限制包括操作系统版本甚至 C 运行时服务包级别。

于 2014-01-31T19:47:11.057 回答
0

我会附上源代码,例如来自http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/sun/security/pkcs11/Secmod.java?av=f 和在第 210 行放置一个断点来检查platformPath变量(在 openjdk 7 代码中是第 203 行)。它看起来确实像一个 PATH 问题。NSS 适用于 Java 8 64 位。

消息“%1 不是有效的 Win32 应用程序”具有误导性,它来自 Windows 本身,它可能只是意味着在库路径上找不到 nss3.dll。

此外,在您的代码中,您在 nss.cfg 中注释掉了

#64 bit
#nssLibraryDirectory = C:\devel\nss\nss-3.15.3.1\dist\WINNT6.1_64_DBG.OBJ\lib

64位的Java进程只能加载64位的库,所以这条路径需要取消注释,32位的路径要注释掉。

于 2013-12-12T20:28:49.473 回答
0

回复:“我不认为 N​​SS 是 FIPS 140-2 验证的源格式,如 OpenSSL。NSS 是更传统的验证,如 Crypto++、Certicom 等。在 NSS 的情况下,您必须获得预先构建的来自 Mozilla 的二进制文件。”

“FIPS PUB 140-2 和加密模块验证程序的实施指南”说您可以从源代码重新编译。我认为我们可以将 NSS 重新编译为经过认证并在 NIST 网站上列出的版本。最新的是 RedHat (v3.12.4) 的 #1837。

以下是“FIPS PUB 140-2 和加密模块验证程序的实施指南”中的关键引述</p>

“CMVP 允许供应商将经过验证的软件、固件或混合密码模块从验证证书上指定的操作环境移植和重新编译到不包括在验证测试中的操作环境,只要移植规则是跟着。保持密码模块的验证状态,无需在新的操作环境中重新测试密码模块。但是,如果特定的操作环境未在验证证书上列出,CMVP 不会对模块的正确操作或生成的密钥的安全强度做出任何说明。

http://csrc.nist.gov/groups/STM/cmvp/documents/fips140-2/FIPS1402IG.pdf

于 2015-01-19T21:37:07.773 回答