- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的应用程序中使用 Sun 的 MSCAPI 提供程序来检索签名证书。签名者的私钥是 sun.security.mscapi.RSAPrivateKey。IAIK 似乎无法识别此类(请参阅下面的错误)。我不懂为什么。我的问题有哪些解决方案?
提前致谢!
java.security.NoSuchAlgorithmException: Error computing signature value: iaik.cms.CMSException: Unable to calculate signature: java.security.InvalidKeyException: Class does not represent an RSA key: sun.security.mscapi.RSAPrivateKey
at iaik.cms.SignedData.addSignerInfo(Unknown Source)
at testIaikCmsWithMsCAPIProvider.init(testIaikCmsWithMsCAPIProvider.java:69)
at testIaikCmsWithMsCAPIProvider.main(testIaikCmsWithMsCAPIProvider.java:39)
编辑:
这是我的“脏”类测试:
import iaik.asn1.structures.AlgorithmID;
import iaik.cms.CMSException;
import iaik.cms.CMSParsingException;
import iaik.cms.ContentInfo;
import iaik.cms.IssuerAndSerialNumber;
import iaik.cms.SignedData;
import iaik.cms.SignerInfo;
import iaik.utils.Util;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.Security;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class testIaikCmsWithMsCAPIProvider {
public static final String SunMscapiClassName = "sun.security.mscapi.SunMSCAPI";
private Provider provider;
private String providerName;
private String alias = "Sample Alias";
private X509Certificate signerCertificate;
private PrivateKey privateKey;
public static void main(String[] args) {
testIaikCmsWithMsCAPIProvider test = new testIaikCmsWithMsCAPIProvider();
test.init();
}
private void init() {
try {
Class<Provider> sunmscapiClass = (Class<Provider>)Class.forName(SunMscapiClassName);
Provider sunmscapiInstance = sunmscapiClass.newInstance();
Security.addProvider(sunmscapiInstance);
KeyStore ks = null;
ks = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
ks.load(null, null);
this.provider = ks.getProvider();
this.providerName = ks.getProvider().getName();
this.initMscapiProgrammaticMode(ks);
X509Certificate[] certificateChain = new X509Certificate[1];
certificateChain[0] = signerCertificate;
iaik.x509.X509Certificate[] iaikCertificateChain = Util.convertCertificateChain(certificateChain);
IssuerAndSerialNumber issuerSerial = new IssuerAndSerialNumber(iaikCertificateChain[0]);
AlgorithmID signatureAlg = AlgorithmID.rsaEncryption;
AlgorithmID digestAlg = AlgorithmID.sha1;
SignerInfo signerInfo = new SignerInfo(issuerSerial, digestAlg, signatureAlg, privateKey);
Path path = Paths.get("file.pdf");
byte[] signatureFileContent = Files.readAllBytes(path);
SignedData signedData = new SignedData(signatureFileContent, SignedData.EXPLICIT);
signedData.setCertificates(iaikCertificateChain);
signedData.addSignerInfo(signerInfo);
byte[] digitalSignature = new ContentInfo(signedData.getContentType()).getEncoded();
FileOutputStream fos = new FileOutputStream("signature.pdf");
fos.write(digitalSignature);
fos.close();
System.out.println(providerName + provider + alias + signerCertificate + privateKey.getClass());
}
catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void initMscapiProgrammaticMode(KeyStore ks) throws KeyStoreException, UnrecoverableKeyException,
NoSuchAlgorithmException {
X509Certificate javaCert = (X509Certificate)ks.getCertificate(this.alias);
this.signerCertificate = javaCert;
// retrieve associated private key
this.privateKey = (PrivateKey)ks.getKey(this.alias, null);
}
}
最佳答案
经过几个月的研究,我终于找到了解决方案。非常高兴,伙计们,我现在将分享它:
非常简单,在尝试对 IAIK 进行签名时,默认情况下使用它自己的提供程序。现在我们要使用 MSCAPI 之一。这就是为什么我们需要他指定这一行,以便它可以找到正确的提供者:
signedData.setSecurityProvider (new SecurityProvider ());
关于java - 使用 MSCAPI 和 IAIK 的 InvalidKeyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25156143/
我遇到的问题只有在我要生成签名的 apk 时才会发生,但是当我直接从 Android Studio 运行时,一切正常。 错误发生在这里: val key = keyStore? .getKey(KEY
我在尝试使用我的公钥加密时遇到了上述异常。 java.security.InvalidKeyException: IOException: DerInputStream.getLength(): le
我是 Java 新手,想使用 RSA 算法包装对称 key 。就我而言,我不会生成用于包装的公钥,而是从 Microsoft Keystore 检索公钥。 // Encrypt the generat
我已经能够使用该算法来加密和解密文件,但是当我尝试将文件从 Android 发送到 WAS 服务器时,它失败了。这是加密的一面 Security.addProvider(new BouncyC
我需要将加密的密码存储在数据库中而不存储任何 key 或盐。我想确保它也更安全,即使它是双向加密。所以在谷歌搜索了一下之后,我创建了一个示例程序来测试它。我的想法是创建一个自定义 JPA Attrib
我正在尝试在 android 上运行 netty。它在运行 3.2 的摩托罗拉 Xoom 平板电脑上运行良好。但它在分别运行 2.3.6 和 3.1 的 Samsung Galaxy S 和 Gala
亲爱的, 我需要帮助来理解为什么 decryptString 不起作用并抛出“java.security.InvalidKeyException:需要 RSA 私钥或公钥”。当调用加密方法时,我通过私
我目前正在开发一个使用 key 加密/解密特定文件的功能。我写了三个类,一个生成 key ,一个用 key 加密文件,一个解密。 生成 key 和加密文件工作正常,但是当我尝试解密文件时,在以下行抛出
我有一个测试在我的开发 MacBook Pro 上运行良好,但无法在持续集成 TeamCity 服务器中运行。 错误如下: java.security.InvalidKeyException: Ill
我正在 netbeans 中构建一个桌面应用程序,以便在密码键盘(设备)上加载按键。相同的代码在 android 上运行并且使用 16 字节键可以正常工作但是在桌面应用程序上它会抛出 16 字节错误但
我的任务是通过 LDAP 实现对 Active Directory 联合身份验证服务 (SSL) 的可访问性。起初我不得不说我在 ADFS 和 SAML 方面的经验非常少。我决定采用 Spring S
我正在使用以下示例: http://compscipleslab.wordpress.com/category/java/ 但是我遇到了异常,当我记录异常时,它出现在我的 logcat 中,说明:In
我正在尝试编写一个服务来处理用户密码哈希和验证。我正在使用 Wildfly Elytron 库,并在 quarkus Web 服务的上下文中使用该服务。我遇到的问题是,当我尝试验证密码时,验证方法会抛
这个问题已经有答案了: InvalidKeyException Illegal key size (6 个回答) 已关闭 5 年前。 实际上,我收到 InvalidKeyException: 非法 k
编写代码生成数字证书 这是导致问题的代码段 PBEKeySpec keySpec = new PBEKeySpec(password); SecretKeyFactory keyFactory =
我已将 ODL Netconf 测试工具 (netconf-testtool-1.1.0-Boron-executable.jar) 部署到我的 Nitrogen ODL Controller 上,以
尝试在客户端和服务器之间进行 TLS 握手。但是,更改密码规范步骤失败。同样在客户端收到如下所述的异常:我无法理解为什么我会收到如下奇怪的异常。 这是什么意思?关于如何解决此问题的任何想法? 我在 J
我收到 java.security.InvalidKeyException: Keystore operation failed。有人有想法吗?这是我的代码: initDecodeCipher 代码:
我在我的应用程序中使用 Sun 的 MSCAPI 提供程序来检索签名证书。签名者的私钥是 sun.security.mscapi.RSAPrivateKey。IAIK 似乎无法识别此类(请参阅下面的错
我必须读取 pem key 文件以获得 RSA 公钥,然后使用它们进行加密。我可以使用 openssl 并将 pem 文件转换为 der 文件来执行此操作。然后使用 X509EncodedKeySpe
我是一名优秀的程序员,十分优秀!