Soru Windows'ta OpenSSL, sistem sertifika deposunu kullanabilir mi?


Linux'tan Windows'a taşıdığım bazı C ++ kodları Windows'ta başarısız oluyor çünkü SSL_get_verify_result() geri geliyor X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY.

Kod kullanıyordu SSL_CTX_set_default_verify_paths() Linux'ta SSL'nin sertifika deposu için standart varsayılan konumlara bakmasını söyler.

Sistem sertifika deposunu kullanmak için OpenSSL almak mümkün mü?


26
2018-02-29 21:47


Menşei




Cevaplar:


Daha önce yaptım. Umarım bu, eğer tam olarak aradığınız şey buysa yardımcı olur.

  1. Sertifikanızı yükleyin ( PCCERT_CONTEXT Crypto API'lerini kullanarak Windows Cert deposundan yapı.
  2. Şifrelenmiş içeriğini olduğu gibi ikili biçimde alın. [PCCERT_CONTEXT->pbCertEncoded].
  3. OpenSSL kullanarak X509 sertifikası nesnesine bu ikili arabelleği ayrıştır d2i_X509() yöntem.
  4. OpenSSL'nin güven deposunu kullanarak ele geçirin SSL_CTX_get_cert_store() yöntem.
  5. Yukarıdaki X509 sertifikasını, bu güven deposuna yükleyerek yükleyin. X509_STORE_add_cert() yöntem.
  6. Bitirdiniz!

37
2017-08-01 16:14



Bilgi için teşekkürler. Buna bir kaç not eklemeliyim: 1. enum penceresinin mağazası "ROOT" ("CA" değil). 2. Connect / handshake işleminden önce cert'i eklemeniz ve connect / handshake işleminden sonra doğrulamanız gerekiyor, aksi halde doğrulama başarısız olur. - Non-maskable Interrupt


Halen olduğun gibi hala bununla uğraşanlar için, başlaman gereken bir örnek kod:

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

}

12
2017-10-14 15:06



Kullanımınız d2i_X509 geçersiz çünkü d2i_X509 artışlarla *in argüman (derleyici hatasından kaçınmak için yayını kullanırsınız). Aşağıdaki gibi bellek sorunlarından kaçınmak için geçici değişken kullanmanız gerekir: const unsigned char *encoded_cert = win_cert_context->pbCertEncoded; d2i_X509(nullptr, &encoded_cert, ... - herolover


Evet

Kullanmak mümkündür OpenSSL her zamanki gibi operasyon için ve CryptoAPI sadece sertifika doğrulama işlemi için. Bu konuyla ilgili olarak birkaç konu görüyorum ve çoğunun etrafı dolaşıyor.

İle CryptoAPI yapmalısın:

  • kod çözme PEM için DER ile CryptStringToBinary(),
  • oluşturmak CERT_CONTEXT nesne ile CertCreateCertificateContext() 
  • ve bu formdaki sertifikayı iyi bilinen / belgelenmiş prosedürle doğrulayın. (Örneğin ETutorials'ta burada.)

    Çalışmak için son adım için, ayrıca başlatmanız gerekir HCERTSTORE biri için MY, ROOT, CA Sistem depolar ya da istediğiniz davranışa göre ... yineleyin.


2
2018-03-16 16:41





Hayır. Kutunun dışında değil.

Hayır o mümkün değil kutudan dışarı. Ek programlama gerektirir. OpenSSL ile iki (kutunun dışında) seçeneğiniz vardır:

  1. OpenSSL'in kendi cert deposunu kullanın (OpenSSL ile sağlanan perl betiği tarafından oluşturulan dizinlerin bir hiyerarşisidir)
  2. Yalnızca sizin tarafınızdan oluşturulan bir sertifika zinciri dosyası kullanın (bu, bir PEM kodlu sertifikaların bir güven zincirinde yer aldığı bir metin dosyasıdır). Böyle bir dosya oluşturmak kolaydır (sadece ekleme)

2
2018-02-29 23:00



Windows pkcs dosyalarından bellekte bir PEM dosyası oluşturmak mümkün olabilir mi? Öyleyse onu yükle? Buldum: marc.info/?l=openssl-users&m=119583966725315 pkcs paketlerinden PEM dosyası oluşturmayı açıklar ... Ve stackoverflow.com/questions/5052563/... Bir tampondan bir PEM dosyası yükleme mekanizması açıklar ...? - dicroce
Evet, bu kesinlikle mümkün. - sirgeorge
Yuck ... Bir sebepten dolayı, dosyamdan hoşlanmıyor (bu sayfadaki kodla yapılmış) ... Benden önce birisinin bunu yapmış olacağını düşünürdüm? - dicroce
@Tushar Sudake tarafından yapılan son çözüm hakkında yorum yapabilirseniz merak ediyorum ... Bunun hala OpenSSL ile mümkün olmadığını düşünüyor musunuz? - dicroce
Evet, bence işe yarayabilir. Ayrıca, o zaten yaptı ve işe yaradı yazdı. Yazmanın imkansız olduğunu söylediğimde, doğrudan 'imkansız' demek istedim (ör. Windows’dan doğrudan sertifikalar kullanarak OpenSSL). - sirgeorge