none
RevokeCertificate me répond E_INVALIDARG RRS feed

  • Question

  • Bonjour,

     

    J'utilise la méthode RevokeCertificate() de certadm.dll en C++.

    J'utilise cette même méthode en C# sans soucis (ou presque).

    Voici mon source

     

    	BSTR l_sServeur = SysAllocString (L"pc-ad\\CA IdConcept");
    	BSTR l_sserialNumber = SysAllocString (L"B15154000000000002");
    	LONG i = 0;
    	DATE d = NULL;
    	ICertAdmin* pCertAdmin;
    	HRESULT hr;
    	
    	hr = CoCreateInstance (CLSID_CCertAdmin,
        NULL,
        CLSCTX_SERVER,
        IID_ICertAdmin,
        (void **)&pCertAdmin);
      if (FAILED(hr))
      {
    		return -1;
      }
    	hr = pCertAdmin->RevokeCertificate( l_sServeur,
         l_sserialNumber,
         i,
         d);
    
    	if (FAILED(hr))
      {
    	 return -2;
    	}
    

     


    Cela ne fonctionne pas car hr = E_INVALIDARG après l'appel à RevokeCertificate(). Je ne comprends pas pourquoi ? 

    Une idée ?

    Merci d'avance,



    mercredi 6 juillet 2011 10:01

Réponses

Toutes les réponses

  • DATE d = NULL;

    C'est border line.

    Utilisez une structure initialisée avec memset ou zeromemory plutôt.

    http://msdn.microsoft.com/en-us/library/aa383251(v=vs.85).aspx#Y73


    Paul Bacelar, Ex - MVP VC++
    mercredi 6 juillet 2011 12:58
    Modérateur
  • Pour tester, j'essaierais d'autres valeurs que 0 pour la date et pour la raison de révocation, même si des valeurs nulles sont à priori valides. Il y a un exemple ici au cas où : http://msdn.microsoft.com/en-us/library/aa383251(VS.85).aspx

     

    mercredi 6 juillet 2011 12:59
    Auteur de réponse
  • OK, vous l'aurez voulu :)

    En fait, j'ai effectivement essayé ce code qui a été ma base de travail pour aboutir à celui-ci :

     

    	BSTR bstrCA = NULL;
     BSTR bstrSerial = NULL; // certificate serial number
     long nReason;
     DATE RevokeDate;   // revocation date
     SYSTEMTIME st;
    	HRESULT hr;
    	ICertAdmin2* pCertAdmin;
    
    	hr = OleInitialize(NULL);
    	
    	// Create the CertAdmin object
     // and get a pointer to its ICertAdmin interface.
    	hr = CoCreateInstance (CLSID_CCertAdmin,
           NULL,
    						 CLSCTX_SERVER,
    						 IID_ICertAdmin2,
           (void **)&pCertAdmin);
     if (FAILED(hr))
     {
    		return -1;
     }
    
     bstrSerial = SysAllocString(L"B15154000000000002");
     bstrCA = SysAllocString(L"pc-ad\\CA IdConcept");
     if (NULL == bstrCA || NULL == bstrSerial)
     {
      printf("Memory allocation failed\n");
      goto error;
     }
     
     nReason = CRL_REASON_AFFILIATION_CHANGED; // Defined
    	          // in Wincrypt.h
    
     // Specify when the cert should be revoked.
     // Note: To revoke immediately, set RevokeDate to zero.
     // This example sets the revoke date to noon on 1/1/2001.
     // Zero out values first (avoids setting minutes, seconds,
     // and so on).
     memset(&st, 0, sizeof(SYSTEMTIME));
     st.wYear = 2012;
     st.wMonth = 1;  // Jan
     st.wDay = 1;  // 1st day of month
     st.wHour = 12;  // Noon
    
     // Place the date in the required format.
     if (!SystemTimeToVariantTime(&st, &RevokeDate))
     {
      printf("Unable to convert time.\n");
      goto error;
     }
    
     // Revoke the certificate.
     // pCertAdmin is a previously instantiated ICertAdmin object.
     hr = pCertAdmin->RevokeCertificate( bstrCA,
              bstrSerial,
              nReason,
              RevokeDate );
     if (FAILED(hr))
     {
      printf("Failed RevokeCertificate. [%x]\n", hr);
      goto error;
     }
     else
      printf("Certificate %ws revoked.\n", bstrSerial );
    
    

    J'ai préféré poster un code sans la date pour faciliter la lecture.

     


    mercredi 6 juillet 2011 13:03
  • J'ai trouvé le problème. L'ensemble du code est correct.

    Sauf que le numéro de certificat est incomplet. Il manque 1 octet.

     

    • Marqué comme réponse duhnicle jeudi 7 juillet 2011 09:56
    jeudi 7 juillet 2011 09:56