为了账号安全,请及时绑定邮箱和手机立即绑定

如何从文件加载RSA私钥

如何从文件加载RSA私钥

慕容708150 2019-08-27 11:20:08
如何从文件加载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程序可以读取它。

查看完整回答
反对 回复 2019-08-27
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

我没有使用BC(我已经用它来签名密钥),但我想知道如何使用默认提供程序从DER解码私钥。编码很容易,解码看起来并不那么简单......我通过调用key.getEncoded()来编码密钥。容易从日志上掉下来。顺便说一下,密钥是使用keytool创建的。我以为我可以使用“RSA”密钥工厂进行解码。有一个generatePrivate()方法返回我想要的私钥,但该方法需要一个KeySpec。RSAPrivateKeySpec采用模数和私有指数。

查看完整回答
反对 回复 2019-08-27
  • 3 回答
  • 0 关注
  • 764 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号