00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 package org.objectweb.proactive.ext.security;
00032
00033 import java.io.ByteArrayInputStream;
00034 import java.io.IOException;
00035 import java.math.BigInteger;
00036 import java.security.GeneralSecurityException;
00037 import java.security.InvalidAlgorithmParameterException;
00038 import java.security.InvalidKeyException;
00039 import java.security.KeyPair;
00040 import java.security.NoSuchAlgorithmException;
00041 import java.security.NoSuchProviderException;
00042 import java.security.PrivateKey;
00043 import java.security.Provider;
00044 import java.security.PublicKey;
00045 import java.security.SecureRandom;
00046 import java.security.Security;
00047 import java.security.SignatureException;
00048 import java.security.cert.CertPath;
00049 import java.security.cert.CertPathValidator;
00050 import java.security.cert.CertPathValidatorException;
00051 import java.security.cert.CertificateException;
00052 import java.security.cert.CertificateFactory;
00053 import java.security.cert.PKIXCertPathValidatorResult;
00054 import java.security.cert.PKIXParameters;
00055 import java.security.cert.PolicyNode;
00056 import java.security.cert.TrustAnchor;
00057 import java.security.cert.X509Certificate;
00058 import java.util.ArrayList;
00059 import java.util.Collections;
00060 import java.util.Date;
00061 import java.util.List;
00062 import java.util.Random;
00063
00064 import org.bouncycastle.asn1.ASN1EncodableVector;
00065 import org.bouncycastle.asn1.ASN1InputStream;
00066 import org.bouncycastle.asn1.ASN1Sequence;
00067 import org.bouncycastle.asn1.DERObjectIdentifier;
00068 import org.bouncycastle.asn1.DERSequence;
00069 import org.bouncycastle.asn1.x509.AuthorityKeyIdentifier;
00070 import org.bouncycastle.asn1.x509.BasicConstraints;
00071 import org.bouncycastle.asn1.x509.GeneralName;
00072 import org.bouncycastle.asn1.x509.GeneralNames;
00073 import org.bouncycastle.asn1.x509.PolicyInformation;
00074 import org.bouncycastle.asn1.x509.SubjectKeyIdentifier;
00075 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
00076 import org.bouncycastle.asn1.x509.X509Extensions;
00077 import org.bouncycastle.asn1.x509.X509Name;
00078 import org.bouncycastle.jce.X509KeyUsage;
00079 import org.bouncycastle.jce.provider.JDKKeyPairGenerator;
00080 import org.bouncycastle.x509.X509V3CertificateGenerator;
00081 import org.objectweb.proactive.ProActive;
00082 import org.objectweb.proactive.core.ProActiveException;
00083 import org.objectweb.proactive.core.body.AbstractBody;
00084 import org.objectweb.proactive.core.runtime.RuntimeFactory;
00085 import org.objectweb.proactive.ext.security.exceptions.SecurityNotAvailableException;
00086
00087
00088 public class ProActiveSecurity {
00089 public static Object[] generateGenericCertificateSelfSigned() {
00090 Provider myProvider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
00091 Security.addProvider(myProvider);
00092
00093
00094 KeyPair keyPair = null;
00095 SecureRandom rand = new SecureRandom();
00096
00097 JDKKeyPairGenerator.RSA keyPairGen = new JDKKeyPairGenerator.RSA();
00098
00099 keyPairGen.initialize(1024, rand);
00100
00101 keyPair = keyPairGen.generateKeyPair();
00102
00103 PrivateKey privateKey = keyPair.getPrivate();
00104 PublicKey publicKey = keyPair.getPublic();
00105 String dnName = "CN=Generic Certificate " + new Random().nextLong() +
00106 ", OU=Generic Certificate, EmailAddress=none";
00107
00108 return generateCertificate(dnName, dnName, privateKey, publicKey);
00109 }
00110
00111 public static Object[] genCert(String dn, long validity, String policyId,
00112 PrivateKey privKey, PublicKey pubKey, boolean isCA, String caDn,
00113 PrivateKey caPrivateKey, PublicKey acPubKey)
00114 throws NoSuchAlgorithmException, SignatureException,
00115 InvalidKeyException {
00116
00117 String sigAlg = "SHA1WithRSA";
00118 Date firstDate = new Date();
00119
00120
00121 firstDate.setTime(firstDate.getTime() - (10 * 60 * 1000));
00122
00123 Date lastDate = new Date();
00124
00125
00126 lastDate.setTime(lastDate.getTime() +
00127 (validity * (24 * 60 * 60 * 1000)));
00128
00129 X509V3CertificateGenerator certgen = new X509V3CertificateGenerator();
00130
00131
00132
00133 byte[] serno = new byte[8];
00134 SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
00135 random.setSeed((long) (new Date().getTime()));
00136 random.nextBytes(serno);
00137 certgen.setSerialNumber((new java.math.BigInteger(serno)).abs());
00138 certgen.setNotBefore(firstDate);
00139 certgen.setNotAfter(lastDate);
00140 certgen.setSignatureAlgorithm(sigAlg);
00141 certgen.setSubjectDN(CertTools.stringToBcX509Name(dn));
00142 certgen.setIssuerDN(CertTools.stringToBcX509Name(caDn));
00143 certgen.setPublicKey(pubKey);
00144
00145
00146 BasicConstraints bc = new BasicConstraints(isCA);
00147 certgen.addExtension(X509Extensions.BasicConstraints.getId(), true, bc);
00148
00149
00150 if (false) {
00151
00152 int keyusage = X509KeyUsage.keyCertSign + X509KeyUsage.cRLSign;
00153 X509KeyUsage ku = new X509KeyUsage(keyusage);
00154 certgen.addExtension(X509Extensions.KeyUsage.getId(), true, ku);
00155 }
00156
00157
00158 try {
00159 if (false) {
00160
00161 SubjectPublicKeyInfo spki = new SubjectPublicKeyInfo((ASN1Sequence) new ASN1InputStream(
00162 new ByteArrayInputStream(pubKey.getEncoded())).readObject());
00163 SubjectKeyIdentifier ski = new SubjectKeyIdentifier(spki);
00164
00165 SubjectPublicKeyInfo apki = new SubjectPublicKeyInfo((ASN1Sequence) new ASN1InputStream(
00166 new ByteArrayInputStream(acPubKey.getEncoded())).readObject());
00167 AuthorityKeyIdentifier aki = new AuthorityKeyIdentifier(apki);
00168
00169 certgen.addExtension(X509Extensions.SubjectKeyIdentifier.getId(),
00170 false, ski);
00171 certgen.addExtension(X509Extensions.AuthorityKeyIdentifier.getId(),
00172 false, aki);
00173 }
00174 } catch (IOException e) {
00175 }
00176
00177
00178 if (policyId != null) {
00179 PolicyInformation pi = new PolicyInformation(new DERObjectIdentifier(
00180 policyId));
00181 DERSequence seq = new DERSequence(pi);
00182 certgen.addExtension(X509Extensions.CertificatePolicies.getId(),
00183 false, seq);
00184 }
00185
00186 X509Certificate selfcert = certgen.generateX509Certificate(caPrivateKey);
00187
00188 return new Object[] { selfcert, privKey };
00189 }
00190
00191 public static Object[] generateCertificate(String dnName,
00192 String issuerName, PrivateKey caPrivKey, PublicKey caPubKey) {
00193 KeyPair keyPair = null;
00194
00195 SecureRandom rand = new SecureRandom();
00196
00197 JDKKeyPairGenerator.RSA keyPairGen = new JDKKeyPairGenerator.RSA();
00198
00199 keyPairGen.initialize(1024, rand);
00200
00201 keyPair = keyPairGen.generateKeyPair();
00202
00203 PrivateKey privateKey = keyPair.getPrivate();
00204 PublicKey publicKey = keyPair.getPublic();
00205 X509Certificate certif = null;
00206 Object[] o = null;
00207 try {
00208 o = genCert(dnName, 365, null, privateKey, publicKey, true,
00209 issuerName, caPrivKey, caPubKey);
00210 } catch (InvalidKeyException e) {
00211
00212 e.printStackTrace();
00213 } catch (NoSuchAlgorithmException e) {
00214
00215 e.printStackTrace();
00216 } catch (SignatureException e) {
00217
00218 e.printStackTrace();
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292 return o;
00293 }
00294
00295
00296
00297
00298 public static SubjectKeyIdentifier createSubjectKeyId(PublicKey pubKey) {
00299 try {
00300 ByteArrayInputStream bIn = new ByteArrayInputStream(pubKey.getEncoded());
00301 SubjectPublicKeyInfo info = new SubjectPublicKeyInfo((ASN1Sequence) new ASN1InputStream(
00302 bIn).readObject());
00303
00304 return new SubjectKeyIdentifier(info);
00305 } catch (Exception e) {
00306 throw new RuntimeException("error creating key");
00307 }
00308 }
00309
00310
00311
00312
00313 public static AuthorityKeyIdentifier createAuthorityKeyId(
00314 PublicKey pubKey, X509Name name, int sNumber) {
00315 try {
00316 ByteArrayInputStream bIn = new ByteArrayInputStream(pubKey.getEncoded());
00317 SubjectPublicKeyInfo info = new SubjectPublicKeyInfo((ASN1Sequence) new ASN1InputStream(
00318 bIn).readObject());
00319
00320 GeneralName genName = new GeneralName(name);
00321 ASN1EncodableVector v = new ASN1EncodableVector();
00322
00323 v.add(genName);
00324
00325 return new AuthorityKeyIdentifier(info,
00326 new GeneralNames(new DERSequence(v)),
00327 BigInteger.valueOf(sNumber));
00328 } catch (Exception e) {
00329 throw new RuntimeException("error creating AuthorityKeyId");
00330 }
00331 }
00332
00333 public static AuthorityKeyIdentifier createAuthorityKeyId(PublicKey pubKey) {
00334 try {
00335 ByteArrayInputStream bIn = new ByteArrayInputStream(pubKey.getEncoded());
00336 SubjectPublicKeyInfo info = new SubjectPublicKeyInfo((ASN1Sequence) new ASN1InputStream(
00337 bIn).readObject());
00338
00339 return new AuthorityKeyIdentifier(info);
00340 } catch (Exception e) {
00341 throw new RuntimeException("error creating AuthorityKeyId");
00342 }
00343 }
00344
00345 public static String retrieveVNName(String nodeName) {
00346 String vn = null;
00347 try {
00348 vn = RuntimeFactory.getDefaultRuntime().getVNName(nodeName);
00349 } catch (ProActiveException e1) {
00350 e1.printStackTrace();
00351 }
00352
00353
00354
00355
00356 return vn;
00357
00358
00359
00360
00361
00362
00363
00364
00365 }
00366
00367 public static X509Certificate decodeCertificate(byte[] encodedCert) {
00368 X509Certificate certificate = null;
00369
00370
00371
00372
00373 try {
00374 CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC");
00375 certificate = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(
00376 encodedCert));
00377 } catch (CertificateException e) {
00378 e.printStackTrace();
00379 } catch (NoSuchProviderException e) {
00380 e.printStackTrace();
00381 }
00382 return certificate;
00383 }
00384
00394
00395
00396
00397
00398
00399
00400
00401
00414 public static void verifyCertificates(
00415 java.security.cert.X509Certificate[] certs, boolean checkVadility)
00416 throws GeneralSecurityException {
00417 java.security.cert.X509Certificate pCert = null;
00418 for (int i = 0; i < certs.length; i++) {
00419 if (checkVadility) {
00420 certs[i].checkValidity();
00421 }
00422 pCert = ((i + 1) >= certs.length) ? certs[i] : certs[i + 1];
00423 certs[i].verify(pCert.getPublicKey());
00424 }
00425 }
00426
00436 public static void checkCertificateChain(
00437 java.security.cert.X509Certificate acCert, X509Certificate[] serverCerts)
00438 throws CertificateException {
00439 try {
00440 CertificateFactory cf = null;
00441 cf = CertificateFactory.getInstance("X.509");
00442
00443
00444 List<X509Certificate> mylist = new ArrayList<X509Certificate>();
00445 for (int i = 0; i < serverCerts.length; i++) {
00446 mylist.add(serverCerts[i]);
00447 }
00448 CertPath cp = cf.generateCertPath(mylist);
00449 TrustAnchor anchor = new TrustAnchor(acCert, null);
00450 PKIXParameters params = new PKIXParameters(Collections.singleton(
00451 anchor));
00452 params.setRevocationEnabled(false);
00453 params.setSigProvider("BC");
00454
00455 CertPathValidator cpv = null;
00456 try {
00457 cpv = CertPathValidator.getInstance("PKIX", "BC");
00458 } catch (NoSuchProviderException e5) {
00459 e5.printStackTrace();
00460 }
00461 PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult) cpv.validate(cp,
00462 params);
00463 PolicyNode policyTree = result.getPolicyTree();
00464 PublicKey subjectPublicKey = result.getPublicKey();
00465 System.out.println("Certificate validated");
00466 System.out.println("Policy Tree:\n" + policyTree);
00467 System.out.println("Subject Public key:\n" + subjectPublicKey);
00468 } catch (CertPathValidatorException cpve) {
00469 System.out.println("Validation failure, cert[" + cpve.getIndex() +
00470 "] :" + cpve.getMessage());
00471 } catch (InvalidAlgorithmParameterException e) {
00472
00473 e.printStackTrace();
00474 } catch (NoSuchAlgorithmException e) {
00475
00476 e.printStackTrace();
00477 } catch (CertificateException e) {
00478
00479 e.printStackTrace();
00480 }
00481 }
00482
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524 public static void loadProvider() {
00525 CertTools.installBCProvider();
00526
00527
00528 }
00529
00530 public static X509Certificate getMyCertificate() {
00531 try {
00532 return ((AbstractBody) ProActive.getBodyOnThis()).getProActiveSecurityManager()
00533 .getCertificate();
00534 } catch (SecurityNotAvailableException e) {
00535 return null;
00536 } catch (IOException e) {
00537 return null;
00538 }
00539 }
00540
00541 public static X509Certificate[] getMyCertificateChain() {
00542
00543
00544 return null;
00545 }
00546 }