`

签字证书例子

阅读更多

import java.io.FileInputStream;    
import java.io.FileOutputStream;    
import java.io.IOException;    
import java.io.InputStream;    
import java.io.InputStreamReader;    
import java.io.PushbackReader;    
import java.security.KeyStore;    
import java.security.Principal;    
import java.security.PrivateKey;    
import java.security.cert.CertificateFactory;    
import java.security.cert.X509Certificate;    
import java.util.Arrays;    
   
import sun.security.x509.CertificateIssuerName;    
import sun.security.x509.X500Name;    
import sun.security.x509.X509CertImpl;    
import sun.security.x509.X509CertInfo;  


public class CertificateSigner {    
  public static void main(String[] args) {    
    String ksname = null; // the keystore name    
    String alias = null; // the private key alias    
    String inname = null; // the input file name    
    String outname = null; // the output file name    
    for (int i = 0; i < args.length; i += 2) {    
      if (args[i].equals("-keystore"))    
        ksname = args[i + 1];    
      else if (args[i].equals("-alias"))    
        alias = args[i + 1];    
      else if (args[i].equals("-infile"))    
        inname = args[i + 1];    
      else if (args[i].equals("-outfile"))    
        outname = args[i + 1];    
      else   
        usage();    
    }    
   
    if (ksname == null || alias == null || inname == null   
        || outname == null)    
      usage();    
   
    try {    
      PushbackReader console = new PushbackReader(new InputStreamReader(    
          System.in));    
   
      KeyStore store = KeyStore.getInstance("JKS", "SUN");    
      InputStream in = new FileInputStream(ksname);    
      char[] password = readPassword(console, "Keystore password");    
      store.load(in, password);    
      Arrays.fill(password, ' ');    
      in.close();    
   
      char[] keyPassword = readPassword(console, "Key password for "   
          + alias);    
      PrivateKey issuerPrivateKey = (PrivateKey) store.getKey(alias,    
          keyPassword);    
      Arrays.fill(keyPassword, ' ');    
   
      if (issuerPrivateKey == null)    
        error("No such private key");    
   
      in = new FileInputStream(inname);    
   
      CertificateFactory factory = CertificateFactory    
          .getInstance("X.509");    
   
      X509Certificate inCert = (X509Certificate) factory    
          .generateCertificate(in);    
      in.close();    
      byte[] inCertBytes = inCert.getTBSCertificate();    
   
      X509Certificate issuerCert = (X509Certificate) store    
          .getCertificate(alias);    
      Principal issuer = issuerCert.getSubjectDN();    
      String issuerSigAlg = issuerCert.getSigAlgName();    
   
      FileOutputStream out = new FileOutputStream(outname);    
   
      X509CertInfo info = new X509CertInfo(inCertBytes);    
      info.set(X509CertInfo.ISSUER, new CertificateIssuerName(    
          (X500Name) issuer));    
   
      X509CertImpl outCert = new X509CertImpl(info);    
      outCert.sign(issuerPrivateKey, issuerSigAlg);    
      outCert.derEncode(out);    
   
      out.close();    
    } catch (Exception exception) {    
      System.out.println(exception);    
    }    
  }    
   
  public static char[] readPassword(PushbackReader in, String prompt)    
      throws IOException {    
    System.out.print(prompt + ": ");    
    System.out.flush();    
    final int MAX_PASSWORD_LENGTH = 100;    
    int length = 0;    
    char[] buffer = new char[MAX_PASSWORD_LENGTH];    
   
    while (true) {    
      int ch = in.read();    
      if (ch == '\r' || ch == '\n' || ch == -1   
          || length == MAX_PASSWORD_LENGTH) {    
        if (ch == '\r') // handle DOS "\r\n" line ends    
        {    
          ch = in.read();    
          if (ch != '\n' && ch != -1)    
            in.unread(ch);    
        }    
        char[] password = new char[length];    
        System.arraycopy(buffer, 0, password, 0, length);    
        Arrays.fill(buffer, ' ');    
        return password;    
      } else {    
        buffer[length] = (char) ch;    
        length++;    
      }    
    }    
  }    
   
  public static void error(String message) {    
    System.out.println(message);    
    System.exit(1);    
  }    
   
  public static void usage() {    
    System.out.println("Usage: java CertificateSigner"   
        + " -keystore keyStore -alias issuerKeyAlias"   
        + " -infile inputFile -outfile outputFile");    
    System.exit(1);    
  }    
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics