Ho girato Internet per un po ', ma non ho trovato nulla che risponda al mio problema. Quindi, se il problema simile è stato risposto in precedenza, si prega di condividere il link.
Problema:
Ho una configurazione intranet in cui ho bisogno di avere l'autenticazione del client usando SSL.
Ho seguito la guida per creare CA e certificati
Si supponga che la macchina A stia cercando di connettersi alla macchina B (è richiesto anche il retro). La macchina A ha una CA intermedia (I-CA-a) emessa dalla CA principale. La macchina B ha un'altra CA intermedia (I-CA-b) emessa dalla stessa CA radice. Sia A che B hanno il certificato pubblico di CA principale. La macchina A non sa di I-CA-b e la macchina B non sa di I-CA-a.
La macchina B sta eseguendo il server con un certificato del server firmato da I-CA-b e la macchina A sta tentando di connettersi al server B utilizzando un certificato client firmato da I-CA-a.
È possibile che la macchina B accetti la connessione dalla macchina A poiché
- la macchina B non ha informazioni su I-CA-a
- ma I-CA-a è stato rilasciato dalla CA radice su cui si basa la macchina B.
Ho provato a configurare httpd nella macchina B in questo modo.
SSLVerifyClient require
SSLVerifyDepth 10
SSLCACertificateFile "/root/ca/certs/root_ca.cert.pem"
Quando provo a connettermi a B da A usando curl
curl --cacert /root/ca/certs/root_ca.cert.pem --cert /root/ca/intermediate/certs/client-A.cert.pem --key /root/ca/intermediate/certs/client-A.key.pem https://<ip of machine B>/...
Questo fallisce con il seguente output.
curl: (35) Peer does not recognize and trust the CA that issued your certificate.
Ho provato a concatenare il certificato CA emittente del certificato client (certificato di I-CA-a) con client-A.cert.pem
cat /root/ca/intermediate/certs/intermediate.cert.pem /root/ca/intermediate/certs/client-A.cert.pem > /root/ca/intermediate/certs/client-A-chained.cert.pem
e usato questo con curl
curl --cacert /root/ca/certs/root_ca.cert.pem --cert /root/ca/intermediate/certs/client-A-chained.cert.pem --key /root/ca/intermediate/certs/client-A.key.pem https://<ip of machine B>/...
Anche questo non funziona con il seguente output.
curl: (35) Peer reports failure of signature verification or key exchange.
Se faccio il concatenamento in un altro modo, cioè,
cat /root/ca/intermediate/certs/client-A.cert.pem /root/ca/intermediate/certs/intermediate.cert.pem > /root/ca/intermediate/certs/client-A-chained.cert.pem
allora lo stesso comando di arricciatura fallisce con questo output.
curl: (35) Peer does not recognize and trust the CA that issued your certificate.
Che cosa sto sbagliando? È persino possibile autenticare i client in questo modo? In caso contrario, qualcuno può suggerire un modo alternativo per autenticare i client utilizzando SSL?
Il vincolo è che oltre alla CA radice e alla firma delle CA intermedie, il resto del certificato e la generazione della chiave devono essere automatizzati.
Quindi la macchina B potrebbe dover fornire certificati client a più client in fase di esecuzione.
Alternativa a cui riesco a pensare ma con un problema :
La macchina A genera una chiave privata e una CSR e invia quella CSR alla macchina B. La macchina B firma il CSR usando I-CA-b e lo rimanda alla macchina A che può utilizzare la macchina A. Ma il problema è che in che modo la macchina B autentica la macchina A prima di firmare il CSR?
Aggiorna Ho trovato questo dopo che ho postato la domanda. Questo sembra rispondere a parte della mia domanda. Ma ho ancora bisogno di più calrificazione.
Aggiornamento 2 Ho anche trovato questo , anche se non c'è molto da aiutare. Se si tratta di un problema CURL, c'è qualche altra alternativa?