如何从文件加载RSA私钥我正在研究SAML 1.1断言消费者服务的测试工具。测试必须生成签名的SAMLResponse并将其提交给Base64中编码的ACS。ACS必须能够使用X509公共证书验证签名的消息。我能够构建SAMLResponse,添加必要的断言等。但是当我尝试签署对象时,我遇到了问题。这是我当前代码的片段:String certPath = "mycert.pem";File pubCertFile = new File(certPath);BufferedInputStream bis = null;try {
bis = new BufferedInputStream(new FileInputStream(pubCertFile));} catch(FileNotFoundException e) {
throw new Exception("Could not locate certfile at '" + certPath + "'", e);}CertificateFactory certFact = null;Certificate cert = null;try {
certFact = CertificateFactory.getInstance("X.509");
cert = certFact.generateCertificate(bis);} catch(CertificateException e) {
throw new Exception("Could not instantiate cert", e);}bis.close();ArrayList<Certificate> certs = new ArrayList<Certificate>();certs.add(cert);String keyPath = "mykey.pem";File privKeyFile = new File(keyPath);try {
bis = new BufferedInputStream(new FileInputStream(privKeyFile));} catch(FileNotFoundException e) {
throw new Exception("Could not locate keyfile at '" + keyPath + "'", e);}byte[] privKeyBytes = new byte[(int)privKeyFile.length()];bis.read(privKeyBytes);bis.close();KeyFactory keyFactory = KeyFactory.getInstance("RSA");KeySpec ks = new PKCS8EncodedKeySpec(privKeyBytes);RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(ks);samlResponse.sign(Signature.getInstance("SHA1withRSA").toString(), privKey, certs);错误发生在倒数第二行。我在控制台中看到以下内容:java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format虽然不是习惯性的或安全的,但为了这个帖子,我提供了我正在使用的公共证书和私钥。一旦问题解决了,我当然会重新创建新的。:)
3 回答

喵喵时光机
TA贡献1846条经验 获得超7个赞
您需要使用以下命令将私钥转换为PKCS8格式:
openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key_file -nocrypt > pkcs8_key
在此之后,您的java程序可以读取它。

慕哥6287543
TA贡献1831条经验 获得超10个赞
我没有使用BC(我已经用它来签名密钥),但我想知道如何使用默认提供程序从DER解码私钥。编码很容易,解码看起来并不那么简单......我通过调用key.getEncoded()来编码密钥。容易从日志上掉下来。顺便说一下,密钥是使用keytool创建的。我以为我可以使用“RSA”密钥工厂进行解码。有一个generatePrivate()方法返回我想要的私钥,但该方法需要一个KeySpec。RSAPrivateKeySpec采用模数和私有指数。
添加回答
举报
0/150
提交
取消