On Tue, 3 Jun 2025 17:29:13 GMT, Sean Mullan <[email protected]> wrote:
>> As a constructor, the code would look like this
>>
>>
>> public CertificateBuilder(String subjectName,
>> PublicKey publicKey, PublicKey caKey,
>> KeyUsage... keyUsages)
>> throws CertificateException, IOException {
>> factory = CertificateFactory.getInstance("X.509");
>> SecureRandom random = new SecureRandom();
>>
>> boolean [] keyUsage = new boolean[KeyUsage.values().length];
>> for (KeyUsage ku : keyUsages) {
>> keyUsage[ku.ordinal()] = true;
>> }
>>
>> this.subjectName = new X500Principal(subjectName);
>> this.publicKey = Objects.requireNonNull(publicKey, "Caught null
>> public key");
>> notBefore = (Date)Date.from(Instant.now().minus(1,
>> ChronoUnit.HOURS));
>> notAfter = Date.from(Instant.now().plus(1, ChronoUnit.HOURS));
>> serialNumber = BigInteger.valueOf(random.nextLong(1000000)+1);
>> byte[] keyIdBytes = new KeyIdentifier(publicKey).getIdentifier();
>> Extension e = new SubjectKeyIdentifierExtension(keyIdBytes);
>> extensions.put(e.getId(), e);
>>
>> KeyIdentifier kid = new KeyIdentifier(caKey);
>> e = new AuthorityKeyIdentifierExtension(kid, null, null);
>> extensions.put(e.getId(), e);
>>
>> if (keyUsages.length != 0) {
>> e = new KeyUsageExtension(keyUsage);
>> extensions.put(e.getId(), e);
>> }
>> }
>>
>>
>>
>>> it also means I can't use this method to to create a certificate with a
>>> longer, or shorter validity period
>>
>> There are methods to set the not-before and not-after fields. Any field set
>> in this static method can be changed:
>>
>> `
>> newCertificateBuilder(...).notAfter(Date.from(Instant.now().plus(10,
>> TimeUnit.YEARS)));
>> `
>>
>> I don't like using `Date` here and would be happy to overload it to take
>> `Instant` as well.
>
>> As a constructor, the code would look like this
>
> <snip>
>
> Ah, I see. Well technically you could call the set methods from the ctor but
> you would get `this-escape` compiler warnings, which you probably want to
> avoid.
>
>> > it also means I can't use this method to to create a certificate with a
>> > longer, or shorter validity period
>>
>> There are methods to set the not-before and not-after fields. Any field set
>> in this static method can be changed:
>>
>> `newCertificateBuilder(...).notAfter(Date.from(Instant.now().plus(10,
>> TimeUnit.YEARS)));`
>>
>> I don't like using `Date` here and would be happy to overload it to take
>> `Instant` as well.
>
> Yes, but I don't think the static method which is generically named
> `newCertificateBuilder` should be hard-coding a one hour validity period,
> that detail should be either in a different method (my preference) or this
> method should be named more clearly like `oneHourCertificateBuilder`. I
> realize this is just a test method, but this is a nicely designed API that
> has been very useful so I would prefer if we keep the flexibility.
I removed the default one-hour validity from the builder method and created a
`setOneHourValidity()` method.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/23700#discussion_r2303642791