首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火狐的SunPKCS11提供程序在MacOS中

火狐的SunPKCS11提供程序在MacOS中
EN

Stack Overflow用户
提问于 2017-11-10 20:08:27
回答 2查看 1.7K关注 0票数 1

我设法让SunPKCS11在Windows下与FirefoxESR52.0一起工作,但我无法让它在MacOS中加载。我已经尝试过几种不同的配置,并通过PKCS11直接加载它,但是没有工作,有人能给我一些指针吗?

pkcs11.cfg配置如下:

代码语言:javascript
复制
name = FirefoxKeyStore
library = "/Applications/Firefox.app/Contents/MacOS/fixed-for-java-runtime/libsoftokn3.dylib"
attributes = compatibility
nssArgs = "configdir='/Users/helloworld/Library/Application Support/Firefox/Profiles/wasdwasd.default-1453211557245' certPrefix='' keyPrefix='' secmod='secmod.db' flags='readOnly' "
slot = 2

然后,在Java中,我尝试像这样加载它:

代码语言:javascript
复制
FileInputStream fis = new FileInputStream("pkcs11.cfg");
Provider provider = new SunPKCS11(fis);
Security.addProvider(provider);

但是,这立即给出了以下错误:

代码语言:javascript
复制
sunpkcs11: Initializing PKCS#11 library /Applications/Firefox.app/Contents/MacOS/fixed-for-java-runtime/libsoftokn3.dylib
sunpkcs11: Multi-threaded initialization failed: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_DEVICE_ERROR
Exception in thread "main" java.security.ProviderException: Initialization failed
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:376)
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:107)

您可能会问,为什么我要从奇怪的文件夹加载.dylib,这是因为我使用MacOS中的install_name_tool@executable_path更改为@loader_path,以使库依赖关系正常工作(因为我试图在Eclipse中运行它,而不是从Firefox本身运行)。

我还试着用这里建议的解决方案:如何在初始化SunPKCS11提供程序之后完成它?,这也是一个不允许的.我也会犯同样的错误。

以及尝试这里提到的各种不同的配置设置:参数

EDIT1

我尝试了@FaithReaper中提到的方法,但是它仍然抛出了相同的错误。我尝试将插槽值更改为01-1,并得到相同的结果。看起来在加载底层PKCS11对象时存在问题。

代码语言:javascript
复制
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_DEVICE_ERROR
at sun.security.pkcs11.wrapper.PKCS11.C_Initialize(Native Method)
at sun.security.pkcs11.wrapper.PKCS11$SynchronizedPKCS11.C_Initialize(PKCS11.java:1545)
at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:157)
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:330)

我不知道这是否有帮助,但我在FireFox配置文件上运行了FireFox,并正在转储以下信息:

代码语言:javascript
复制
modutil -dbdir "/Users/eto/Library/Application Support/Firefox/Profiles/ew2g332o.default-1453211557245" -rawlist

library= name="NSS Internal PKCS #11 Module" 
parameters="configdir=/Users/eto/Library/Application Support/Firefox/Profiles/ew2g332o.default-1453211557245 certPrefix= keyPrefix= secmod=secmod.db flags=readOnly " 
NSS="Flags=internal,critical trustOrder=75 cipherOrder=100 slotParams=(1={slotFlags=[RSA,DSA,DH,RC2,RC4,DES,RANDOM,SHA1,MD5,MD2,SSL,TLS,AES,Camellia,SEED,SHA256,SHA512] askpw=any timeout=30})"

PKCS #11模块的列表

  1. NSS内部PKCS #11模块uri: pkcs11:library-manufacturer=Mozilla%20Foundation;library-description=NSS%20Internal%20Crypto%20Services;library-version=3.33插槽:2个插槽附加状态:加载 时隙: NSS内部密码服务令牌: NSS通用密码服务uri: pkcs11:token=NSS%20Generic%20Crypto%20Services;manufacturer=Mozilla%20Foundation;serial=0000000000000000;model=NSS%203 时隙: NSS用户私钥和证书服务令牌: NSS证书DB uri: pkcs11:token=NSS%20Certificate%20DB;manufacturer=Mozilla%20Foundation;serial=0000000000000000;model=NSS%203
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-16 21:20:37

如果在FireFox之外执行,火狐在Mac中提供的库实际上可能会被完全破坏或失效。

