2009-11-11 5 views
1

crypt32.dll을 사용하여 .pfx 파일의 암호를 변경하는 방법을 알고 싶습니다. 나는 시도했다 :.NET에서 pfx 암호 변경

public bool ChangePassword(String pfxfilename, String pswd, String newPfxfilename, String newPswd) { 

     IntPtr hMemStore = IntPtr.Zero; 
     IntPtr hCertCntxt = IntPtr.Zero; 
     IntPtr pProvInfo = IntPtr.Zero; 

     bool result = false; 

     if (!File.Exists(pfxfilename)) { 
      Console.WriteLine("File '{0}' not found.", pfxfilename); 
      return result; 
     } 

     byte[] pfxdata = PfxOpen.GetFileBytes(pfxfilename); 
     if (pfxdata == null || pfxdata.Length == 0) 
      return result; 

     CRYPT_DATA_BLOB ppfx = new CRYPT_DATA_BLOB(); 
     ppfx.cbData = pfxdata.Length; 
     ppfx.pbData = Marshal.AllocHGlobal(pfxdata.Length); 
     Marshal.Copy(pfxdata, 0, ppfx.pbData, pfxdata.Length); 

     if (!Win32.PFXIsPFXBlob(ref ppfx)) { 
      Console.WriteLine("!!!! File '{0}' is NOT a valid pfx blob !!!", pfxfilename); 
      return result; 
     } 

     hMemStore = Win32.PFXImportCertStore(ref ppfx, pswd, CRYPT_USER_KEYSET); 
     if (hMemStore == IntPtr.Zero) { 
      string errormessage = new Win32Exception(Marshal.GetLastWin32Error()).Message; 
      Console.WriteLine("\n{0}", errormessage); 
      Marshal.FreeHGlobal(ppfx.pbData); 
      return result; 
     } 

     const uint EXPORT_PRIVATE_KEYS = 0x0004; 
     const uint REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY = 0x0002; 
     const uint pfxflags = EXPORT_PRIVATE_KEYS | REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY; 

     CRYPT_DATA_BLOB newppfx = new CRYPT_DATA_BLOB(); 
     newppfx.pbData = IntPtr.Zero; 
     newppfx.cbData = 0; 
     if (Win32.PFXExportCertStoreEx(hMemStore, ref newppfx, pswd, IntPtr.Zero, pfxflags)) { 
      newppfx.pbData = Marshal.AllocHGlobal(newppfx.cbData); 

      if (Win32.PFXExportCertStoreEx(hMemStore, ref newppfx, newPswd, IntPtr.Zero, pfxflags)) { 
       byte[] pfxblob = new byte[newppfx.cbData]; 
       Marshal.Copy(newppfx.pbData, pfxblob, 0, newppfx.cbData); 
       Marshal.FreeHGlobal(newppfx.pbData); 

       PfxOpen.WriteFileBytes(newPfxfilename, pfxblob); 
      }     
     } 

     Marshal.FreeHGlobal(ppfx.pbData); 
     Marshal.FreeHGlobal(newppfx.pbData); 

     if (pProvInfo != IntPtr.Zero) 
      Marshal.FreeHGlobal(pProvInfo); 
     if (hCertCntxt != IntPtr.Zero) 
      Win32.CertFreeCertificateContext(hCertCntxt); 
     if (hMemStore != IntPtr.Zero) 
      Win32.CertCloseStore(hMemStore, 0); 
     return result; 
    } 
+0

키 스토어를 가져올 때 을 발견하면 CRYPT_USER_KEYSET (0x00001000) 대신 CRYPT_EXPORTABLE (0x00000001)을 사용하십시오. bouncycastle 라이브러리를 사용하지 않고 비밀번호를 변경하라는 다른 제안이 있으십니까? – imambenjol

답변

1

X509Certificate2 클래스를 사용할 수있다. 그것은 암호를 설정할 수있는 내보내기 방법이 있습니다.