Problemi di verifica del certificato

1

Ho problemi a far funzionare una connessione SSL. Ho fatto molte ricerche sul web, ma mi manca ancora un po 'di comprensione sembra. Spero che puoi aiutarmi. Genero una catena di certificati di sviluppo: RootCA - > SubCA - > Server

Li ho generati in questo modo

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}

Quindi aggiungo il certificato RootCA al mio trust store Java e il certificato client all'archivio chiavi. Questa è la prima cosa che mi imbarazza: il SubCA Cert ha le informazioni in chiaro che mi aspetto. La CA radice ha solo informazioni crittografiche (la parte tra BEGIN e CERTIFICATO DI FINE. È da verificare? Il mio SubCA Cert appare così, ho troncato la parte cripto:

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

Quindi creo un certificato server (i nomi delle variabili lo chiamano client, poiché viene utilizzato per generare entrambi):

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}

Il certificato del server assomiglia a questo:

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-----

Ora vorrei verificare il certificato generato. Questo fallisce con il messaggio

error 2 at 1 depth lookup:unable to get issuer certificate

Se verifica correttamente se concatenare file SubCA e CA in un singolo file. Anche questo è corretto? Mi aspettavo che il certificato fosse verificabile con ogni certificato?

E ora il mio problema: quando tento di connettermi al mio servizio, fornisce il suo certificato del server. L'ho controllato con wireshark, per sicurezza. Il client non riesce quindi a eseguire l'autenticazione con il messaggio

“unable to find valid certification path to requested target"

Ho esportato il certificato del server come token PKCS12 e l'ho importato nel mio keystore java. Im ha importato i certificati ca / subca nel mio truststore. Questo è presentato dal server come previsto. Quindi penso che ho incasinato la catena di certificati in qualche modo. Poiché i file concatenati di certficate funzionavano così bene con openssl, ho provato ad importarlo nel mio truststore. Questo porta ad avere solo il certificato subca, quindi immagino che ora funzioni. Quando li importa entrambi individualmente, l'elenco dei certificati va bene. Tuttavia, il percorso di certificazione in qualche modo non è corretto. Puoi darmi una mano? Mi sto un po 'frustrando ...

Aggiornamento: Questo è il certificato di root:

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
         ...

Questo è il mio file di configurazione per creare il certificato del server:

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
    
posta Fluffy 20.10.2016 - 15:03
fonte

1 risposta

1

Ho finalmente trovato la soluzione. Ho impostato solo il debug su SSL. Questo è stato un mio errore. Avrei dovuto impostare l'output di debug su "all". Quindi posso vedere questo messaggio di errore:

Caused by: sun.security.validator.ValidatorException: Extended key usage does not permit use for TLS server authentication

Questo è molto più specifico. Per risolvere il problema, infatti, avevo bisogno di cambiare l'uso della mia chiave estesa a questo:

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

Grazie mille!

    
risposta data 21.10.2016 - 10:35
fonte

Leggi altre domande sui tag