Java самоподписан сертификат и използване на хранилище за ключове

Трябва да създам публичен и частен ключ заедно с публичния сертификат. Мога да генерирам сертификат за самоподписване, като използвам следния код ...

    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");  
    keyPairGenerator.initialize(1024);  
    KeyPair KPair = keyPairGenerator.generateKeyPair(); 
   PrivateKey privkey = KPair.getPrivate();

  X509CertInfo info = new X509CertInfo();
  Date from = new Date();
  Date to = new Date(from.getTime() + days * 86400000l);
  CertificateValidity interval = new CertificateValidity(from, to);
  BigInteger sn = new BigInteger(64, new SecureRandom());
  X500Name owner = new X500Name(dn);

  info.set(X509CertInfo.VALIDITY, interval);
  info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(sn));
  info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(owner));
  info.set(X509CertInfo.ISSUER, new CertificateIssuerName(owner));
  info.set(X509CertInfo.KEY, new CertificateX509Key(pair.getPublic()));
  info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3));
  AlgorithmId algo = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
  info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algo));

  // Sign the cert to identify the algorithm that's used.
  X509CertImpl cert = new X509CertImpl(info);
  cert.sign(privkey, algorithm);

  // Update the algorith, and resign.
  algo = (AlgorithmId)cert.get(X509CertImpl.SIG_ALG);
  info.set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM, algo);
  cert = new X509CertImpl(info);
  cert.sign(privkey, algorithm);

Сега трябва да запазя частния и публичния ключ или чрез използване на хранилище за ключове, или по друг начин, за да мога да ги извлека за подписване на всеки файл или обект. Опитах се да използвам просто поточно предаване на файлове, но ми даде грешка и изглежда, че не е правилният начин. Моля, насочете ме какво да правя по-нататък. Искам да използвам сертификат и частен ключ, за да подпиша някои данни и искам да ги запазя, за да мога да използвам проверка по всяко време.


person wolvorinePk    schedule 11.03.2013    source източник


Отговори (1)


намерих отговора

   private  void savePublicKeyToFile(String fileName,
                                BigInteger mod, BigInteger exp) throws IOException {
     ObjectOutputStream oout = new ObjectOutputStream(
             new BufferedOutputStream(new FileOutputStream(fileName)));
     try {
         oout.writeObject(mod);
         oout.writeObject(exp);
     } catch (Exception e) {
        // throw new SomeException(e);
     } finally {
         oout.close();
     }
 }

  private  void savePrivteKeyToFile(String fileName,
                                BigInteger mod, BigInteger PublicExponent, BigInteger PrivateExponent,
            BigInteger PrimeP, BigInteger PrimeQ,BigInteger PrimeExponentP,BigInteger PrimeExponentQ,
            BigInteger CrtCoefficient) throws IOException {
     ObjectOutputStream oout = new ObjectOutputStream(
             new BufferedOutputStream(new FileOutputStream(fileName)));
     try {
         oout.writeObject(mod);
         oout.writeObject(PublicExponent);
         oout.writeObject(PrivateExponent);
         oout.writeObject(PrimeP);
         oout.writeObject(PrimeQ);
         oout.writeObject(PrimeExponentP);
         oout.writeObject(PrimeExponentQ);
         oout.writeObject(CrtCoefficient);
     } catch (Exception e) {
        // throw new SomeException(e);
     } finally {
         oout.close();
     }
 }


     // To save in keystore here is the way


     Certificate [] certChain = new Certificate[1];
    certChain[0] = ca;
    String strAlias = "abcalias", strPassword="mypass";
    KeyStore keyStore = KeyStore.getInstance("jks");
    keyStore.load(null,strPassword.toCharArray());
    keyStore.setEntry(strAlias,
       new KeyStore.PrivateKeyEntry((PrivateKey) KPair.getPrivate(), certChain),
       new KeyStore.PasswordProtection(strPassword.toCharArray()));

    FileOutputStream fkey = new FileOutputStream(strFilePath+".keystore"); 
    keyStore.store(fkey, strPassword.toCharArray());
    fkey.close();
person wolvorinePk    schedule 23.03.2013