我正在开发一个API服务器,它将从用户那里获取以下信息的输入
"CN=ABC123,O=DEF,L=XYZ,S=CA,C=US,E=info@abc.com"
使用我们的根证书创建签名的开发人员证书。使用makecert.exe
创建证书我已经遵循Creating self signed certificates with makecert.exe for development教程并使用以下命令创建了根证书
makecert.exe ^
-n "CN=CARoot" ^
-r ^
-pe ^
-a sha512 ^
-len 4096 ^
-cy authority ^
-sv CARoot.pvk ^
CARoot.cer
pvk2pfx.exe ^
-pvk CARoot.pvk ^
-spc CARoot.cer ^
-pfx CARoot.pfx ^
-po Test123
在命令提示符下,它在提示弹出窗口中要求提供证书和private.key密码,因为这是一次性过程并且我已手动完成此操作
我使用的开发者证书
Process.Start("makecert.exe",certCmd);
将certCmd
中的以下内容设为string
makecert.exe ^
-n "CN=%1" ^
-iv CARoot.pvk ^
-ic CARoot.cer ^
-pe ^
-a sha512 ^
-len 4096 ^
-b 01/01/2014 ^
-e 01/01/2016 ^
-sky exchange ^
-eku 1.3.6.1.5.5.7.3.2 ^
-sv %1.pvk ^
%1.cer
pvk2pfx.exe ^
-pvk %1.pvk ^
-spc %1.cer ^
-pfx %1.pfx ^
-po Test123
现在根据documentation,上面的命令中没有-po
参数,因此它在提示符中要求输入密码
因为这是一个API,所以无法在私钥提示中输入密码
另一种选择是使用X509Certificate2
和bouncyCastle
,但不确定如何使用它们,任何帮助都会很明显
我希望尽可能保持简单,这就是我makecert.exe
与Process.Start()
答案 0 :(得分:2)
如果你想制作自己的证书...... 我过去使用过这段代码来动态生成证书。您需要针对您的解决方案进行调整,但它应该为您提供所需的一切。它使用了Bouncy Castle。
public static X509Certificate GenerateRootCertificate(AsymmetricCipherKeyPair key, X509Name subjectAndIssuer, int serialNumber, int yearsValid)
{
X509V3CertificateGenerator gen = new X509V3CertificateGenerator();
Asn1SignatureFactory sig = new Asn1SignatureFactory("SHA256withRSA", key.Private, new SecureRandom());
DateTime notBefore = DateTime.Now;
DateTime notAfter = DateTime.Now.AddYears(yearsValid);
gen.SetSerialNumber(BigInteger.ValueOf(serialNumber));
gen.SetSubjectDN(subjectAndIssuer);
gen.SetIssuerDN(subjectAndIssuer);
gen.SetPublicKey(key.Public);
gen.AddExtension(X509Extensions.BasicConstraints, true, new BasicConstraints(true));
gen.AddExtension(X509Extensions.KeyUsage, true, new KeyUsage(KeyUsage.DigitalSignature | KeyUsage.CrlSign | KeyUsage.KeyCertSign));
gen.AddExtension(X509Extensions.SubjectKeyIdentifier, false, new SubjectKeyIdentifierStructure(key.Public));
gen.AddExtension(X509Extensions.AuthorityKeyIdentifier, false, new AuthorityKeyIdentifierStructure(key.Public));
gen.SetNotBefore(notBefore);
gen.SetNotAfter(notAfter);
return gen.Generate(sig);
}
这可能是一个更好的方法,最终给你更多的控制。
编辑: 您可以使用此方法检索公钥和私钥,前提是它采用PEM格式:
public static object ReadObjectFromPEMFile(string fileName)
{
PemReader reader = new PemReader(new StreamReader(File.Open(fileName, FileMode.Open)));
object r = reader.ReadObject();
reader.Reader.Close();
return r;
}
别忘了把结果投到AsymmetricCipherKeyPair
!
答案 1 :(得分:1)
我同意@LukeParks的回答,你应该在你自己的代码中完成所有这些,但是如果你仍然想和你一起当前的方式,请按照以下方式:
您可以重定向makecert进程的StandardInput以将输入直接传递给程序。
ProcessStartInfo procInf = new ProcessStartInfo("makecert.exe",certCmd)
{
RedirectStandardOutput = true,
RedirectStandardInput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
Process makeCertProcess = Process.Start(procInf);
//Here is the "manual" input (timing doesn't matter)
pscp.StandardInput.WriteLine("password or whatever");
pscp.WaitForExit(TimeOut);
string errors = pscp.StandardError.ReadToEnd();
string output = pscp.StandardOutput.ReadToEnd();
int errorcode = pscp.ExitCode;
答案 2 :(得分:0)
前段时间我回答了一个非常类似的问题。 那么问题是
即时生成自签名证书
但稍后问题被修改为在生成CA证书之前使用发布终端实体证书。嗯,似乎我没有在更改后重命名方法XRegExp
。它应该命名为GenerateSelfSignedCertificate
,因为它的作用是什么。
尝试查看我的回答here