PublicKeyProvider.java
上传用户:mbg588933
上传日期:2022-08-05
资源大小:10k
文件大小:8k
源码类别:

加密解密

开发平台:

Java

  1. /*******************************************************************************
  2.  * Copyright (c) 2008 by Stefan Laubenberger and Silvan Spross.
  3.  * 
  4.  * This program is free software: you can redistribute it and/or modify
  5.  * it under the terms of the General Public License v2.0.
  6.  * 
  7.  * This program is distributed in the hope that it will be useful,
  8.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10.  * 
  11.  * See the GNU General Public License for more details:
  12.  * ----------------------------------------------------
  13.  * <http://www.gnu.org/licenses>
  14.  * 
  15.  * This distribution is available at:
  16.  * ----------------------------------
  17.  * <http://code.google.com/p/bogatyr/>
  18.  * 
  19.  * Contact information:
  20.  * --------------------
  21.  * Stefan Laubenberger
  22.  * Bullingerstrasse 53
  23.  * CH-8004 Zuerich
  24.  * <laubenberger@gmail.com>
  25.  * 
  26.  * Silvan Spross
  27.  * Badenerstrasse 47 
  28.  * CH-8004 Zuerich
  29.  * <silvan.spross@gmail.com>
  30.  * 
  31.  *******************************************************************************/
  32. import java.io.BufferedInputStream;
  33. import java.io.File;
  34. import java.io.FileInputStream;
  35. import java.io.IOException;
  36. import java.io.InputStream;
  37. import java.io.OutputStream;
  38. import java.math.BigInteger;
  39. import java.security.InvalidKeyException;
  40. import java.security.KeyPair;
  41. import java.security.NoSuchProviderException;
  42. import java.security.SignatureException;
  43. import java.security.cert.CertificateEncodingException;
  44. import java.security.cert.CertificateException;
  45. import java.security.cert.CertificateFactory;
  46. import java.security.cert.X509Certificate;
  47. import java.util.Date;
  48. import javax.security.auth.x500.X500Principal;
  49. import org.bouncycastle.asn1.x509.BasicConstraints;
  50. import org.bouncycastle.asn1.x509.ExtendedKeyUsage;
  51. import org.bouncycastle.asn1.x509.GeneralName;
  52. import org.bouncycastle.asn1.x509.GeneralNames;
  53. import org.bouncycastle.asn1.x509.KeyPurposeId;
  54. import org.bouncycastle.asn1.x509.KeyUsage;
  55. import org.bouncycastle.asn1.x509.X509Extensions;
  56. import org.bouncycastle.x509.X509V3CertificateGenerator;
  57. import ch.orwell.bogatyr.helper.HelperIO;
  58. import ch.orwell.bogatyr.helper.logger.Logger;
  59. /**
  60.  * The PublicKeyProvider class
  61.  *
  62.  * @author Stefan Laubenberger
  63.  * @version 2008080910
  64.  */
  65. public abstract class PublicKeyProvider {
  66. /**
  67.      * Get the certificate out of the given certificate file
  68.      * 
  69.      * @param file containing the certificate
  70.      * @return X509Certificate the certificate
  71.      * @throws CertificateException e
  72.      * @throws NoSuchProviderException e
  73.      * @throws IOException e
  74.      */
  75.     public static X509Certificate getCertificate(final File file) throws CertificateException, NoSuchProviderException, IOException {
  76. Logger.getInstance().writeMethodEntry(PublicKeyProvider.class, "getCertificate", file);  //$NON-NLS-1$
  77.         final FileInputStream fis = new FileInputStream(file);
  78.         final X509Certificate cert = getCertificate(new BufferedInputStream(fis));
  79.         
  80. Logger.getInstance().writeMethodExit(PublicKeyProvider.class, "getCertificate", cert);  //$NON-NLS-1$
  81.         return cert;
  82.     }
  83.     /**
  84.      * Get the certificate out of the given certificate stream
  85.      * 
  86.      * @param file containing the certificate
  87.      * @return X509Certificate the certificate
  88.      * @throws CertificateException e
  89.      * @throws NoSuchProviderException e
  90.      * @throws IOException e
  91.      */
  92.     public static X509Certificate getCertificate(final InputStream is) throws CertificateException, NoSuchProviderException, IOException {    
  93. Logger.getInstance().writeMethodEntry(PublicKeyProvider.class, "getCertificate", is);  //$NON-NLS-1$
  94. final X509Certificate cert;
  95.      try {
  96.             // Generate the certificate factory
  97.             final CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC"); //$NON-NLS-1$ //$NON-NLS-2$
  98.             // get the certificate
  99.             cert = (X509Certificate)cf.generateCertificate(is);
  100.         } finally {
  101.             if (is != null) {
  102.                 is.close();
  103.             }
  104.         }
  105. Logger.getInstance().writeMethodExit(PublicKeyProvider.class, "getCertificate", cert);  //$NON-NLS-1$
  106. return cert;
  107.     }
  108.     
  109.     /**
  110.      * Store the certificate on a stream
  111.      * 
  112.      * @param cert certificate
  113.      * @param file for the certificate
  114.      * @throws IOException 
  115.      * @throws CertificateEncodingException 
  116.      */
  117.     public static void storeCertificate(final X509Certificate cert, final OutputStream os) throws CertificateEncodingException, IOException {    
  118. Logger.getInstance().writeMethodEntry(PublicKeyProvider.class, "storeCertificate", new Object[]{cert, os});  //$NON-NLS-1$
  119.      HelperIO.writeStream(os, cert.getEncoded());
  120.      Logger.getInstance().writeMethodExit(PublicKeyProvider.class, "storeCertificate");  //$NON-NLS-1$
  121.     }
  122.     
  123.     /**
  124.      * Store the certificate in a file
  125.      * 
  126.      * @param cert certificate
  127.      * @param file for the certificate
  128.      * @throws IOException 
  129.      * @throws CertificateEncodingException 
  130.      */
  131.     public static void storeCertificate(final X509Certificate cert, final File file) throws CertificateEncodingException, IOException {    
  132. Logger.getInstance().writeMethodEntry(PublicKeyProvider.class, "storeCertificate", new Object[]{cert, file});  //$NON-NLS-1$
  133. HelperIO.writeFileAsBinary(file, cert.getEncoded(), false);
  134. Logger.getInstance().writeMethodExit(PublicKeyProvider.class, "storeCertificate");  //$NON-NLS-1$
  135.     }
  136.     /**
  137.      * Generate a public key certificate out of the given keypair
  138.      * 
  139.      * @param pair the keypair for the certificate
  140.      * @param issuerDN (e.g. "CN=Test Certificate")
  141.      * @param subjectDN (e.g. "CN=Test Certificate")
  142.      * @param generalName of he certificate owner (e.g. laubenberger@gmail.com)
  143.      * @param start date of the certificate
  144.      * @param end date of the certificate
  145.      * @return X509Certificate the certificate
  146.      * @throws SignatureException 
  147.      * @throws SecurityException 
  148.      * @throws NoSuchProviderException 
  149.      * @throws InvalidKeyException 
  150.      */
  151.     public static X509Certificate generateCertificate(KeyPair pair, String issuerDN, String subjectDN, String generalName, Date start, Date end) throws InvalidKeyException, NoSuchProviderException, SecurityException, SignatureException {
  152. Logger.getInstance().writeMethodEntry(PublicKeyProvider.class, "generateCertificate", new Object[]{pair, issuerDN, subjectDN, generalName, start, end});  //$NON-NLS-1$
  153.     // generate the certificate
  154. final X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
  155.     certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
  156.     certGen.setIssuerDN(new X500Principal(issuerDN));
  157.     certGen.setNotBefore(start);
  158.     certGen.setNotAfter(end);
  159.     certGen.setSubjectDN(new X500Principal(subjectDN));
  160.     certGen.setPublicKey(pair.getPublic());
  161.     certGen.setSignatureAlgorithm("SHA256WithRSAEncryption"); //$NON-NLS-1$
  162.     certGen.addExtension(X509Extensions.BasicConstraints, true, new BasicConstraints(false));
  163.     certGen.addExtension(X509Extensions.KeyUsage, true, new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyEncipherment));
  164.     certGen.addExtension(X509Extensions.ExtendedKeyUsage, true, new ExtendedKeyUsage(KeyPurposeId.id_kp_serverAuth));
  165.     certGen.addExtension(X509Extensions.SubjectAlternativeName, false, new GeneralNames(new GeneralName(GeneralName.rfc822Name, generalName)));
  166.     final X509Certificate cert = certGen.generateX509Certificate(pair.getPrivate(), "BC");  //$NON-NLS-1$
  167.     
  168. Logger.getInstance().writeMethodExit(PublicKeyProvider.class, "generateCertificate", cert);  //$NON-NLS-1$
  169.     return cert;
  170. }
  171. }