Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.22 KB | None | 0 0
  1. using Org.BouncyCastle.Asn1;
  2. using Org.BouncyCastle.Asn1.Pkcs;
  3. using Org.BouncyCastle.Asn1.X509;
  4. using Org.BouncyCastle.Crypto;
  5. using Org.BouncyCastle.Crypto.Generators;
  6. using Org.BouncyCastle.Crypto.Parameters;
  7. using Org.BouncyCastle.Crypto.Prng;
  8. using Org.BouncyCastle.Math;
  9. using Org.BouncyCastle.Pkcs;
  10. using Org.BouncyCastle.Security;
  11. using Org.BouncyCastle.Utilities;
  12. using Org.BouncyCastle.X509;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.IO;
  16. using System.Linq;
  17. using System.Security.Cryptography;
  18. using System.Security.Cryptography.X509Certificates;
  19. using System.Text;
  20. using System.Threading.Tasks;
  21.  
  22.  
  23.  
  24. namespace CSRGenerator
  25. {
  26.  
  27. class Program
  28. {
  29. private const string CertSubject = "C=US;O=Ingenico e - Commerce Solutions;OU=299AXST635;CN=Apple Pay Payment Processing:merchant.ingenico.test.aclerbois 0.9.2342.19200300.100.1.1=merchant.ingenico.test.aclerbois";
  30. private const string CertIssuer = "C=US;O=Apple Inc.;OU=Apple Certification Authority;CN=Apple Worldwide Developer Relations CA - G2";
  31.  
  32. static void Main(string[] args)
  33. {
  34. AsymmetricKeyParameter caPrivateKey = null;
  35. var caCert = GenerateCACertificate(CertIssuer, ref caPrivateKey);
  36. addCertToStore(caCert, StoreName.Root, StoreLocation.LocalMachine);
  37.  
  38. var clientCert = GenerateSelfSignedCertificate(CertSubject, CertIssuer, caPrivateKey);
  39.  
  40. using(MemoryStream ms = new MemoryStream(clientCert.RawData))
  41. {
  42. using(FileStream fs = new FileStream("millenium.cer", System.IO.FileMode.OpenOrCreate))
  43. {
  44. ms.WriteTo(fs);
  45. }
  46. }
  47.  
  48. var p12 = clientCert.Export(X509ContentType.Pfx);
  49.  
  50. addCertToStore(new X509Certificate2(p12, (string)null, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet), StoreName.My, StoreLocation.LocalMachine);
  51. }
  52.  
  53.  
  54. public static X509Certificate2 GenerateSelfSignedCertificate(string subjectName, string issuerName, AsymmetricKeyParameter issuerPrivKey)
  55. {
  56. const int keyStrength = 2048;
  57.  
  58. // Generating Random Numbers
  59. CryptoApiRandomGenerator randomGenerator = new CryptoApiRandomGenerator();
  60. SecureRandom random = new SecureRandom(randomGenerator);
  61.  
  62. // The Certificate Generator
  63. X509V3CertificateGenerator certificateGenerator = new X509V3CertificateGenerator();
  64.  
  65. // Serial Number
  66. BigInteger serialNumber = BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random);
  67. certificateGenerator.SetSerialNumber(serialNumber);
  68.  
  69. // Signature Algorithm
  70. const string signatureAlgorithm = "SHA256withRSA";
  71. certificateGenerator.SetSignatureAlgorithm(signatureAlgorithm);
  72.  
  73.  
  74. X509Name subjectDN = new X509Name(subjectName);
  75. X509Name issuerDN = new X509Name(issuerName);
  76.  
  77. certificateGenerator.SetIssuerDN(issuerDN);
  78. certificateGenerator.SetSubjectDN(subjectDN);
  79.  
  80. // Valid For
  81. DateTime notBefore = DateTime.UtcNow.Date;
  82. DateTime notAfter = notBefore.AddYears(2);
  83.  
  84. certificateGenerator.SetNotBefore(notBefore);
  85. certificateGenerator.SetNotAfter(notAfter);
  86.  
  87. // Subject Public Key
  88. AsymmetricCipherKeyPair subjectKeyPair;
  89. var keyGenerationParameters = new KeyGenerationParameters(random, keyStrength);
  90. var keyPairGenerator = new RsaKeyPairGenerator();
  91. keyPairGenerator.Init(keyGenerationParameters);
  92. subjectKeyPair = keyPairGenerator.GenerateKeyPair();
  93.  
  94. certificateGenerator.SetPublicKey(subjectKeyPair.Public);
  95.  
  96. // Generating the Certificate
  97. AsymmetricCipherKeyPair issuerKeyPair = subjectKeyPair;
  98.  
  99. // selfsign certificate
  100. Org.BouncyCastle.X509.X509Certificate certificate = certificateGenerator.Generate(issuerPrivKey, random);
  101.  
  102.  
  103. // correcponding private key
  104. PrivateKeyInfo info = PrivateKeyInfoFactory.CreatePrivateKeyInfo(subjectKeyPair.Private);
  105.  
  106.  
  107. // merge into X509Certificate2
  108. X509Certificate2 x509 = new System.Security.Cryptography.X509Certificates.X509Certificate2(certificate.GetEncoded());
  109.  
  110. Asn1Sequence seq = (Asn1Sequence)Asn1Object.FromByteArray(info.ParsePrivateKey().GetDerEncoded());
  111. if (seq.Count != 9)
  112. {
  113. //throw new PemException("malformed sequence in RSA private key");
  114. }
  115.  
  116. RsaPrivateKeyStructure rsa = new RsaPrivateKeyStructure(seq);
  117. RsaPrivateCrtKeyParameters rsaparams = new RsaPrivateCrtKeyParameters(
  118. rsa.Modulus, rsa.PublicExponent, rsa.PrivateExponent, rsa.Prime1, rsa.Prime2, rsa.Exponent1, rsa.Exponent2, rsa.Coefficient);
  119.  
  120. x509.PrivateKey = ToDotNetKey(rsaparams); //x509.PrivateKey = DotNetUtilities.ToRSA(rsaparams);
  121. return x509;
  122.  
  123. }
  124.  
  125. public static AsymmetricAlgorithm ToDotNetKey(RsaPrivateCrtKeyParameters privateKey)
  126. {
  127. var cspParams = new CspParameters
  128. {
  129. KeyContainerName = Guid.NewGuid().ToString(),
  130. KeyNumber = (int)KeyNumber.Exchange,
  131. Flags = CspProviderFlags.UseMachineKeyStore
  132. };
  133.  
  134. var rsaProvider = new RSACryptoServiceProvider(cspParams);
  135. var parameters = new RSAParameters
  136. {
  137. Modulus = privateKey.Modulus.ToByteArrayUnsigned(),
  138. P = privateKey.P.ToByteArrayUnsigned(),
  139. Q = privateKey.Q.ToByteArrayUnsigned(),
  140. DP = privateKey.DP.ToByteArrayUnsigned(),
  141. DQ = privateKey.DQ.ToByteArrayUnsigned(),
  142. InverseQ = privateKey.QInv.ToByteArrayUnsigned(),
  143. D = privateKey.Exponent.ToByteArrayUnsigned(),
  144. Exponent = privateKey.PublicExponent.ToByteArrayUnsigned()
  145. };
  146.  
  147. rsaProvider.ImportParameters(parameters);
  148. return rsaProvider;
  149. }
  150.  
  151. public static X509Certificate2 GenerateCACertificate(string subjectName, ref AsymmetricKeyParameter CaPrivateKey)
  152. {
  153. const int keyStrength = 2048;
  154.  
  155. // Generating Random Numbers
  156. CryptoApiRandomGenerator randomGenerator = new CryptoApiRandomGenerator();
  157. SecureRandom random = new SecureRandom(randomGenerator);
  158.  
  159. // The Certificate Generator
  160. X509V3CertificateGenerator certificateGenerator = new X509V3CertificateGenerator();
  161.  
  162. // Serial Number
  163. BigInteger serialNumber = BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random);
  164. certificateGenerator.SetSerialNumber(serialNumber);
  165.  
  166. // Signature Algorithm
  167. const string signatureAlgorithm = "SHA256withRSA";
  168. certificateGenerator.SetSignatureAlgorithm(signatureAlgorithm);
  169.  
  170. // Issuer and Subject Name
  171. X509Name subjectDN = new X509Name(CertSubject);
  172. X509Name issuerDN = new X509Name(CertIssuer);
  173.  
  174. certificateGenerator.SetIssuerDN(issuerDN);
  175. certificateGenerator.SetSubjectDN(subjectDN);
  176.  
  177. // Valid For
  178. DateTime notBefore = DateTime.UtcNow.Date;
  179. DateTime notAfter = notBefore.AddYears(2);
  180.  
  181. certificateGenerator.SetNotBefore(notBefore);
  182. certificateGenerator.SetNotAfter(notAfter);
  183.  
  184. // Subject Public Key
  185. AsymmetricCipherKeyPair subjectKeyPair;
  186. KeyGenerationParameters keyGenerationParameters = new KeyGenerationParameters(random, keyStrength);
  187. RsaKeyPairGenerator keyPairGenerator = new RsaKeyPairGenerator();
  188. keyPairGenerator.Init(keyGenerationParameters);
  189. subjectKeyPair = keyPairGenerator.GenerateKeyPair();
  190.  
  191. certificateGenerator.SetPublicKey(subjectKeyPair.Public);
  192.  
  193. // Generating the Certificate
  194. AsymmetricCipherKeyPair issuerKeyPair = subjectKeyPair;
  195.  
  196. // selfsign certificate
  197. Org.BouncyCastle.X509.X509Certificate certificate = certificateGenerator.Generate(issuerKeyPair.Private, random);
  198. X509Certificate2 x509 = new System.Security.Cryptography.X509Certificates.X509Certificate2(certificate.GetEncoded());
  199.  
  200. CaPrivateKey = issuerKeyPair.Private;
  201.  
  202. return x509;
  203. //return issuerKeyPair.Private;
  204.  
  205. }
  206.  
  207.  
  208. public static bool addCertToStore(System.Security.Cryptography.X509Certificates.X509Certificate2 cert, System.Security.Cryptography.X509Certificates.StoreName st, System.Security.Cryptography.X509Certificates.StoreLocation sl)
  209. {
  210. bool bRet = false;
  211.  
  212. try
  213. {
  214. X509Store store = new X509Store(st, sl);
  215. store.Open(OpenFlags.ReadWrite);
  216. store.Add(cert);
  217.  
  218. store.Close();
  219. }
  220. catch
  221. {
  222.  
  223. }
  224.  
  225. return bRet;
  226. }
  227.  
  228. }
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement