我开始进入NSS,并设法构建了它。结果被放在一个名为dist
的文件夹中,有几个子文件夹,其中包含几个exe的dll等。
dist
/WINNT6.0_DBG.OBJ
/bin
/include
/lib
我正在尝试,但我不确定nssLibraryDirectory
和nssSecmodDirectory
是什么。
对于nssLibraryDirectory
,我是否应该将dist
中的所有内容复制到一个文件中,并从nssLibraryDirectory
引用它?nssSecmodDirectory
呢?我不确定应该如何配置以开始使用sun的pkcs11。
例如这个琐碎的:
String configName = "nss.cfg";
Provider p = new sun.security.pkcs11.SunPKCS11(configName );
nss.cfg所在位置:
name = NSS
nssLibraryDirectory = E:NSSnss-3.12.4-with-nspr-4.8mozilladistWINNT6.0_DBG.OBJlib
nssDbMode = noDb
给出异常
引起原因:java.io.IOException:找不到指定的模块。在sun.security.pkcs11.Secmod.nssLoadLibrary(本机方法)
nssLibraryDirectory应仅包含lib子目录。它还必须出现在PATH中——通过修改环境变量或在JVM参数中指定它。
我努力工作的一些注意事项。。。。我认为这将帮助任何想要使用NSS的人。
我倾向于用Java代码构造String
,以了解错误发生在哪一行。我必须说它更好,因为Eclipse可以消除所有String构造错误。然后你要注意值的填写。
我使用这些代码:
String config = "xxxxxxx" +
"xxxxxxx" +
"xxxxxxx" +
"n";
provider = new SunPKCS11(new ByteArrayInputStream(config.getBytes()));
Security.insertProviderAt(provider, 1);
提供程序配置的所有标志:(来自http://j7a.ru/_config_8java_source.html,看起来像openjdk 8 sun.security.pkcs11.Config.java
。)
name=xxxxxx //some text, " must be escaped with
library=/location/of/your/.so/or/.dll/file //not compatible with NSS mode, must be quoted if contains space, and if quoted, " must be escaped
description=
slot= //not compatible with NSS mode
slotListIndex= //not compatible with NSS mode
enableMechanisms=
disableMechanisms=
attributes=
handleStartupErrors=
insertionCheckInterval=
showInfo=true/false
keyStoreCompatibilityMode=
explicitCancel=
omitInitialize=
allowSingleThreadedModules=
functionList=
nssUseSecmod=true/false //not campatible with 'library'
nssLibraryDirectory= //not campatible with 'library'
nssSecmodDirectory= //not campatible with 'library'
nssModule=some text //not campatible with 'library'
nssDbMode=readWrite, readOnly, noDb //not campatible with 'library'
nssNetscapeDbWorkaround=true/false //not campatible with 'library'
nssArgs="name1='value1' name2='value2' name3='value3' ... " //not compatible with NSS mode
nssUseSecmodTrust=true/false
nssArgs=
示例:(按空格分隔)
"nssArgs="configdir='" + NSS_JSS_Utils.getFireFoxProfilePath() + "' "
+ "certPrefix='' "
+ "keyPrefix='' "
+ "secmod='secmod.db' "
+ "flags='readOnly'""
Java代码中的一些转义示例:
String config = "name="NSS Module"n" +
"......" +
"n";
如果有空格,则必须用" "
引用。' '
无法使用。每个"
都必须使用进行转义。
现在,一些真实的例子。
通过NSS:使用Firefox安全模块
String config = "name="NSS Module"n"
+ "attributes=compatibilityn"
+ "showInfo=truen"
+ "allowSingleThreadedModules=truen"
+ "nssLibraryDirectory=" + NSS_JSS_Utils.NSS_LIB_DIR + "n"
+ "nssUseSecmod=truen"
+ "nssSecmodDirectory=" + NSS_JSS_Utils.getFireFoxProfilePath();
使用libsoftokn3.so
(我不知道它的用途,但我看到有人在nssArgs
中这样使用它):
String config = "library=" + NSS_JSS_Utils.NSS_LIB_DIR + "/libsoftokn3.so" + "n"
+ "name="Soft Token"n";
+ "slot=2n"
+ "attributes=compatibilityn"
+ "allowSingleThreadedModules=truen"
+ "showInfo=truen"
+ "nssArgs="configdir='" + NSS_JSS_Utils.getFireFoxProfilePath() + "' "
+ "certPrefix='' "
+ "keyPrefix='' "
+ "secmod='secmod.db' "
+ "flags='readOnly'""
+ "n";
NSS_JSS_Utils.NSS_LIB_DIR
返回所有NSS库库库所在的目录。有时它们是默认安装的(例如,在我的RedHat 7.2中),但有时您必须手动安装。
NSS_JSS_Utils.getFireFoxProfilePath()
返回您的FireFox配置文件所在的位置。如果您使用NSS/NSPR附带的modutil
,您可以看到您安装的安全模块存储在此文件夹中的secmod.db
中。如果你找不到它们,你可能拿错了文件。
有关如何填写这些值的更多信息:
NSS PKCS#11规范