2017-11-22 148 views
7

Uwaga: to nie jest pytanie o to, czy apache akceptuje przychodzące połączenia SSL.W jaki sposób mam serwer httpd Apache2 używać certyfikatu CA ubuntu do wychodzących połączeń SSL z Apache?

Mam moduł apache, który musi wykonywać wychodzące połączenia SSL. Kiedy stara się, robi ten błąd:

Failed to send events: The OpenSSL library reported an error: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed:s3_clnt.c:1269:

ten wskazujący bibliotekę SSL, który używa apache nie wie o (ważnego) certyfikatu serwera, że ​​mój moduł próbuje się połączyć .

Certyfikat CA na moim systemie ubuntu, w którym to działa, jest w porządku, wie o tym certyfikacie, openssl s_client mówi mi, że wszystko jest w porządku.

W jaki sposób mogę nakazać serwerowi Apache2 korzystanie z certyfikatu CA systemu Ubuntu do wykonywania połączeń wychodzących?

aktualizacja - Zrobiłem strace -e open httpd -X, aby zobaczyć, gdzie próbował załadować certyfikaty. Widzę apache otwierający libssl.so, ale nie widzę nawet próby otwarcia zwykłego pliku ssl.cnf lub jakiegokolwiek pliku certyfikatu.

snipped useless strace output

Update2: w jaki sposób tworzę żądanie https - Robię żądania od wewnątrz mojego modułu zwyczaj apache. Mój moduł .so jest napisane w Rust, więc kod gra wygląda w zasadzie jak:

w mod_mine.so:

use hyper::Client; 
use hyper_tls::HttpsConnector; 
use tokio_core::reactor::Core; 

let mut core = Core::new()?; 
let handle = core.handle(); 
let client = Client::configure() 
    .connector(HttpsConnector::new(4, &handle)?) 
    .build(&handle); 

//actually a POST, but this gets the same error 
let request = client.get("https://saas.mycompany.io".parse()?); 
let result = core.run(request)?; 
... //process result 
+0

Budujesz moduł niestandardowy lub używasz istniejącego modułu? Czy potrafisz nazwać ten moduł? –

+0

@ TarunLalwani - jest to moduł niestandardowy. Po prostu wywołuje wywołania https. Po uruchomieniu samodzielnym działa dobrze, używając libssl z Ubuntu. Z jakiegoś powodu nie działa wewnątrz apache. – marathon

+0

Możliwe, że próbne repozytorium git z minimalnym odtwarzalnym przykładem? –

Odpowiedz

1

znalazłem rozwiązanie, które działa, choć nie jestem pewien, że to jest optymalna.

openSSL pobiera zmienną środowiskową SSL_CERT_FILE. Mogę ustawić to w moim kodzie źródłowym modułu apache.

use std::env; 
let cert_file = figure_out_cert_path(); //on ubuntu: /etc/ssl/certs/ca-certificates.crt 
env::set_var("SSL_CERT_FILE", cert_file);