Preocupaciones de verificación de certificados

1

Tengo problemas para que una conexión SSL funcione. Hice mucha investigación en la web, pero todavía me falta algo de comprensión. Espero que puedas ayudarme. Genero una cadena de certificados de desarrollo: RootCA - > SubCA - > Servidor

Los genero de esta manera

openssl req -batch -x509 -config ${ROOTCA_CONFIG} -newkey rsa:2048 -sha1 -nodes -out ${ROOTCA_CERT} -outform PEM -days 7300 
openssl req -batch -config ${SUBCA_CONFIG} -newkey rsa:2048 -sha1 -nodes -out ${SUBCA_CSR} -outform PEM
openssl ca -batch -config ${ROOTCA_CONFIG} -policy signing_policy -extensions signing_req_CA -out ${SUBCA_CERT} -infiles ${SUBCA_CSR}

Luego agrego el certificado RootCA a mi almacén de confianza de Java y el certificado de cliente al almacén de claves. Eso es lo primero que me desconcierta: el certificado de SubCA tiene la información de texto simple que espero. La CA raíz solo tiene información criptográfica (la parte entre COMIENZO y FINALIZAR EL CERTIFICADO. ¿Se debe detectar esto? Mi certificado de SubCA se parece a esto, truncé la parte de cifrado:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=DE, O=Company, CN=Root CA 2016
        Validity
            Not Before: Oct 20 11:59:57 2016 GMT
            Not After : Oct 18 11:59:57 2024 GMT
        Subject: C=DE, O=Company, CN=SubCA 2016
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ae:0b:94:36:76:7c:34:d8:37:61:44:5f:1c:68:
                    ...                        

                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                43:2E:0E:EB:66:C6:2F:AC:1B:24:C7:95:48:92:95:6E:E3:E0:83:1E
            X509v3 Authority Key Identifier: 
                keyid:19:6B:27:27:F8:9F:56:E3:07:E7:AB:51:1E:15:DC:F8:F1:96:D5:35

            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: 
                Digital Signature, Certificate Sign, CRL Sign
            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://crl.url

            Authority Information Access: 
                CA Issuers - URI:http://downloads.some.url

Luego creo un certificado de servidor (los nombres de las variables lo llaman cliente, ya que se usa para generar ambos):

openssl req -batch -config ${CLIENT_CONFIG} -newkey rsa:2048 -sha256 -nodes -out ${CLIENT_CSR} -outform PEM -keyout $1.key
openssl ca -batch -config ${SUBCA_CONFIG} -policy signing_policy -extensions signing_req -out ${CLIENT_CERT} -infiles ${CLIENT_CSR}

El certificado del servidor tiene este aspecto:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=DE, O=Company, CN=SubCA 2016
        Validity
            Not Before: Oct 20 12:18:18 2016 GMT
            Not After : Oct 20 12:18:18 2018 GMT
        Subject: C=DE, ST=Bayern, L=Mytown, O=Company, OU=OU, CN=My Server
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    ...
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                53:C6:01:AB:E4:AA:C4:A4:BC:8B:2D:45:9C:92:40:5D:59:B7:AD:A0
            X509v3 Authority Key Identifier: 
                keyid:43:2E:0E:EB:66:C6:2F:AC:1B:24:C7:95:48:92:95:6E:E3:E0:83:1E

            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Key Encipherment
            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://crl.url.de/some.crl

            Authority Information Access: 
                CA Issuers - URI:http://some.url.de/rootcacert2016.cert

            X509v3 Extended Key Usage: 
                TLS Web Client Authentication
            X509v3 Subject Alternative Name: 
                DNS:localhost, DNS:127.0.0.1, DNS:some.url.de
    Signature Algorithm: sha256WithRSAEncryption
         ...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Ahora me gustaría verificar el certificado generado. Esto falla con el mensaje

  

error 2 en 1 búsqueda en profundidad: no se puede obtener el certificado del emisor

Si se verifica correctamente si concatenaré el archivo SubCA y CA en un solo archivo. ¿Esto también es correcto? ¿Esperaba que el certificado fuera verificable con cada certificado?

Y ahora a mi problema: cuando intento conectarme a mi servicio, proporciona su certificado de servidor. Lo he comprobado con wireshark, para estar seguro. El cliente luego falla la autenticación con el mensaje

  

"no se puede encontrar una ruta de certificación válida para el objetivo solicitado"

Exporté el certificado del servidor como token PKCS12 y lo importé a mi almacén de claves de Java. Im importado los certificados de ca / subca en mi almacén de confianza. Esto es presentado por el servidor como se esperaba. Así que supongo que de alguna manera arruiné la cadena de certificados. Dado que los archivos de certficate concatenados funcionaron muy bien con openssl, intenté importar eso en mi almacén de confianza. Esto lleva a tener solo el certificado de subca, así que supongo que esto ahora funciona. Cuando importo ambos individualmente, la lista de certificados está bien. Sin embargo, el camino de certificación de alguna manera no es correcto. ¿Puedes darme una mano? Me estoy frustrando un poco ...

Actualizar: Este es el certificado raíz:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 13418448032209606381 (0xba37e7642ce496ed)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=DE, O=Company, CN=IDS Root CA 2016
        Validity
            Not Before: Oct 20 11:59:57 2016 GMT
            Not After : Oct 15 11:59:57 2036 GMT
        Subject: C=DE, O=Fraunhofer, CN=IDS Root CA 2016
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                   ...
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                19:6B:27:27:F8:9F:56:E3:07:E7:AB:51:1E:15:DC:F8:F1:96:D5:35
            X509v3 Authority Key Identifier: 
                keyid:19:6B:27:27:F8:9F:56:E3:07:E7:AB:51:1E:15:DC:F8:F1:96:D5:35

            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: 
                Non Repudiation, Certificate Sign, CRL Sign
    Signature Algorithm: sha1WithRSAEncryption
         ...

Este es mi archivo de configuración para crear el certificado del servidor:

HOME            = .
RANDFILE        = $ENV::HOME/.rnd

####################################################################
[ req ]
default_bits        = 2048
#default_keyfile     = connector.key
distinguished_name  = connector_distinguished_name
req_extensions      = connector_req_extensions
string_mask         = utf8only

####################################################################
[ connector_distinguished_name ]
countryName         = Country Name (2 letter code)
countryName_default     = DE

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = Bayern

localityName            = Locality Name (eg, city)
localityName_default        = Muenchen

organizationName         = Organization Name (eg, company)
organizationName_default    = Company

organizationalUnitName  = Organizational Unit Name (department, division)
organizationalUnitName_default  = OU

commonName          = Common Name (e.g. server FQDN or YOUR name)
commonName_default      = Test Server

emailAddress            = Email Address
emailAddress_default        = [email protected]


####################################################################
[ connector_req_extensions ]

subjectKeyIdentifier        = hash
basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment, nonRepudiation
extendedKeyUsage    = clientAuth
#securityProfile = ASN1:UTF8:IDS Security Profile Specification
#subjectAltName         = URI:UUID:%%DEVICE_UUID%%
subjectAltName          = @alternate_names

[ alternate_names ]

DNS.1       = localhost
DNS.2       = 127.0.0.1
DNS.3       = some.url.com
    
pregunta Fluffy 20.10.2016 - 15:03
fuente

1 respuesta

1

Finalmente encontré la solución. Sólo configuro la depuración a SSL. Este fue mi error. Hubiera necesitado establecer la salida de depuración en "todos". Entonces puedo ver este mensaje de error:

  

Causado por: sun.security.validator.ValidatorException: clave extendida   el uso no permite el uso para la autenticación del servidor TLS

Esto es mucho más específico. Para solucionarlo, de hecho necesitaba cambiar mi uso de clave extendida a esto:

keyUsage            = digitalSignature, keyEncipherment, nonRepudiation
extendedKeyUsage    = clientAuth, serverAuth

Muchas gracias!

    
respondido por el Fluffy 21.10.2016 - 10:35
fuente

Lea otras preguntas en las etiquetas