我从网络上谷歌搜索到很多生成一个新的x509Certificate2
文件的例子,但是没有例子展示如何在.Net中从头开始生成一个全新的x509Certificate2
。
有没有人可以告诉我如何在.Net中实现呢?
我从网络上谷歌搜索到很多生成一个新的x509Certificate2
文件的例子,但是没有例子展示如何在.Net中从头开始生成一个全新的x509Certificate2
。
有没有人可以告诉我如何在.Net中实现呢?
结账 CertificateRequest (命名空间:System.Security.Cryptography.X509Certificates)...
public static X509Certificate2 GenerateSelfSignedCertificate()
{
string secp256r1Oid = "1.2.840.10045.3.1.7"; //oid for prime256v1(7) other identifier: secp256r1
string subjectName = "Self-Signed-Cert-Example";
var ecdsa = ECDsa.Create(ECCurve.CreateFromValue(secp256r1Oid));
var certRequest = new CertificateRequest($"CN={subjectName}", ecdsa, HashAlgorithmName.SHA256);
//add extensions to the request (just as an example)
//add keyUsage
certRequest.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, true));
X509Certificate2 generatedCert = certRequest.CreateSelfSigned(DateTimeOffset.Now.AddDays(-1), DateTimeOffset.Now.AddYears(10)); // generate the cert and sign!
X509Certificate2 pfxGeneratedCert = new X509Certificate2(generatedCert.Export(X509ContentType.Pfx)); //has to be turned into pfx or Windows at least throws a security credentials not found during sslStream.connectAsClient or HttpClient request...
return pfxGeneratedCert;
}
以下是可以使用的代码:
static X509Certificate2 GenerateCertificate(string certName)
{
var keypairgen = new RsaKeyPairGenerator();
keypairgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));
var keypair = keypairgen.GenerateKeyPair();
var gen = new X509V3CertificateGenerator();
var CN = new X509Name("CN=" + certName);
var SN = BigInteger.ProbablePrime(120, new Random());
gen.SetSerialNumber(SN);
gen.SetSubjectDN(CN);
gen.SetIssuerDN(CN);
gen.SetNotAfter(DateTime.MaxValue);
gen.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0)));
gen.SetSignatureAlgorithm("MD5WithRSA");
gen.SetPublicKey(keypair.Public);
var newCert = gen.Generate(keypair.Private);
return new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert));
}
为了使这个工作起来,请不要忘记添加对BouncyCastle库的引用。
1.从以下链接下载Win64 OpenSSL。(Win64 OpenSSL v1.1.0j - 37MB安装程序) URL-https://slproweb.com/products/Win32OpenSSL.html
2.安装后设置系统路径环境变量。(path = C:\OpenSSL-Win64\bin)
3.打开命令提示符并更改目录到桌面。
4.用于创建密钥的命令:
私钥:openssl req -x509 -days 365 -newkey rsa:2048 -keyout cert-key.pem -out cert.pem
输入命令并按照指示操作。
5.现在我们在桌面上有两个名为cert-key.pem和cert.pem的文件。运行以下命令创建.pfx文件。
openssl pkcs12 -export -in cert.pem -inkey cert-key.pem -out x509-cert.pfx
并按照指示操作(输入相同的密码)。
6.创建公钥的命令:
openssl pkcs12 -in x509-cert.pfx -clcerts -nokeys -out x509-cert-public.pem
并按照指示操作。
7.将证书注册到mmc。
我认为你不能使用那个API来完成它。但是你可以使用Bouncy Castle (http://www.bouncycastle.org)创建一个对象,然后将该对象转换为X509Certificate2对象(BC有一些实用类来完成这个过程)。
-编辑- 请查看这些BC类:X509V3CertificateGenerator和X509Certificate
将BC X509Certificate对象转换为常规的X509Certificate2对象的BC实用程序类是:DotNetUtilities
public X509Certificate2 GetCertificate()
{
var config = InitConfiguration();
var certificateSubject = "X509Subject";
var certificateStoreName = "X509StoreName";
var certificateStoreLocation = "X509StoreLocation";
var thumbPrint = "ThumbPrint";
var storeName = (StoreName)Enum.Parse(typeof(StoreName), certificateStoreName, true);
var storeLocation = (StoreLocation)Enum.Parse(typeof(StoreLocation), certificateStoreLocation, true);
var certificateStore = new X509Store(storeName, storeLocation);
certificateStore.Open(OpenFlags.ReadOnly);
foreach (var storeCertificate in certificateStore.Certificates)
{
if (storeCertificate.Thumbprint.ToLower(System.Globalization.CultureInfo.CurrentCulture) == thumbPrint.ToLower(System.Globalization.CultureInfo.CurrentCulture))
{return storeCertificate;
}
}
certificateStore.Close();
return null;
}
InitConfiguration()
是什么? - clamchoda