在尝试了多种不同的配置和方法之后,我终于通过不使用火狐的库实现了它的工作.

下面是一步一步地让它发挥作用的方法:

  1. 在你的Mac中安装自制软件
  2. 运行brew install nss
  3. 运行brew install nspr
  4. 您可能需要手动将它们与brew link nssbrew link nspr链接起来。
  5. 在配置文件中,您需要将其指向您的自制libsoftokn3.dylib,就像library = /usr/local/opt/nss/lib/libsoftokn3.dylib一样

那么您的Java代码应该能够在Mac下加载Firefox密钥存储库。我提交了一个bug 这里。票证包含一个关于如何实例化PKCS11、加载Firefox和列出存储中的别名的工作PKCS11。

这绝对是火狐的噩梦..。但至少我让它起作用了。谁会想到他们提供的库不起作用(但它在Windows!)?

为了完整起见,我还将示例代码直接包含在本文中:

代码语言:javascript
复制
import java.io.ByteArrayInputStream;
import java.security.KeyStore;
import java.security.Provider;
import java.security.Security;
import java.util.Collections;

public class Sample {

    private KeyStore load(String lib, String profile) throws Exception
    {
        String config = "library = " + lib + "\n" + 
                "name = FirefoxKeyStore\n" + 
                "attributes = compatibility\n" + 
                "nssArgs = \"configDir='" + profile + "' certPrefix='' keyPrefix='' secmod='secmod.db' flags='readOnly,forceOpen,optimizeSpace' \"\n" + 
                "slot = 2\n";

        ByteArrayInputStream bais = new ByteArrayInputStream(config.getBytes());
        Provider provider = new sun.security.pkcs11.SunPKCS11(bais);
        Security.addProvider(provider);

        return KeyStore.getInstance("PKCS11");
    }

    public static void main(String[] args) throws Exception {

        Sample s = new Sample();

        String profile = "/Users/blah/Library/Application Support/Firefox/Profiles/yougottachangethis";
        String[] libs = { 
            //"/Applications/Firefox.app/Contents/MacOS/libsoftokn3.dylib",
            "/usr/local/opt/nss/lib/libsoftokn3.dylib"
        };

        for (String lib : libs) {
            System.out.println("TRYING >>> " + lib);
            try {
                KeyStore ks1 = s.load(lib, profile);

                ks1.load(null, null);
                for (String alias : Collections.list(ks1.aliases())) {
                    System.out.println(alias);  
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}

下面是Mac的otool输出(包含在FaithReaper的注释中):

代码语言:javascript
复制
otool -L libsoftokn3.dylib
libsoftokn3.dylib:
/usr/local/opt/nss/lib/libsoftokn3.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 253.0.0)
/usr/local/Cellar/nss/3.34/lib/libnssutil3.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/opt/nspr/lib/libplc4.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/opt/nspr/lib/libplds4.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/opt/nspr/lib/libnspr4.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
票数 0
EN

Stack Overflow用户

发布于 2017-11-16 08:44:59

首先,我注意到您与我一起插入/添加Provider的不同方式。您能尝试以这种方式添加Provider吗?(这可能是不可放松的)

代码语言:javascript
复制
Provider p = new SunPKCS11(new ByteArrayInputStream(config.getBytes()));
Security.insertProviderAt(p, 1);
KeyStore.Builder builder = null;
builder = KeyStore.Builder.newInstance("PKCS11", p, 
    new KeyStore.CallbackHandlerProtection(new UtilTarjetas().new CustomCallbackHandler()));
cardKeyStore = builder.getKeyStore();

那么,也许你可以试试这里的方法:

https://github.com/avocado-framework/avocado/issues/1112

这就是:

阿帕希姆于2016年4月7日发表评论 @will-Do,nss的人能够追踪到这个问题,似乎他们会考虑改变NSS_InitContext(),其中应该包括一个fork()之后的SECMOD_RestartModules(PR_FALSE)。不管怎么说,他们也提供了一个比我给你更好的解决办法。如果您将环境变量NSS_STRICT_NOFORK设置为DISABLED,那么代码就会正常工作。它对我有效,我想看看它是否也适用于你。期待着看到你的结果。

此外,一些消息来源指出,这可能是一个令牌或插槽问题。您可以尝试将时隙索引更改为0-1

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47230371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档