c++ - usar - keystore java ejemplo
¿Puede OpenSSL en Windows usar el almacén de certificados del sistema? (4)
No. No fuera de la caja.
No, no es posible salir de la caja. Requeriría programación adicional. Con OpenSSL tienes dos opciones (fuera de la caja):
- Use el propio almacén de certificados de OpenSSL (es una jerarquía de directorios creados por el script perl proporcionado con OpenSSL)
- Utilice solo un archivo de cadena de certificados creado por usted (es un archivo de texto con todos los certificados codificados PEM en una cadena de confianza). Crear un archivo de este tipo es fácil (solo añadirlo)
Algunos códigos C ++ en funcionamiento que estoy portando de Linux a Windows están fallando en Windows porque SSL_get_verify_result()
está devolviendo X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
.
El código estaba usando SSL_CTX_set_default_verify_paths()
en Linux para decirle a SSL que solo busque en las ubicaciones predeterminadas estándar para el almacén de certificados.
¿Es posible hacer que OpenSSL use el almacén de certificados del sistema?
Sí
Es posible usar OpenSSL
para la operación habitual, y usar CryptoAPI
solo para el proceso de verificación de certificado. Veo varios hilos por aquí sobre este tema, y la mayoría de ellos son puntuales en torno a / a través.
Con CryptoAPI
tienes que:
- decodificar
PEM
aDER
conCryptStringToBinary()
, - crear un objeto
CertCreateCertificateContext()
conCertCreateCertificateContext()
y verifique el certificado en este formulario mediante un procedimiento bien conocido / documentado. (Por ejemplo aquí en ETutorials ).
Para que el último paso funcione, también debe inicializar
HCERTSTORE
para una de las tiendas de sistemasMY
,ROOT
,CA
, o iterar en ellas ... según el comportamiento que desee.
Lo he hecho antes. Espero que esto ayude, si esto es exactamente lo que está buscando.
- Cargue su certificado (en la estructura
PCCERT_CONTEXT
) del almacén de Cert de Windows utilizando las API dePCCERT_CONTEXT
. - Obtener contenido cifrado de él en formato binario como es. [
PCCERT_CONTEXT->pbCertEncoded
]. - Analice este búfer binario en el objeto X509 certificado utilizando el método
d2i_X509()
OpenSSL. - Obtenga el identificador del almacén de confianza de OpenSSL utilizando el método
SSL_CTX_get_cert_store()
. - Cargue el certificado X509 analizado en este almacén de confianza utilizando el método
X509_STORE_add_cert()
. - ¡Estás listo!
Para aquellos de ustedes que todavía están luchando con esto como lo he estado, aquí hay un código de ejemplo para comenzar:
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#include <cryptuiapi.h>
#include <iostream>
#include <tchar.h>
#include "openssl/x509.h"
#pragma comment (lib, "crypt32.lib")
#pragma comment (lib, "cryptui.lib")
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
int main(void)
{
HCERTSTORE hStore;
PCCERT_CONTEXT pContext = NULL;
X509 *x509;
X509_STORE *store = X509_STORE_new();
hStore = CertOpenSystemStore(NULL, L"ROOT");
if (!hStore)
return 1;
while (pContext = CertEnumCertificatesInStore(hStore, pContext))
{
//uncomment the line below if you want to see the certificates as pop ups
//CryptUIDlgViewContext(CERT_STORE_CERTIFICATE_CONTEXT, pContext, NULL, NULL, 0, NULL);
x509 = NULL;
x509 = d2i_X509(NULL, (const unsigned char **)&pContext->pbCertEncoded, pContext->cbCertEncoded);
if (x509)
{
int i = X509_STORE_add_cert(store, x509);
if (i == 1)
std::cout << "certificate added" << std::endl;
X509_free(x509);
}
}
CertFreeCertificateContext(pContext);
CertCloseStore(hStore, 0);
system("pause");
return 0;
}