SSL-соединение не установлено из-за сбоя проверки сертификата
У меня есть приложение для Android, которое уже опубликовано в магазине и работает нормально. Внезапно он начал выдавать какие-то исключения, которые я уже объяснял и решал здесь. После решения этой проблемы приложение начало выкидыватьjava.security.cert.CertPathValidatorException: Trust anchor for certification path not found
. После некоторых исследований я обнаружил, что мне нужно создать HttpClientHandler для ссылки на мой сертификат. Итак, вот мой метод входа в систему, который является первым вызовом API, когда-либо сделанным в приложении:
public static async Task<Usuario> Login(UsuarioLogin login)
{
try
{
var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
handler.ClientCertificates.Add(new X509Certificate2(Resources.certificadopem)); // certificadopem is my PEM format certificate file
using (HttpClient client = new HttpClient(handler))
{
var json = JsonConvert.SerializeObject(login);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(ModelUrl, content); // exception is thrown when debugger tries to execute this line
var response2 = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<Usuario>(response2);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
throw new Exception(e.Message);
}
}
Но теперь я получаю это исключение:System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
Внутреннее исключение:{System.Security.Authentication.AuthenticationException}
и в сообщении говорится:Authentication failed, see inner exception.
Второе внутреннее исключение:Mono.Btls.MonoBtlsException
и в сообщении говорится:Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/boringssl/ssl/handshake_client.c:1132
Я запустил эту команду opensslopenssl s_client -connect apigraos.copercana.com.br:443
проверить центры сертификации и вот результат:
C:\WINDOWS\system32>openssl s_client -connect apigraos.copercana.com.br:443
CONNECTED(000001B8)
depth=0 C = BR, ST = S\C3\A3o Paulo, L = Sert\C3\A3ozinho, O = COOPERATIVA DOS PLANTADORES DE CANA DO OESTE DO ESTADO SAO PAULO, CN = *.copercana.com.br
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = BR, ST = S\C3\A3o Paulo, L = Sert\C3\A3ozinho, O = COOPERATIVA DOS PLANTADORES DE CANA DO OESTE DO ESTADO SAO PAULO, CN = *.copercana.com.br
verify error:num=21:unable to verify the first certificate
verify return:1
depth=0 C = BR, ST = S\C3\A3o Paulo, L = Sert\C3\A3ozinho, O = COOPERATIVA DOS PLANTADORES DE CANA DO OESTE DO ESTADO SAO PAULO, CN = *.copercana.com.br
verify return:1
---
Certificate chain
0 s:C = BR, ST = S\C3\A3o Paulo, L = Sert\C3\A3ozinho, O = COOPERATIVA DOS PLANTADORES DE CANA DO OESTE DO ESTADO SAO PAULO, CN = *.copercana.com.br
i:C = US, O = DigiCert Inc, OU = www.digicert.com, CN = Thawte TLS RSA CA G1
a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
v:NotBefore: Apr 3 00:00:00 2023 GMT; NotAfter: Apr 5 23:59:59 2024 GMT
1 s:C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
i:C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA1
v:NotBefore: Nov 10 00:00:00 2006 GMT; NotAfter: Nov 10 00:00:00 2031 GMT
2 s:C = US, O = DigiCert Inc, OU = www.digicert.com, CN = Thawte RSA CA 2018
i:C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
v:NotBefore: Nov 6 12:23:52 2017 GMT; NotAfter: Nov 6 12:23:52 2027 GMT
---
Как я могу решить эту проблему, не игнорируя все вопросы безопасности?