当前位置: 首页 > 知识库问答 >
问题:

适用于Firefox的MacOS中的SunPKCS11提供程序

堵睿范
2023-03-14

我设法让SunPKCS11在视窗下与火狐ESR 52.0配合使用,但我无法让它在苹果电脑中加载。我已经尝试了几种不同的配置,并通过PKCS11直接加载它,但都不起作用,有人能给我一些指针吗?

pkcs11。cfg配置如下:

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中,我尝试这样加载它:

FileInputStream fis = new FileInputStream("pkcs11.cfg");
Provider provider = new SunPKCS11(fis);
Security.addProvider(provider);

然而,这立即给了我以下错误:

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提供程序初始化后完成它?这也是不可能的。。。我也犯了同样的错误。

以及尝试此处提到的各种不同配置设置:https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/PKCS11/Module_Specs#Softoken_Specific_Parameters

编辑1

我尝试了@FaithReef提到的方法,但它仍然抛出相同的错误。我尝试将插槽值更改为01-1,结果相同。看起来加载下层PKCS11对象有问题。

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配置文件上运行了modutil,并正在转储此信息:

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模块清单

>

插槽:NSS内部加密服务令牌:NSS通用加密服务uri:pkcs11:token=NSS通用加密服务;制造商= Mozilla基金会;序列号=0000000000000000;型号=NSS 3

插槽:NSS用户私钥和证书服务令牌:NSS证书数据库uri:pkcs11:token=NSS证书数据库;制造商= Mozilla基金会;序列号=0000000000000000;型号=NSS 3

共有2个答案

微生俊
2023-03-14
匿名用户

Firefox在Mac OS X中提供的库实际上可能完全损坏或不起作用,如果在FireFox之外执行的话。

在尝试了许多不同的配置和方式组合后,我最终通过不使用Firefox的库实现了它的工作。。。

以下是逐步实现该功能的方法:

  1. 在你的Mac中安装自制
  2. 运行brew安装nss
  3. 运行brew安装nspr
  4. 您可能需要手动将它们与brew link nss和brew link nspr
  5. 链接
  6. 在配置文件中,您需要将其指向您的自制libsoftokn3.dylib,如so库= /usr/local/opt/nss/lib/libsoftokn3.dylib

然后你的Java代码应该能够在苹果OS X下加载火狐密钥库...我在这里提交了一个错误。该票包含一个工作示例代码,说明如何实例化PKCS11、加载火狐密钥库并从存储中列出别名。

使用Firefox绝对是一场噩梦。。。但至少我让它工作了。。。谁会想到他们提供的库不起作用(但它在Windows中起作用!)P

为了完整起见,我也直接在这篇文章中包含了示例代码:

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的输出(包括FaithReef的评论):

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)

商业
2023-03-14

首先,我注意到你和我一起插入/添加提供者的不同方式。你能用这种方式添加提供者吗?(可能是不相关的)

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日发表评论

“将要做的,NSS用户能够跟踪这个问题,看起来他们会考虑在<代码> NSSYIN CONTIFECTORE()/CUT>中进行更改,在<代码> FoK())/>代码>之后,应该包含<代码> SeCdMyReSTART模块(PRYFALSE)。无论如何,他们也提供了一个比我提供给你的更好的解决方案。如果将环境变量NSS_STRICT_NOFORK设置为DISABLED,则代码将正常工作。它对我有效,我想检查它是否对你也有效。期待看到你的结果。

还有一些消息来源提示,可能是令牌或插槽问题,可以尝试将插槽索引更改为0,或者-1

 类似资料:
  • 问题内容: 在Java 8之前,SunPKCS11提供程序的加载方式如下: 是带有配置参数的字符串。因此,如果应用程序需要使用多个连接的智能卡,则可以创建多个提供程序。要访问每个提供程序,使用的名称是“ SunPKCS11-”,后跟我们在配置中指示的名称。 在Java 8中,该类已在JDK中删除。因此,我必须通过反射对上一个调用进行编程。 Java 9中的PKCS#11提供程序的操作似乎非常不同:

  • 在Java8之前,SunPKCS11提供程序是这样加载的: 是包含配置参数的字符串。因此,如果应用程序需要使用多个连接的智能卡,它可以创建多个提供程序。为了访问每个提供程序,使用的名称是“sunpkcs11-”,后面跟我们在配置中指示的名称。 在Java8中,JDK中删除了类。所以,我不得不通过反射对前面的调用进行编程。 Java9中PKCS#11提供程序的操作似乎非常不同: 在Java9中,会自

  • 我当前的提供商有: 0-提供程序名称:SUN 1-提供程序名称:SUNRSAGN 2-提供程序名称:SunEC ... 9-提供商名称:SunPKCS11 CartaoCidadao 第九个提供者是我尝试使用的提供者,它使用pkcs11库。 使用info方法我可以看到它正在使用库: SunPKCS11 CartaoCidadao使用library/usr/local/lib/libpteidpkc

  • 问题内容: 我刚刚更新到Firefox 32,当我尝试运行Selenium Webdriver Test时,我得到以下信息 我期望能够正常运行测试。 有没有人遇到过同样的事情?您是如何解决该问题的? selenium版本:2.41.0(作为Nuget软件包安装)操作系统:Windows 7浏览器:Firefox浏览器版本:32 问题答案: Selenium2.41.0正式支持的最新Firefox版

  • 问题内容: 我有一个包含两个内部div的容器div;两者在容器中的宽度和高度均应为100%。 我将两个内部div都设置为100%高度。在Firefox中效果很好,但是在IE中,div不会拉伸到100%的高度,而只会拉伸其中文本的高度。 以下是样式表的简化版本。 我做错什么了吗?还是我错过了任何Firefox / IE怪癖? 问题答案: 我认为“在Firefox中工作正常”仅在 Quirks模式下

  • 我已经将NSS 3.12.4配置为在FIPS模式下使用SunPKCS11提供程序与我的java程序一起工作,一切都很好。现在我按照https://blogs.oracle.com/meena/entry/what_s_new_in_nss1中提到的步骤使NSS作为共享数据库工作。 当我在共享数据库模式下配置NSS时,secmod.db文件会按预期替换为pkcs11.txt。但是现在SunPKCS1