繁体   English   中英

MacOS中用于Firefox的SunPKCS11提供程序

[英]SunPKCS11 provider in MacOS for Firefox

我设法使SunPKCS11与Windows下的Firefox ESR 52.0 SunPKCS11 ,但是无法在MacOS中加载它。 我已经尝试了几种不同的配置,并通过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从怪异的文件夹,那是因为我用install_name_tool在MacOS上改变@executable_path@loader_path为了得到库相关工作(因为我想在Eclipse中运行这个而不是来自Firefox本身)。

我还尝试使用此处建议的解决方案: 在初始化SunPKCS11 Provider后如何完成它? 而且还是不行...我遇到了同样的错误。

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

编辑1

我尝试了@FaithReaper提到的方法,但它仍然抛出相同的错误。 我试图改变槽值到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模块清单

  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;制造商= Mozilla%20Foundation; serial = 0000000000000000; model = NSS%203

    插槽:NSS用户专用密钥和证书服务令牌:NSS证书数据库uri:pkcs11:token = NSS%20Certificate%20DB; manufacturer = Mozilla%20Foundation; serial = 0000000000000000; model = NSS%203

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

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

那是:

apahim于2016年4月7日评论

@ will-Do,nss的人们能够追踪到这个问题,似乎他们将考虑NSS_InitContext()的更改,该更改应在fork()之后包含SECMOD_RestartModules(PR_FALSE) fork() 无论如何,他们也提供了比我提供的更好的解决方法。 如果将环境变量NSS_STRICT_NOFORK设置为DISABLED则该代码有望正常工作。 它对我有用,我想检查一下是否对您也有用。 期待看到您的结果。

另外,一些消息来源暗示这可能是令牌或插槽问题。 您可以尝试将插槽索引更改为0-1

如果在FireFox之外执行,Mac OS X中Firefox提供的库实际上可能完全损坏或无法运行。

在尝试了许多不同的配置和方式组合之后,我终于通过不使用Firefox中的库而使它起作用 ...

以下是逐步使用它的方法:

  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 OS X下加载Firefox密钥存储库...我已经在这里提交了一个错误。 该票证包含有关如何实例化PKCS11,加载Firefox密钥库并列出该商店别名的有效示例代码

这绝对是使用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的输出(包含在FaithReaper的评论中):

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM