简体   繁体   English

尝试在Java中使用带有NSS的SunPKCS11启用FIPS模式

[英]trying to enable FIPS mode using SunPKCS11 with NSS in Java

I'm working on a project requiring FIPS 140-2 validated cryptography, and I'm trying to use NSS with the SunPKCS11 token interface, and I've gotten it working up until turning on FIPS mode in NSS. 我正在开发一个需要FIPS 140-2验证加密的项目,我正在尝试将NSS与SunPKCS11令牌接口一起使用,并且我已经开始工作直到在NSS中启用FIPS模式。 I get an error, CKR_USER_NOT_LOGGED_IN, that I just don't have any idea what to do with. 我收到一个错误,CKR_USER_NOT_LOGGED_IN,我只是不知道该怎么办。 Any suggestions as to what I should do? 关于我应该做什么的任何建议?

I'm new to the security world, so this code is cobbled together from the examples in the Oracle Java Tutorials, the SunPKCS11 reference page, and suggestions for using NSS in FIPS mode on the web. 我是安全领域的新手,所以这些代码是通过Oracle Java教程中的示例,SunPKCS11参考页面以及在Web上以FIPS模式使用NSS的建议拼凑而成的。

Here's the code I'm using: 这是我正在使用的代码:

String ksName = "my.pfx";
char[] spass = {'m', 'y', 'p', 'w' };
String alias = "testalias";
try {
    KeyStore ks = KeyStore.getInstance("PKCS12");
    FileInputStream ksfis = new FileInputStream(ksName); 
    BufferedInputStream ksbufin = new BufferedInputStream(ksfis);
    ks.load(ksbufin, spass);
    PrivateKey priv = (PrivateKey) ks.getKey(alias, spass);

    System.out.println(" Initialize the signing.");
    Signature sig = Signature.getInstance("SHA1withRSA", "SunPKCS11-NSS-FIPS");
    sig.initSign(priv);

    System.out.println(" Open the digital object to sign.");
    FileInputStream fis = new FileInputStream( "digitalRecipes2.txt" );
    BufferedInputStream bufin = new BufferedInputStream(fis);
    byte[] buffer = new byte[1024];
    int len;
    while ((len = bufin.read(buffer)) >= 0) {
        sig.update(buffer, 0, len);
    }
    bufin.close();

    byte[] realSig = sig.sign();

    FileOutputStream sigfos = new FileOutputStream("digitalRecipes2.txt.sig");
    sigfos.write(realSig);
    sigfos.close();

    java.security.cert.Certificate cert = ks.getCertificate(alias);
    byte[] encodedCert = cert.getEncoded();

    FileOutputStream certfos = new FileOutputStream("mykey.cert");
    certfos.write(encodedCert);
    certfos.close();    
} catch (Exception e) {
    System.err.println( "Caught exception " + e.toString() );
    e.printStackTrace();
}

and here's the config I'm using for nss. 这是我用于nss的配置。

name = NSS-FIPS
nssLibraryDirectory = /opt/local/lib/nss
nssSecmodDirectory = /Users/xxxx/work/workspace/learnin/XXXX
nssDbMode = readWrite 
nssModule = fips

When I run this code, I get the the following stacktrace. 当我运行此代码时,我得到以下堆栈跟踪。

Initialize the signing.
Caught exception java.security.InvalidKeyException: Could not create RSA private key
java.security.InvalidKeyException: Could not create RSA private key
    at     sun.security.pkcs11.P11RSAKeyFactory.implTranslatePrivateKey(P11RSAKeyFactory.java:88)
    at sun.security.pkcs11.P11KeyFactory.engineTranslateKey(P11KeyFactory.java:115)
    at sun.security.pkcs11.P11KeyFactory.convertKey(P11KeyFactory.java:48)
    at sun.security.pkcs11.P11Signature.engineInitSign(P11Signature.java:374)
    at java.security.Signature$Delegate.engineInitSign(Signature.java:1095)
    at java.security.Signature.initSign(Signature.java:480)
    at     com.xxxxxxxx.digitalSigning.SignMeUpSunPKCS11NSS.main(SignMeUpSunPKCS11NSS.java:43)
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_USER_NOT_LOGGED_IN
    at sun.security.pkcs11.wrapper.PKCS11.C_CreateObject(Native Method)
    at sun.security.pkcs11.P11RSAKeyFactory.generatePrivate(P11RSAKeyFactory.java:238)
    at     sun.security.pkcs11.P11RSAKeyFactory.implTranslatePrivateKey(P11RSAKeyFactory.java:62)
    ... 6 more

and it's the CKR_USER_NOT_LOGGED_IN error that I have no idea what to do with. 这是CKR_USER_NOT_LOGGED_IN错误,我不知道该怎么做。

If I change the NSS configuration to not use FIPS mode, then the program runs fine and signs the file, gives the signature, and gives the public key. 如果我将NSS配置更改为不使用FIPS模式,则程序运行正常并签署文件,给出签名并提供公钥。

I created the NSS databases using the following commands while in the appropriate directory listed in the NSS config file. 我在NSS配置文件中列出的相应目录中使用以下命令创建了NSS数据库。

modutil -create -dbdir .
modutil -fips true -dbdir .
modutil -changepw "NSS FIPS 140-2 Certificate DB" -dbdir .

You should login on security token first. 您应首先登录安全令牌。 You can use AuthProvider: 您可以使用AuthProvider:

AuthProvider aprov = Security.getProvider("SunPKCS11-NSS-FIPS");
aprov.login(subject, new MyCallbackHandler());

In accordance with: 依据:

http://docs.oracle.com/javase/6/docs/technotes/guides/security/p11guide.html#Login http://docs.oracle.com/javase/6/docs/technotes/guides/security/p11guide.html#Login

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

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