Following the advice of Wei-Jun Wang, I share/forward to this mailing-list, 
details of a problem that I encounter on MacOS.

At the moment, I don't know how to modify the existing code so that the Apple 
Provider can behave like SunMSCAPI


> Début du message réexpédié :
> 
> De: Wei-Jun Wang <weijun.w...@oracle.com>
> Objet: Rép. : Java Bug : Mutual HTTPS authentication not possible with a 
> non-extractable private key with Apple/KeychainStore
> Date: 3 mai 2021 à 18:11:12 UTC+2
> À: Jean-Yves Cronier <cronier...@gmail.com>
> 
> And BTW, it’s better to write to an area-specific mail list next time when 
> you find an issue in OpenJDK. The jdk-dev@ mail list is probably too big and 
> people discuss more grand things there. :-)
> 
> For security, it’s security-dev@openjdk.java.net.
> 
> Thanks,
> Weijun
> 
>>>> Le 3 mai 2021 à 16:03, Wei-Jun Wang <weijun.w...@oracle.com> a écrit :
>>>> 
>>>> Hi Jean-Yves,
>>>> 
>>>> On macOS there’s only native key/certificate management but no signature 
>>>> signing/verification. If you look at 
>>>> https://docs.oracle.com/javase/9/security/oracleproviders.htm, the Apple 
>>>> provider only implements KeyStore. If you need to use a key in client 
>>>> auth, it needs to extract that key and use another provider (SunRsaSign or 
>>>> SunEC) to use it.
>>>> 
>>>> On the other hand, SunMSCAPI has implemented both KeyStore and Signature, 
>>>> therefore it can do both things inside the provider and the key does not 
>>>> need to be extracted.
>>>> 
>>>> I’ve filed https://bugs.openjdk.java.net/browse/JDK-8266439.
>>>> 
>>>> Thanks,
>>>> Weijun
>>>> 
>>>>> On May 1, 2021, at 8:19 AM, Jean-Yves Cronier <cronier...@gmail.com> 
>>>>> wrote:
>>>>> 
>>>>> Description
>>>>> 
>>>>> I have imported my personal certificate in macOS keychain with 
>>>>> "non-extractable" option (cf. 
>>>>> https://ss64.com/osx/security-export.html<https://ss64.com/osx/security-export.html>).
>>>>> Private key is now protected, and we can't export private key from macOS 
>>>>> KeyChain
>>>>> But I am unable to establish connexion with a web-API which require 
>>>>> client certificate for mutual authentication with Java
>>>>> It work perfectly well with curl/git, and browsers (safari/chrome)
>>>>> 
>>>>> 
>>>>> <>System / OS / Java Runtime Information
>>>>> 
>>>>> openjdk 11.0.11
>>>>> macOS 11.3
>>>>> 
>>>>> 
>>>>> <>Steps to Reproduce
>>>>> 
>>>>> 1. Add personal certificate with "non-extractable" option. Example with a 
>>>>> personal certificate sent to me in a P12 file named "my-certificate.p12", 
>>>>> with following command-line:
>>>>> security import my-certificate.p12 -x -P « my-strong-password"
>>>>> 2. Connect a site require mutual authentication (for example : 
>>>>> https://server.cryptomix.com/secure/ 
>>>>> <https://server.cryptomix.com/secure/> )
>>>>> 
>>>>> 
>>>>> <>Expected Result
>>>>> 
>>>>> Display content detail of selected client certificate
>>>>> 
>>>>> 
>>>>> <>Actual Result
>>>>> 
>>>>> Error: No TLS client certificate presented 
>>>>> 
>>>>> 
>>>>> <>Source code for an executable test case
>>>>> 
>>>>> import javax.net.ssl.HttpsURLConnection;
>>>>> import java.io.IOException;
>>>>> import java.net.URL;
>>>>> import java.security.cert.X509Certificate;
>>>>> 
>>>>> public class MutualAuthenticationTest {
>>>>>   public static void main(String[] args) throws IOException {
>>>>>           System.setProperty("javax.net.ssl.keyStoreType", 
>>>>> "KeychainStore");
>>>>>           System.setProperty("javax.net.ssl.keyStore", "NONE");
>>>>>           System.setProperty("javax.net.ssl.keyStorePassword", "-");
>>>>>           testUrl(new URL("https://server.cryptomix.com/secure/";));
>>>>>   }
>>>>> 
>>>>>   public static void testUrl(URL targetUrl) throws IOException {
>>>>>           HttpsURLConnection con = (HttpsURLConnection) 
>>>>> targetUrl.openConnection();
>>>>>           // Open the connection
>>>>>           con.getResponseCode();
>>>>> 
>>>>>           assert con.getLocalCertificates() != null && 
>>>>> con.getLocalCertificates().length > 0 : "Must use a personnel certificate 
>>>>> for mutual authentication";
>>>>>           X509Certificate personalCertificate = (X509Certificate) 
>>>>> con.getLocalCertificates()[0];
>>>>>           assert personalCertificate.getSubjectDN() != null;
>>>>>   }
>>>>> }
>>>>> 
>>>>> 
>>>>> <>Workaround
>>>>> 
>>>>> No possible workaround on MacOS which Apple/KeychainStore
>>>>> NB : Perfectly work on Windows/MSCAPI with personnel certificate (with 
>>>>> non-exportable private key option)
>>> 
>> 
> 

Reply via email to