32
32
import java .security .KeyStore .PasswordProtection ;
33
33
import java .security .KeyStoreException ;
34
34
import java .security .SecureRandom ;
35
+ import java .security .Security ;
35
36
import java .security .cert .Certificate ;
36
37
import java .security .cert .X509Certificate ;
37
38
import java .time .Instant ;
38
39
import java .time .temporal .ChronoUnit ;
39
40
import java .util .Date ;
40
41
import javax .crypto .spec .SecretKeySpec ;
42
+ import javax .security .auth .x500 .X500Principal ;
43
+ import org .bouncycastle .jce .provider .BouncyCastleProvider ;
44
+ import org .bouncycastle .x509 .X509V3CertificateGenerator ;
41
45
import org .junit .Before ;
42
46
import org .junit .Test ;
43
- import sun .security .x509 .AlgorithmId ;
44
- import sun .security .x509 .CertificateAlgorithmId ;
45
- import sun .security .x509 .CertificateSerialNumber ;
46
- import sun .security .x509 .CertificateValidity ;
47
- import sun .security .x509 .CertificateX509Key ;
48
- import sun .security .x509 .X500Name ;
49
- import sun .security .x509 .X509CertImpl ;
50
- import sun .security .x509 .X509CertInfo ;
51
-
52
- /* These internal sun classes are included solely for test purposes as
53
- this test cannot use BouncyCastle cert generation, as there are incompatibilities
54
- between how standard BC and FIPS BC perform cert generation. */
55
47
56
48
public class KeyStoreProviderTest {
57
49
private static final SecureRandom RND = new SecureRandom ();
@@ -72,6 +64,7 @@ public class KeyStoreProviderTest {
72
64
73
65
@ Before
74
66
public void setup () throws Exception {
67
+ Security .addProvider (new BouncyCastleProvider ());
75
68
ks = KeyStore .getInstance (KeyStore .getDefaultType ());
76
69
ks .load (null , PASSWORD );
77
70
}
@@ -286,26 +279,24 @@ private void addPublicEntry(final String alias) throws GeneralSecurityException,
286
279
}
287
280
288
281
private X509Certificate generateCertificate (final KeyPair pair , final String alias )
289
- throws GeneralSecurityException , IOException {
290
- final X509CertInfo info = new X509CertInfo ();
291
- final X500Name name = new X500Name ("dc=" + alias );
292
- info .set (X509CertInfo .SERIAL_NUMBER , new CertificateSerialNumber (new BigInteger (256 , RND )));
293
- info .set (X509CertInfo .SUBJECT , name );
294
- info .set (X509CertInfo .ISSUER , name );
295
- info .set (
296
- X509CertInfo .VALIDITY ,
297
- new CertificateValidity (
298
- Date .from (Instant .now ().minus (1 , ChronoUnit .DAYS )),
299
- Date .from (Instant .now ().plus (730 , ChronoUnit .DAYS ))));
300
- info .set (X509CertInfo .KEY , new CertificateX509Key (pair .getPublic ()));
301
- info .set (
302
- X509CertInfo .ALGORITHM_ID ,
303
- new CertificateAlgorithmId (new AlgorithmId (AlgorithmId .sha256WithRSAEncryption_oid )));
304
-
305
- final X509CertImpl cert = new X509CertImpl (info );
306
- cert .sign (pair .getPrivate (), AlgorithmId .sha256WithRSAEncryption_oid .toString ());
307
-
308
- return cert ;
282
+ throws GeneralSecurityException {
283
+ final X509Certificate certificate ;
284
+
285
+ // Generate self-signed certificate
286
+ final X509V3CertificateGenerator certGen = new X509V3CertificateGenerator ();
287
+ final X500Principal dnName = new X500Principal ("dc=" + alias );
288
+
289
+ certGen .setSerialNumber (new BigInteger (256 , new SecureRandom ()));
290
+ certGen .setIssuerDN (dnName );
291
+ certGen .setNotBefore (Date .from (Instant .now ().minus (1 , ChronoUnit .DAYS )));
292
+ certGen .setNotAfter (Date .from (Instant .now ().plus (730 , ChronoUnit .DAYS )));
293
+ certGen .setSubjectDN (dnName );
294
+ certGen .setPublicKey (pair .getPublic ());
295
+ certGen .setSignatureAlgorithm ("SHA256WithRSA" );
296
+
297
+ certificate = certGen .generate (pair .getPrivate ());
298
+
299
+ return certificate ;
309
300
}
310
301
311
302
private void copyPublicPart (final KeyStore src , final KeyStore dst , final String alias )
0 commit comments