2014-01-28 3 views
0

나는 HSM에 의해 생성 된 RSA 공개 키 (2048 비트)를 갖고 있는데,이 키는 파일 (256 바이트 크기)에 저장되어 DER로 인코딩되어있다.프로그래밍 방식으로 자체 서명 된 인증서를 생성하는 방법?

BirthcyCastle이없는 JDK API를 사용하여 프로그래밍 방식으로 자체 서명 된 인증서를 만들 수 있습니까? 나는 한 PublicKey 객체 생성 키 파일을로드하는 것을 시도하고 있기 때문에

나는 첫 번째 단계와 붙어있어 :

import java.io.FileInputStream; 
import java.security.KeyFactory; 
import java.security.PublicKey; 
import java.security.spec.PKCS8EncodedKeySpec; 

import org.apache.commons.io.IOUtils; 

public class Crypto { 
public static void main(String[] args) throws Exception { 

    byte[] byteArray = IOUtils.toByteArray(new FileInputStream("/tmp/pub.key")); 

    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(byteArray); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    PublicKey pub = kf.generatePublic(spec); 
    .... 
} 
} 

을하지만 난이 예외가 얻을 :

Exception in thread "main" java.security.spec.InvalidKeySpecException: Only RSAPublicKeySpec and X509EncodedKeySpec supported for RSA public keys 
    at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:289) 
    at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:184) 
    at java.security.KeyFactory.generatePublic(KeyFactory.java:304) 
    at org.alex.Crypto.main(Crypto.java:17) 

인가를 그걸 할 방법이 있니?

+0

링크가 도움이 될 수 있습니다 : http://stackoverflow.com/questions/19512088/how-to-generate-apk-file-programmatically-through-java-code –

답변

0

예외는 당신에게 문제를 말하고 있습니다! =>Only RSAPublicKeySpec and X509EncodedKeySpec supported for RSA public keys

지원되지 않는 PKCS8EncodedKeySpec를 사용하려고 내부적으로 실제로 RSA 키에 대한 PKCS 번호 1 인코딩을 사용 RSAPublicKeySpec 또는 X509EncodedKeySpec 클래스

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

byte[] input = new byte[] { (byte) 0xbe, (byte) 0xef }; 
Cipher cipher = Cipher.getInstance("RSA/None/NoPadding", "BC"); 

KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC"); 
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(
    "12345678", 16), new BigInteger("11", 16)); 
RSAPrivateKeySpec privKeySpec = new RSAPrivateKeySpec(new BigInteger(
    "12345678", 16), new BigInteger("12345678", 
    16)); 

RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubKeySpec); 
RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(privKeySpec); 

cipher.init(Cipher.ENCRYPT_MODE, pubKey); 
+2

그리고 인증서 작성을 담당하는 코드는 어디에 있습니까? – niceman

1

사용 X509EncodedKeySpec를 (만들) 대신. 나머지 코드는 동일하게 유지하십시오. PKCS # 8은 공개 키가 아닌 개인 키용입니다 (다른 키로 키를 랩핑하는 데 필요한 PKCS # 8 내부 구조를 사용하고 공개 키를 랩핑하는 것은 의미가 없습니다).

관련 문제