> On Dec 17, 2015, at 3:26 PM, Mandy Chung <mandy.ch...@oracle.com> wrote:
> 
> Hi Max,
> 
> Very high level comments:
> - Builder::selfSign and Builder::sign are the two methods building the 
> X509Certificate.
> 
> Both @throws java.lang.IllegalStateException - if the builder is initialized 
> with one of the asCA methods 
> 
> It reads to me that there is no other method to generate a certificate from a 
> builder created from Builder::fromKeyPair factory method.

Not sure what you are asking about.

selfSign() returns a self-signed certificate. If you want to get a CA-signed 
one, you run certificateRequest() and send the output byte[] to an asCA Builder 
and that builder can sign() it.

> 
> - is clearExtensions needed only for reusing the Builder?  

Yes.

> Would it be reasonable to require it to create a Builder that I suppose it’s 
> not too expensive?  In that case, the clearExtensions is not needed.

Sounds correct.

> 
> Extension::newSubjectAlternativeNameExtension(boolean isCritical, List<?>... 
> names)
> Extension::newIssuerAlternativeNameExtension(boolean isCritical, List<?>... 
> names)
> Extension::newSubjectInformationAccessExtension(List<?>... accessDescriptions)
> Extension::newAuthorityInformationAccessExtension(List<?>... 
> accessDescriptions)
> - this takes List<?> with 3 entries, each of which is of a specified type.
> 
> There may be other better alternatives to define this API.  A builder may fit 
> well that can take 3 parameters for each name/accessDescription such that it 
> can be statically checked.  Have you considered other options?

I designed the methods to be consistent with X509Certificate methods, like

   Collection<List<?>> getSubjectAlternativeNames()

and secretly hoped that if people can live with these methods they can also 
live with my new ones.

I know it's ugly but if enhanced I am not sure how far I should go. Should it 
be these?

   interface GeneralName {}
   static GeneralName newURIName(URI);
   static GeneralName newDnsName(String host);
   ...
   static newSubjectAlternativeNameExtension(boolean isCritical, GenralName... 
names);
   class AccessDescription { String oidMethods, GeneralName location);
   static newAuthorityInformationAccessExtension(AccessDescription... 
accessDescriptions);

I tried it but I don't like inventing too many new classes.

Thanks
Max

> 
> Mandy
> 
> 
>> On Dec 15, 2015, at 6:26 PM, Wang Weijun <weijun.w...@oracle.com> wrote:
>> 
>> Hi All
>> 
>> Here is an updated webrev
>> 
>> http://cr.openjdk.java.net/~weijun/8058778/webrev.05/
>> 
>> Spec change is at
>> 
>> http://cr.openjdk.java.net/~weijun/8058778/webrev.05/specdiff/java/security/cert/package-summary.html
>> 
>> These changes are made:
>> 
>> 1. The Builder is moved into java.security.cert.X509Certificate as an inner 
>> class
>> 
>> 2. There is no more addExtension(String,String,boolean) that tries to parse 
>> input value strings (leave them to keytool). Each supported extension has 
>> its own addXXXExtension() method in java.security.cert.X509Extension. The 
>> input format is the same as the output format of X509Certificate.getXXX() 
>> for each extension type. This relieves the requirement to define interfaces 
>> for GeneralNames etc at the moment.
>> 
>> 3. keytool directly calls X509Certificate.Builder now.
>> 
>> No CertificateRequest at the moment. Builder still using byte[] which is 
>> PKCS #10 encoded.
>> 
>> Many thanks to Mandy, Larry, and Sean for your comments. Mike, we will add 
>> more methods later when they are needed.
>> 
>> --Max
>> 
> 

Reply via email to