public X509Certificate2 CreateSelfSignedCertificate(SelfSignedCertProperties properties) { this.ThrowIfDisposedOrNotOpen(); this.GenerateKeyExchangeKey(properties.IsPrivateKeyExportable, properties.KeyBitLength); byte[] rawData = properties.Name.RawData; GCHandle gCHandle = GCHandle.Alloc(rawData, GCHandleType.Pinned); Win32Native.CryptKeyProviderInformation keyProviderInfo = new Win32Native.CryptKeyProviderInformation { ContainerName = this.ContainerName, KeySpec = 1, ProviderType = (int)ProviderTypes.PROV_RSA_FULL }; IntPtr intPtr = Win32Native.CertCreateSelfSignCertificate(this.handle, new Win32Native.CryptoApiBlob(rawData.Length, gCHandle.AddrOfPinnedObject()), 0, keyProviderInfo, IntPtr.Zero, this.ToSystemTime(properties.ValidFrom), this.ToSystemTime(properties.ValidTo), IntPtr.Zero); gCHandle.Free(); if (IntPtr.Zero == intPtr) { Win32ErrorHelper.ThrowExceptionIfGetLastErrorIsNotZero(); } X509Certificate2 result = new X509Certificate2(intPtr); if (!Win32Native.CertFreeCertificateContext(intPtr)) { Win32ErrorHelper.ThrowExceptionIfGetLastErrorIsNotZero(); } return(result); }
public static byte[] CreateX509Certificate(string name, string password, DateTime validTo) { X509Certificate2 tempCert = null; SelfSignedCertProperties props = new SelfSignedCertProperties { IsPrivateKeyExportable = true, KeyBitLength = 1024, Name = new X500DistinguishedName("CN=" + name), ValidFrom = DateTime.Now, ValidTo = validTo }; using (CryptContext ctx = new CryptContext()) { ctx.Open(); tempCert = ctx.CreateSelfSignedCertificate(props); } return(tempCert.Export(X509ContentType.Pfx, password)); }