私は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
でテストを実行しても、この問題が発生する原因になっていることが判明