softpedia - Cómo usar SSL_CERT_FILE para OpenSSL Windows(OpenSSL 1.0.1c)
openssl windows server 2012 (1)
Cómo (si es que lo hace) se puede definir un solo archivo de certificado de confianza para OpenSSL
CAFile es simplemente una concatenación de certificados autofirmados que usted confía y quiere usar. Si solo quiere confiar en uno, solo debería haber uno en el archivo de CA.
Prefiero la codificación PEM porque es más fácil de inspeccionar con un editor de texto ( -----BEGIN CERTIFICATE-----
y -----END CERTIFICATE-----
). Por ejemplo, aquí está el ca-bundle.pem de Startcom ( http://www.startssl.com/certs/ ):
Entonces, para crear uno, simplemente use cat
y redirecciones (o copie y pegue):
# Empty my-ca-file.pem
echo "" > my-ca-file.pem
# Add Startcom certs
cat startcom-ca-bundle.pem >> my-ca-file.pem
# Add others as desired
...
Varias investigaciones me llevaron a descargar la versión de Diciembre 12 de los certificados de confianza de Mozilla en formato PEM ...
Bueno, esa es una de las listas que puedes usar. Cuando usas la lista de Mozilla, estás diciendo "Confío en que Mozilla hará lo correcto". Tenga en cuenta que Mozilla recompensó el mal comportamiento de Trustwave cuando se detectó que Trustwave interceptaba el tráfico SSL / TLS. Aunque Trustwave violó al menos dos políticas de inclusión, Mozilla continuó incluyéndolas porque Trustwave prometió no volver a hacerlo nunca más. Consulte Eliminar certificados de Trustwave de certificados raíz de confianza para obtener más información.
Si no confía en el juicio de Mozilla, puede usar la lista incorporada de OpenSSL en /usr/lib/ssl/certs/ca-certificates.crt
, usar otra lista (la mayoría de los proveedores principales las tienen), o crear la suya propia.
Usar una lista de proveedor diferente suele ser el equivalente a cambiar el demonio que conoces por el demonio que no conoces. Por ejemplo, Apple tiene una lista que usan que puede inspeccionar en iOS: Lista de certificados raíz confiables disponibles (iOS 7) . Pero la lista de Apple tiene muchos problemas: http://seclists.org/fulldisclosure/2013/Sep/186 y http://seclists.org/fulldisclosure/2013/Sep/184 .
Recomiendo construir tu propia lista o anclar certificados. Clavar certificados o claves públicas es mejor porque neutraliza los problemas sistémicos en SSL / TLS que permitieron a Trustwave hacer lo que hicieron. Vea Certificado de OWASP y Clave de Clave Pública para más detalles.
... en Windows (Win-7, OpenSSL 1.0.1c) usando la variable de entorno
SSL_CERT_FILE
?
No sé cómo hacerlo a través de variables ambientales porque no las uso. Pero no debe haber diferencia entre Linux / Unix / OSX / Windows (excepto, tal vez, el manejo de nombres de archivos largos y espacios).
En cuanto a las fuentes OpenSSL, tiene lo siguiente en cryptlib.h
:
#define X509_CERT_FILE_EVP "SSL_CERT_FILE"
x509_def.c
usa X509_CERT_FILE_EVP
:
const char *X509_get_default_cert_file_env(void)
{ return(X509_CERT_FILE_EVP); }
X509_get_default_cert_file_env
se usa en by_file.c
en by_file_ctrl
:
...
switch (cmd)
{
case X509_L_FILE_LOAD:
if (argl == X509_FILETYPE_DEFAULT)
{
file = (char *)getenv(X509_get_default_cert_file_env());
if (file)
ok = (X509_load_cert_crl_file(ctx,file,
X509_FILETYPE_PEM) != 0);
else
ok = (X509_load_cert_crl_file(ctx,X509_get_default_cert_file(),
X509_FILETYPE_PEM) != 0);
if (!ok)
{
X509err(X509_F_BY_FILE_CTRL,X509_R_LOADING_DEFAULTS);
}
}
else
{
if(argl == X509_FILETYPE_PEM)
ok = (X509_load_cert_crl_file(ctx,argp,
X509_FILETYPE_PEM) != 0);
else
ok = (X509_load_cert_file(ctx,argp,(int)argl) != 0);
}
break;
}
return(ok);
Entonces, se prefiere (¿se requiere?) Una concatenación de formatos PEM cuando se usa SSL_CERT_FILE
.
Finalmente, asegúrese de que SSL_CERT_FILE
no esté anulado por una configuración de archivo de configuración. Ver configuración de OpenSSL (5) para más detalles.
Parece un proceso arduo extraer manualmente cada certificado y ponerlo en su propio archivo con un enlace hash apuntando a él.
No creo que necesite volver a SSL_CERT_FILE
cuando usa SSL_CERT_FILE
, -CAfile
o SSL_CTX_load_verify_locations
.
Nunca -CAfile
SSL_CTX_load_verify_locations
cuando uso -CAfile
o SSL_CTX_load_verify_locations
, y todo funcionó bien. Cuando las cosas se rompen, generalmente porque (1) el certificado raíz no está presente o es de confianza; o (2) un certificado intermedio no está presente.
Para el elemento (2) anterior, necesita que el servidor envíe todos los certificados necesarios para construir la cadena. De lo contrario, un cliente no sabrá dónde buscar para encontrar un certificado intermedio faltante. Es un problema bien conocido en PKI denominado el problema "Qué directorio" (el cliente no sabe qué directorio X500 buscar para el certificado faltante).
Relacionado, s_client
aquí cómo usarlos en el s_client
de OpenSSL. Esto realmente funciona porque pagepeeker.com usa StartCom, y fallará si omite la opción -CAfile
:
$ echo "GET / HTTP/1.1" | openssl s_client -connect api.pagepeeker.com:443 -CAfile startcom-ca-bundle.pem
CONNECTED(00000003)
depth=2 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Certification Authority
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
0 s:/description=8CTO6gSuxeRRsIXl/C=RO/CN=api.pagepeeker.com/[email protected]
i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
1 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
2 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGZTCCBU2gAwIBAgIDCJkoMA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJJ
TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0
...
Y código relacionado al hacer la programación en C. Esto es parte del código que uso para configurar una conexión SSL / TLS (además de la fijación de clave pública):
int ret = 0;
unsigned long ssl_err = 0;
SSL_CTX* ctx = NULL;
do
{
ret = SSL_library_init();
ssl_err = ERR_get_error();
if(!(1 == ret))
{
display_error("SSL_library_init", ssl_err);
break; /* failed */
}
/* SSLv23_method() is ''everything'' */
const SSL_METHOD* method = SSLv23_method();
ssl_err = ERR_get_error();
if(!(NULL != method))
{
display_error("SSLv23_method", ssl_err);
break; /* failed */
}
/* http://www.openssl.org/docs/ssl/ctx_new.html */
ctx = SSL_CTX_new(method);
ssl_err = ERR_get_error();
if(!(ctx != NULL))
{
display_error("SSL_CTX_new", ssl_err);
break; /* failed */
}
/* Enable standard certificate validation and our callback */
/* https://www.openssl.org/docs/ssl/ctx_set_verify.html */
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, my_verify_cb);
/* Cannot fail ??? */
/* Remove most egregious */
const long flags = SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION;
long old_opts = SSL_CTX_set_options(ctx, flags);
UNUSED(old_opts);
/* http://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html */
ret = SSL_CTX_load_verify_locations(ctx, "startcom-ca-bundle.pem", NULL);
ssl_err = ERR_get_error();
if(!(1 == ret))
display_warning("SSL_CTX_load_verify_locations", ssl_err);
} while(0);
// Use context
return ctx;
Está bien si falla SSL_CTX_load_verify_locations
. Significa que no confiarás en nada, por lo que fallas cerrado o cerrado.
¿Cómo (en todo caso) se puede definir un solo archivo de certificado de confianza para OpenSSL en Windows (Win-7, OpenSSL 1.0.1c) utilizando la variable de entorno SSL_CERT_FILE?
Diversas investigaciones me llevaron a descargar la versión de Diciembre 12 de los certificados de confianza de Mozilla en formato PEM, desde aquí: http://curl.haxx.se/docs/caextract.html. Contiene todos los certs y toda la información relacionada concatenada en un archivo
He encontrado varias referencias al uso de las variables de entorno SSL_CERT_DIR y SSL_CERT_FILE con respecto a otros productos que dependen de OpenSSL. Por ejemplo, http://lynx.isc.org/current/README.sslcerts indica que uno puede establecer ambos y las bibliotecas subyacentes de OpenSSL los usarán. Sin embargo, esa no ha sido mi experiencia con la herramienta OpenSSL en sí misma.
Pude usar SSL_CERT_DIR con éxito, pero con mucho dolor, de la siguiente manera. Exporté (desde IE 8) el certificado de www.wellsfargo.com (seleccionado al azar), junto con los dos certificados en su cadena de confianza, ambos de Verisign. Puse cada uno de los dos certificados de Verisign en un directorio C: / ca_stuff, y para cada uno, generé un hash por lo tanto
openssl x509 -hash -noout -in "Verisign Intl Server.cer"
que tenía salida a302054c, y de esto creó un enlace por lo tanto
mklink a302054c.0 "Verisign Intl Server.cer"
y del mismo modo para el otro cert de Verisign. Luego puse el certificado de Wells Fargo. en un directorio diferente, y fue capaz de verificarlo exitosamente usando
establecer SSL_CERT_DIR = C: / ca_stuff openssl verificar "Wells Fargo web.cer"
Sin embargo, después de definir SSL_CERT_FILE, apuntando al cacert.pem descargado del sitio cURL, falló el mismo comando. Lo hizo con y sin tener definido SSL_CERT_DIR. Verifiqué que los certificados de CA necesarios estaban en el paquete y confirmé que sus números de serie coincidían con los que había extraído manualmente de IE.
Parece un proceso arduo extraer manualmente cada certificado y ponerlo en su propio archivo con un enlace hash apuntando a él. Si esto fuera Unix, podría automatizarlo, pero en Windows ... Aparentemente no entendí bien cómo obtener un gran archivo cert de CA trabajando con OpenSSL.
Gracias de antemano por sus recomendaciones, ideas y asistencia.