2016-04-04 21 views
0

私はXingCertificateファイルをアーカイブするためにlingala zip4jを使用しようとしています。Zip4J - > java.security.ProviderException:MacSpiのインスタンスを構築できませんでした。

しかし、私がJunitを使って単体テストを行っているときだけ、この奇妙な例外が発生しています。

定期的に(春のWebアプリケーションである)私のアプリケーションをすべて実行すると、例外なく正常に動作し、問題なくファイルを適切にアーカイブおよびアンアーカイブすることができます。

import net.lingala.zip4j.exception.ZipException; 
import net.lingala.zip4j.io.ZipOutputStream; 
import net.lingala.zip4j.model.ZipParameters; 
import net.lingala.zip4j.util.Zip4jConstants; 

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.IOException; 
import java.security.cert.CertificateEncodingException; 
import java.security.cert.X509Certificate; 
import java.util.List; 
import java.util.UUID; 

public class ZipTestUtils { 

    public static byte[] archive(List<X509Certificate> certificateList, String password) 
      throws IOException, CertificateEncodingException, ZipException { 

     byte[] bytes = null; 

     // --------Encryption zipParameters (for password protection)-------- 
     ZipParameters zipParameters = getZipParameters(password); 

     // -------------------- CREATE ZIP file -------------------- 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
     ZipOutputStream outputZipStream = new ZipOutputStream(outputStream); 

     // Create ZIP file 
     for (X509Certificate certificate : certificateList) { 
      if (certificate == null) { 
       // skip invalid entries. 
       continue; 
      } 

      File file = File.createTempFile(UUID.randomUUID().toString(), ".cer"); 
      file.deleteOnExit(); 

      outputZipStream.putNextEntry(file, zipParameters); 
      outputZipStream.write(CertificateTestUtils.encodeCertificate(certificate)); 
      outputZipStream.closeEntry(); 
     } 

     //finish up 
     outputZipStream.finish(); 

     bytes = outputStream.toByteArray(); 


     return bytes; 
    } 

    private static ZipParameters getZipParameters(String password) { 
     // Create ZipParameters 
     ZipParameters zipParameters = new ZipParameters(); 

     // Set how you want to encrypt files 
     zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); 
     zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); 

     // Set encryption of files to true 
     zipParameters.setEncryptFiles(true); 

     // Set encryption method 
     zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); 
     // Set key strength 
     zipParameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); 

     // Set password 
     zipParameters.setPassword(password); 
     return zipParameters; 
    } 
} 

私は、Java 1.6

私も1.8を使用して試してみたを使用しますが、同じを取得しています:ここで

net.lingala.zip4j.exception.ZipException: java.security.ProviderException: Could not construct MacSpi instance 

    at net.lingala.zip4j.crypto.AESEncrpyter.deriveKey(AESEncrpyter.java:116) 
    at net.lingala.zip4j.crypto.AESEncrpyter.init(AESEncrpyter.java:89) 
    at net.lingala.zip4j.crypto.AESEncrpyter.<init>(AESEncrpyter.java:69) 
    at net.lingala.zip4j.io.CipherOutputStream.initEncrypter(CipherOutputStream.java:173) 
    at net.lingala.zip4j.io.CipherOutputStream.putNextEntry(CipherOutputStream.java:133) 
    at net.lingala.zip4j.io.DeflaterOutputStream.putNextEntry(DeflaterOutputStream.java:45) 
    ... 

Caused by: java.security.ProviderException: Could not construct MacSpi instance 
    at javax.crypto.Mac.chooseFirstProvider(Mac.java:316) 
    at javax.crypto.Mac.getMacLength(Mac.java:398) 
    at net.lingala.zip4j.crypto.PBKDF2.MacBasedPRF.<init>(MacBasedPRF.java:45) 
    at net.lingala.zip4j.crypto.PBKDF2.PBKDF2Engine.assertPRF(PBKDF2Engine.java:103) 
    at net.lingala.zip4j.crypto.PBKDF2.PBKDF2Engine.deriveKey(PBKDF2Engine.java:66) 
    at net.lingala.zip4j.crypto.AESEncrpyter.deriveKey(AESEncrpyter.java:113) 
    ... 

は、私が使用した本命をアーカイブするために私のutilsのコードですエラー。

注:私はJUnitを用いた実行したときに、これが唯一の私がPowerMockRunner.classでテストを実行しても、この問題が発生する原因になっていることが判明

答えて

1

...何が起こっています。

理由はわかりませんが、私はpowerMockを使わずにリフレクションで自分のモックを作るのを克服することができました。

私は直面した問題を解決しましたが、これは非常に奇妙な問題です。誰かがなぜこれが起こっているのか分かっていれば、私はまだ知りたいです。

関連する問題