Estoy tratando de entender SSL y leyendo diferentes artículos. Todos los artículos tienen imágenes como esta ( fuente de la imagen ):
Hay muchos ejemplos, pero quiero entender el paso 3 Si uso un navegador, es comprensible. El navegador tiene su propio mecanismo de validación. Pero, ¿y si uso mi cliente Java? Por ejemplo, tengo una aplicación que realiza solicitudes a: https://www.google.com/search?q=weather
. ¿Cómo puedo validar el Certificado de Google? ¿Debería hacer eso? ¿Debo obtener este certificado y agregarlo al almacén de confianza? ¿Tal vez debería agregar solo certificados no públicos al almacén de confianza?
¿Alguien puede explicar una cadena de pasos que el cliente Java HTTP realiza para la validación? (Puede usar cualquier cliente Java HTTP para la explicación)
En el paso 2, el servidor proporciona su certificado de servidor. Este es emitido y firmado por una Autoridad de Certificación oficial (CA, CA Raíz) como Baltimore Cypertrust, Entrust, DigiCert, Verisign, etc. o una Autoridad de Certificación Intermedia (ICA) mediante la cual el certificado de una ICA es emitido y firmado por una CA raíz.
Antes de que un CA/ICS emita un certificado, verifica que el solicitante (también conocido como sujeto) de un certificado es esa persona o empresa que pretende ser y es propietaria del nombre de dominio para el que se debe emitir el certificado.
Esto crea una cadena de confianza, desde el certificado del servidor hacia atrás hasta una autoridad de confianza.
En el paso 3 se verifica que el certificado del paso 2 conduzca a una CA/ICA conocida. Si es así, el certificado se acepta como de confianza. Para ello, Java proporciona un almacén con todos los certificados raíz e intermedios válidos de las autoridades de certificación.
Para enumerar su contenido, abra un shell de comandos, cambie a la carpeta .../jre1.x.y_zzz/lib/security/
y escriba ../../bin/keytool.exe -keystore cacerts -list
. La pregunta de una contraseña se puede omitir presionando la tecla enter. Ahora obtiene una lista de todos los certificados que están almacenados en el almacén predeterminado.
dude@cs04n4 /cygdrive/c/Program Files/Java/jre1.8.0_301/lib/security $ ../../bin/keytool.exe -keystore cacerts -list Keystore-Kennwort eingeben: ***************** WARNING WARNING WARNING ***************** * Die Integrität der Informationen, die in Ihrem Keystore gespeichert sind, * * wurde NICHT geprüft. Um die Integrität zu prüfen, * * müssen Sie Ihr Keystore-Kennwort angeben. * ***************** WARNING WARNING WARNING ***************** Keystore-Typ: JKS Keystore-Provider: SUN Keystore enth▒lt 92 Eintr▒ge sslrooteccca [jdk], 31.07.2020, trustedCertEntry, Zertifikat-Fingerprint (SHA-256): 34:17:BB:06:CC:60:07:DA:1B:96:1C:92:0B:8A:B4:CE:3F:AD:82:0E:4A:A3:0B:9A:CB:C4:A7:4E:BD:CE:BC:65 digicertassuredidg3 [jdk], 25.08.2016, trustedCertEntry, Zertifikat-Fingerprint (SHA-256): 7E:37:CB:8B:4C:47:09:0C:AB:36:55:1B:A6:F4:5D:B8:40:68:0F:BA:16:6A:95:2D:B1:00:71:7F:43:05:3F:C2 verisignuniversalrootca [jdk], 25.08.2016, trustedCertEntry, Zertifikat-Fingerprint (SHA-256): 23:99:56:11:27:A5:71:25:DE:8C:EF:EA:61:0D:DF:2F:A0:78:B5:C8:06:7F:4E:82:82:90:BF:B8:60:E8:4B:3C digicerttrustedrootg4 [jdk], 25.08.2016, trustedCertEntry, Zertifikat-Fingerprint (SHA-256): 55:2F:7B:DC:F1:A7:AF:9E:6C:E6:72:01:7F:4F:12:AB:F7:72:40:C7:8E:76:1A:C2:03:D1:D9:D2:0A:C8:99:88 ... ttelesecglobalrootclass2ca [jdk], 25.08.2016, trustedCertEntry, Zertifikat-Fingerprint (SHA-256): 91:E2:F5:78:8D:58:10:EB:A7:BA:58:73:7D:E1:54:8A:8E:CA:CD:01:45:98:BC:0B:14:3E:04:1B:17:05:25:52 addtrustqualifiedca [jdk], 25.08.2016, trustedCertEntry, Zertifikat-Fingerprint (SHA-256): 80:95:21:08:05:DB:4B:BC:35:5E:44:28:D8:FD:6E:C2:CD:E3:AB:5F:B9:7A:99:42:98:8E:B8:F4:DC:D0:60:16 digicertglobalrootca [jdk], 25.08.2016, trustedCertEntry, Zertifikat-Fingerprint (SHA-256): 43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:01:61 dude@cs04n4 /cygdrive/c/Program Files/Java/jre1.8.0_301/lib/security
Al configurar una conexión SSL, puede optar por utilizar este almacén de confianza predeterminado o utilizar el suyo propio. Si decide utilizar su propio almacén de confianza, debe crearlo e importar los certificados de servidor/raíz en los que confíe.
Se necesita toda la infraestructura de clave pública (PKI) para saber si la persona que le envió los datos es realmente esa persona y no un hombre en el medio. Para esto, debe haber una tercera parte (en quien confíe) que verifique si el propietario del sitio web crea y firma un certificado para él. Puede verificar que el certificado sea válido porque está firmado por una CA y usted confía en esa CA.
¿Cómo configuras en quién confiar? Necesita almacenar una lista en algún lugar. En el caso de Java, el almacenamiento de las autoridades de confianza y sus claves públicas se encuentra en el archivo $JAVA_HOME/lib/security/cacerts
. Este archivo proviene originalmente de la instalación de Java y contiene las principales CA con certificados (sí, caducan en algún momento). Este archivo se puede modificar (los certificados de CA se pueden agregar o eliminar) con una utilidad keytool que viene con Java.
Ahora es un poco más complicado porque CA tiene niveles de certificados: hay un certificado raíz que se usa para firmar certificados intermedios, que luego se usan para firmar el certificado del propietario del sitio. Cuando su código Java necesita comunicarse usando TLS/SSL, necesita:
Pero aunque el certificado del sitio está firmado por un certificado intermedio, no siempre lo almacenamos en cacerts
. Por lo general, solo se almacena el certificado raíz. En tal caso, hay 2 opciones: agregar un certificado intermedio a cacerts
(mala solución) o el propietario del sitio web debe configurar una cadena de certificados que incluirá tanto su certificado, el certificado que lo firmó, el certificado que firmó ese y así. hasta llegar a la Raíz. En esta configuración, siempre que pueda verificar cualquier certificado en esta cadena, confiará en ese sitio web.