I re-read the CSR. The precise meaning of the 2 options for -printcert is: "If the cert is a trusted certificate in either keystore or cacerts, we will not warn if it uses a weak signature algorithm". This is so subtle and I wonder it's worth describing it. Or we just say "This command does not check for the weakness of a certificate's signature algorithm if it's a trusted certificate in the user keystore (specified by -keystore) or the `cacerts` keystore (if -trustcacerts is specified)".
For -printcrl, the "issuer CA" is a little confusing. I would say "This commands attempts to verify the CRL using a certificate from the user keystore (specified by -keystore) or the `cacerts` keystore (if -trustcacerts is specified), and print out a warning if it cannot be verified". Thanks, Max p.s. A new kind of check comes to my mind. Suppose you are printing a certificate whose own key is 2048-bit RSA, signature is using SHA256withRSA, but the signer key is only 512 bits (we can notice this from the size of the signature). Shall we print out a warning? > On Jun 11, 2020, at 11:21 AM, Weijun Wang <weijun.w...@oracle.com> wrote: > > "to a self-signed certificate in the keystore". This is not correct. What we > look for is a TrustedCertificateEntry. > > "It emits warning when a certificate is not trusted and uses weak > algorithms". Precisely, it's "uses a weak signature algorithm". > > --Max > > >> On Jun 10, 2020, at 5:31 PM, Hai-May Chao <hai-may.c...@oracle.com> wrote: >> >> >> >>> On Jun 9, 2020, at 5:58 PM, Weijun Wang <weijun.w...@oracle.com> wrote: >>> >>> Good to see both -keystore and -trustcacerts mentioned. Some comments: >>> >>> 1. I think there is no need to say "from -file cert_file". Or, do you mean >>> the new function does not apply to those from -sslserver and -jarfile? If >>> so, that might be a problem. >> >> You’re right. Removed it. >> >>> >>> 2. While you said "attempts to construct a chain of trust", do you also >>> want to describe what happens if it succeeds or fails? >> >> Updated manpage. >> >>> >>> 3. It will be nice if you can include the exact diff of the man page files >>> either inside the CSR itself or as a comment. >>> >> >> Included the diff of the manpage in the CSR. >> >> Thanks, >> Hai-May >> >> >>> Thanks, >>> Max >>> >>>> On Jun 9, 2020, at 10:51 PM, Hai-May Chao <hai-may.c...@oracle.com> wrote: >>>> >>>> >>>> >>>>> On Jun 7, 2020, at 6:08 PM, Weijun Wang <weijun.w...@oracle.com> wrote: >>>>> >>>>> Looks fine to me. >>>>> >>>>> For CSR, since there is already a "Note" there for these 2 options, you >>>>> can add a few words about what -keystore and -trustcacerts can do. >>>> >>>> Updated CSR as suggested. >>>> >>>> Thanks, >>>> Hai-May >>>> >>>> >>>>> >>>>> Thanks, >>>>> Max >>>>> >>>>>> On Jun 8, 2020, at 4:01 AM, Hai-May Chao <hai-may.c...@oracle.com> wrote: >>>>>> >>>>>> Updated webrev - >>>>>> >>>>>> https://cr.openjdk.java.net/~hchao/8244148/webrev.02/ >>>>>> >>>>>> Thanks, >>>>>> Hai-May >>>>>> >>>>>> >>>>>>> On Jun 5, 2020, at 11:04 PM, Weijun Wang <weijun.w...@oracle.com> wrote: >>>>>>> >>>>>>> I still think duplicated commands in TrustedCert.java are useless. Line >>>>>>> 104 and line 133 are exactly the same, line 109 and line 138 are >>>>>>> exactly the same, and you haven't made any change to these 2 files in >>>>>>> between. >>>>>>> >>>>>>> Same for line 80 and line 96 of TrustedCRL.java. >>>>>>> >>>>>>> Everything else is fine. >>>>>>> >>>>>>> Thanks, >>>>>>> Max >>>>>>> >>>>>>> >>>>>>>> On Jun 6, 2020, at 2:25 AM, Hai-May Chao <hai-may.c...@oracle.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Updated webrev - >>>>>>>> >>>>>>>> https://cr.openjdk.java.net/~hchao/8244148/webrev.01/ >>>>>>>> >>>>>>>> Added one command line -importcert in TrustCert.java. >>>>>>>> Added createCacerts() in test/lib SecurityTools.java. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Hai-May >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> On Jun 4, 2020, at 5:57 AM, Weijun Wang <weijun.w...@oracle.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>>> On Jun 4, 2020, at 7:29 PM, Hai-May Chao <hai-may.c...@oracle.com> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> Hi Max, >>>>>>>>>> >>>>>>>>>>> On Jun 3, 2020, at 12:59 AM, Weijun Wang <weijun.w...@oracle.com> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> The source change looks fine to me. >>>>>>>>>>> >>>>>>>>>>> In TrustedCert.java: >>>>>>>>>>> >>>>>>>>>>> - You can use FileOutputStream and Files.copy(Path,OutputStream) in >>>>>>>>>>> cat(). >>>>>>>>>> >>>>>>>>>> This cat() is taken from WealAlg.java. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> - There is no need to recreate root.jks and root.pem. >>>>>>>>>> >>>>>>>>>> The sequences of the commands used in this test scenario allows me >>>>>>>>>> to test -printcert for the -trustcacerts and -keytsore options. We >>>>>>>>>> had discussion offline about it. The test uses trusted certificates >>>>>>>>>> and checks no warnings on the weak algorithms to address the >>>>>>>>>> requirement described in the bug. I believe it does serve that >>>>>>>>>> purpose, and looks legitimate to me. There could be different ways >>>>>>>>>> of testing a functionality, and please let me know if there is a >>>>>>>>>> problem with the current approach. >>>>>>>>> >>>>>>>>> I just meant that the keytool commands generating root.jks and >>>>>>>>> root.pem are exactly the same and there is no need to recreate it. >>>>>>>>> >>>>>>>>>> >>>>>>>>>> Please also elaborate your comment about no need to recreate >>>>>>>>>> root.jks and root.pem. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> - Why not use -trustcacerts below? >>>>>>>>>>> >>>>>>>>>>> 160 kt("-importcert -file server.pem -noprompt", >>>>>>>>>>> "server.jks”); >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Because here is to import the server (end-entity) cert, and it will >>>>>>>>>> not make a difference for the test result whether to use the >>>>>>>>>> -trustcacerts or not. It’s the ca (intermediate) cert needs to have >>>>>>>>>> it in this test scenario. I intended to leave it out in #160 to >>>>>>>>>> distinguish between server and ca certs. >>>>>>>>> >>>>>>>>> OK. >>>>>>>>> >>>>>>>>> Then how about we add a new command before line 155? >>>>>>>>> >>>>>>>>> kt("-importcert -file ca.pem", "ca.jks").shouldNotHaveExitValue(0); >>>>>>>>> >>>>>>>>> This would prove the "-trustcacerts" on line 155 is really useful. >>>>>>>>> >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> - It's probably better to add a " " between cmd and options in >>>>>>>>>>> patchcmd(). Same in TrustedCRL.java. >>>>>>>>>> >>>>>>>>>> Ok, will change it. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> In TrustedCRL.java: >>>>>>>>>>> >>>>>>>>>>> - No need to recreate ks and ca.crl. Just call "-printcrl" with >>>>>>>>>>> different options. >>>>>>>>>> >>>>>>>>>> Same reply as above. >>>>>>>>> >>>>>>>>> Same question as above. >>>>>>>>> >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> - Why create using MD5withRSA? Do you meant to warn about the weak >>>>>>>>>>> algorithm? >>>>>>>>>> >>>>>>>>>> Yes, exactly, and it differentiates from the weak algorithm >>>>>>>>>> SHA1withRSA used in root CA where no warning will be emitted. There >>>>>>>>>> is another -gencrl in #119 without using MD5withRSA so I’d have two >>>>>>>>>> test cases. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Also I would suggest you create a dedicate method (maybe in >>>>>>>>>>> SecurityTools.java) to create your own cacerts. There is no need to >>>>>>>>>>> copy over the system cacerts, just make sure the file is created >>>>>>>>>>> with the JKS storetype. We are thinking of upgrading the storetype >>>>>>>>>>> of cacerts and it's nice to do this at a single place so we can >>>>>>>>>>> modify it easily later. >>>>>>>>>> >>>>>>>>>> I created a method in SecurityTools.java to create the own cacerts. >>>>>>>>>> With this keystore, the subsequent importing a certificate reply >>>>>>>>>> would not work. It turns out that its caks.size() is zero detected >>>>>>>>>> at establishCertChain() in keytool/Main.java after root cert has >>>>>>>>>> been imported to that cacerts. At this point I’d like to suggest a >>>>>>>>>> separate bug be filed to cover the cacerts enhancement that you >>>>>>>>>> suggested. >>>>>>>>> >>>>>>>>> I meant creating the cacerts in one method, something like >>>>>>>>> >>>>>>>>> void createCacerts(String ks, String... crt); >>>>>>>>> >>>>>>>>> and you can call createCacerts("mycacerts", "root.crt") to create it. >>>>>>>>> The method can call KeyStore APIs and not keytool commands. >>>>>>>>> >>>>>>>>> BTW, what does caks.size() == 0 matter here? >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Max >>>>>>>>> >>>>>>>>> >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Hai-May >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> Thanks, >>>>>>>>>>> Max >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> On Jun 2, 2020, at 2:37 AM, Hai-May Chao <hai-may.c...@oracle.com> >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>> Hi, >>>>>>>>>>>> >>>>>>>>>>>> I’d like to request a review for: >>>>>>>>>>>> >>>>>>>>>>>> JBS: https://bugs.openjdk.java.net/browse/JDK-8244148 >>>>>>>>>>>> CSR: https://bugs.openjdk.java.net/browse/JDK-8246269 >>>>>>>>>>>> Webrev: http://cr.openjdk.java.net/~hchao/8244148/webrev.00/ >>>>>>>>>>>> >>>>>>>>>>>> The change is to add the support of -trustcacerts and -keystore >>>>>>>>>>>> options to -printcert and -princrl command for keytool. This >>>>>>>>>>>> enables keytool to use the trusted certificates when verifying >>>>>>>>>>>> untrusted artifacts that are signed by CAs. It also incorporates >>>>>>>>>>>> Max’s change that consolidates the code to get the default >>>>>>>>>>>> location of cacerts keystore. >>>>>>>>>>>> >>>>>>>>>>>> Thanks, >>>>>>>>>>>> Hai-May >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >