如何从文件加载RSA私钥

如何从文件加载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

虽然不是习惯性的或安全的,但为了这个帖子,我提供了我正在使用的公共证书和私钥。一旦问题解决了,我当然会重新创建新的。:)


慕容708150
浏览 765回答 3
3回答

喵喵时光机

您需要使用以下命令将私钥转换为PKCS8格式:openssl&nbsp;pkcs8&nbsp;-topk8&nbsp;-inform&nbsp;PEM&nbsp;-outform&nbsp;DER&nbsp;-in&nbsp;private_key_file&nbsp;&nbsp;-nocrypt&nbsp;>&nbsp;pkcs8_key在此之后,您的java程序可以读取它。

慕哥6287543

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

相关分类

Java