<div dir="ltr">Applications that depend on such APIs are currently jumping through hoops to provide the same functionality on multiple JVMs.<div>We have some nasty reflection based code in order to deal with build-time dependencies.</div><div><br></div><div>It really should be formalized and made part of the SE API.</div><div>It will be great that I can not worry about the new API going away in openJDK and oracle - but I'll need to continue to use the reflection because of IBM.</div><div><br></div><div>Baby steps, maybe?</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Dec 2, 2015 at 8:25 PM, Wang Weijun <span dir="ltr"><<a href="mailto:weijun.wang@oracle.com" target="_blank">weijun.wang@oracle.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
> On Dec 3, 2015, at 2:38 AM, Mandy Chung <<a href="mailto:mandy.chung@oracle.com">mandy.chung@oracle.com</a>> wrote:<br>
><br>
> Hi Max,<br>
><br>
> Is there any reason why this X509CertificateBuilder can’t be Java SE API?<br>
<br>
</span>Well, not much.<br>
<br>
When we first design the new API, it was meant to be a quick alternative to sun.security.tools.keytool.Main since that class will be invisible after jigsaw. So it's just a simple utility class and not fine polished.<br>
<br>
One unpolished is the certificate request. It's now just a byte[]. We might need a base class CertificateRequest and a child X509CertificateRequest and some getters.<br>
<br>
Another is the addExtension() method [1] that takes string values. Although I've tried my best to specify the precise format [1] I still think it's not mature enough as a Java SE API. Maybe I should just keep the addExtension(Extension) one [3] and create static methods in Extension (or shall I create a child named X509Extension) that generates known/unknown extension objects.<br>
<br>
Maybe my understanding is biased, but when I am thinking of a Java SE API, it contains multiple classes and a clean structure. On the other hand, a JDK-specific tool can be a huge single class with every method inside (just like keytool itself).<br>
<span class=""><br>
> Have you considered defining this builder API in java.security.cert.X509Certificate.Builder?<br>
<br>
</span>That sounds like a good place.<br>
<br>
Thanks<br>
Max<br>
<br>
[1] <a href="http://cr.openjdk.java.net/~weijun/8058778/webrev.04/ktspec/jdk/security/cert/X509CertificateBuilder.html#addExtension-java.lang.String-java.lang.String-boolean-" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~weijun/8058778/webrev.04/ktspec/jdk/security/cert/X509CertificateBuilder.html#addExtension-java.lang.String-java.lang.String-boolean-</a><br>
<br>
[2] <a href="http://cr.openjdk.java.net/~weijun/8058778/webrev.04/ktspec/jdk/security/cert/X509CertificateBuilder.html#extensions" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~weijun/8058778/webrev.04/ktspec/jdk/security/cert/X509CertificateBuilder.html#extensions</a><br>
<br>
[3] <a href="http://cr.openjdk.java.net/~weijun/8058778/webrev.04/ktspec/jdk/security/cert/X509CertificateBuilder.html#addExtension-java.security.cert.Extension-" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~weijun/8058778/webrev.04/ktspec/jdk/security/cert/X509CertificateBuilder.html#addExtension-java.security.cert.Extension-</a><br>
<div class="HOEnZb"><div class="h5"><br>
><br>
> Mandy<br>
><br>
>> On Dec 2, 2015, at 6:36 AM, Wang Weijun <<a href="mailto:weijun.wang@oracle.com">weijun.wang@oracle.com</a>> wrote:<br>
>><br>
>> Hi All<br>
>><br>
>> This enhancement creates a new jdk.security.cert.X509CertificateBuilder API that does what keytool -genkeypair/-certreq/-gencert can do.<br>
>><br>
>> code changes:<br>
>><br>
>> <a href="http://cr.openjdk.java.net/~weijun/8058778/webrev.04" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~weijun/8058778/webrev.04</a><br>
>> <a href="http://cr.openjdk.java.net/~weijun/8058778/dev/webrev.01/" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~weijun/8058778/dev/webrev.01/</a><br>
>><br>
>> spec:<br>
>><br>
>> <a href="http://cr.openjdk.java.net/~weijun/8058778/webrev.04/ktspec/jdk/security/cert/X509CertificateBuilder.html" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~weijun/8058778/webrev.04/ktspec/jdk/security/cert/X509CertificateBuilder.html</a><br>
>><br>
>> You will be able to<br>
>><br>
>> KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");<br>
>> kpg.initialize(2048);<br>
>> KeyPair ca = kpg.generateKeyPair();<br>
>> KeyPair user = kpg.generateKeyPair();<br>
>><br>
>> X509Certificate caCert = X509CertificateBuilder.fromKeyPair(ca)<br>
>>     .subject(new X500Principal("CN=ca"))<br>
>>     .validity(Instant.now(), Instant.now().plus(Period.ofDays(3650)))<br>
>>     .addExtension("BasicConstraints", "", true)<br>
>>     .signatureAlgorithm("SHA256withRSA")<br>
>>     .selfSign();<br>
>><br>
>> byte[] request = X509CertificateBuilder.fromKeyPair(user)<br>
>>     .subject(new X500Principal("CN=user"))<br>
>>     .addExtension("KeyUsage", "digitalSignature,keyEncipherment", true)<br>
>>     .request();<br>
>><br>
>> X509Certificate userCert = X509CertificateBuilder.asCA(<br>
>>         ca.getPrivate(), caCert)<br>
>>     .signatureAlgorithm("SHA256withRSA")<br>
>>     .honorExtensions("all")<br>
>>     .sign(request);<br>
>><br>
>> Thanks<br>
>> Max<br>
>><br>
><br>
<br>
</div></div></blockquote></div><br></div>