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