> On May 3, 2021, at 1:16 PM, Jean-Yves Cronier <cronier...@gmail.com> wrote:
> 
> 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

You won’t be able to do this in an application. This is only possible if the 
Apple provider also implements Signature.

Note: the Apple provider is also maintained by Oracle now.

—Weijun

> 
> 
>> 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