当前位置: 首页 > 编程语言 > C#

从X509证书导出私钥-公钥到PEM共享

时间:2023-04-11 11:20:49 C#

从X509证书导出私钥/公钥到PEM有没有一种方便的方法使用.NETCoreprivate/公钥?不在低级别操作字节?我在谷歌上搜索了几个小时,几乎没有任何东西可用于.net核心,也没有在任何地方记录。我们有一个X509Certificate2varcert=newX509Certificate2(someBytes,pass);varprivateKey=cert.GetRSAPrivateKey();varpublicKey=cert.GetRSAPublicKey();//假设到目前为止一切正常现在我需要将密钥导出为两个单独的PEM密钥。我在BouncyCastle中尝试过PemWriter,但类型与Core的System.Security.Cryptography不兼容。不走运。---编辑--换句话说,我找到了一种写法:$opensslpkcs12-inpath/to/cert.p12-outpublic.pub-clcerts-nokeys$opensslpkcs12-inpath/to/cert.p12-outprivate.key-nocerts有人有想法吗?谢谢...答案介于“不”和“不是”之间。我假设您不希望p12输出垃圾位于public.pub和private.key之上。public.pub只是证书。openssl命令行实用程序更喜欢PEM编码的数据,因此我们将编写一个PEM编码的证书(注意,这是证书,而不是公钥。它包含公钥,但本身不是公钥:using(varcert=newX509Certificate2(someBytes,pass)){builder.AppendLine("-----开始证书-----");builder.AppendLine(Convert.ToBase64String(cert.RawData,Base64FormattingOptions.InsertLineBreaks));builder.AppendLine("-----证书结束-----");返回builder.ToString();私钥更难。假设密钥是可导出的(如果您使用的是Windows或macOS,则不是,因为您没有声明X509KeyStorageFlags.Exportable),您可以使用privateKey.ExportParameters(true)获取参数。但现在你必须把它写下来。RSA私钥被写入带有标签“RSAPRIVATEKEY”的PEM编码文件,其有效负载为ASN.1(ITU-TX.680)RSAPrivateKey(PKCS#1/RFC3447)结构,通常采用DER编码(ITU-T-TRecommendationX.690)——虽然没有署名,也没有具体的DER限制,但很多读者可能会假设为DER。或者,它可以是PKCS#8(RFC5208)PrivateKeyInfo(令牌:“私钥”)或EncryptedPrivateKeyInfo(令牌:“加密私钥”)。由于EncryptedPrivateKeyInfo包装了PrivateKeyInfo,而PrivateKeyInfo包装了RSAPrivateKey,我们将从这里开始。RSAPrivateKey::=SEQUENCE{versionVersion,modulusINTEGER,--npublicExponentINTEGER,--eprivateExponentINTEGER,--dprime1INTEGER,--pprime2INTEGER,--qexponent1INTEGER,--dmod(p-1)exponent2INTEGER,--dmod(q-1)coefficientINTEGER,--(inverseofq)modpotherPrimeInfosOtherPrimeInfosOPTIONAL}暂时忽略关于otherPrimeInfos的部分。指数1为DP,指数2为DQ,系数为InverseQ。让我们使用预先发布的384位RSA密钥。RFC3447说我们想要Version=0。其他一切都来自结构。//SEQUENCE(RSAPrivateKey)30xa[ya[za]]//INTEGER(Version=0)020100//INTEGER(modulus)//如果设置了最高有效内容字节,则为最高有效位,//添加填充00字节。023100DACC22D86E671575032E31F206DCFC192C65E2D51089E5112D096F2882AFDB5B78CDB6572FD2F61DB3904722D932E3F5//INTEGERpublicExponent0203010001//INTEGER(privateExponent)//高位没有设置,所以没有填充字节0230DACC22D86E671575032E31F206DCFC192C65E2D51089E5112D096F2882AFDB5B78CDB6572FD2F61DB390472232E3D9F5//INTEGER(prime1)//设置高位,填充。021900FADBD7F8A18B3A75A4F6DFAEE3426FD0FF8BAC74B6722DEF//INTEGER(prime2)//高位已设置,填充。021900DF48144A6D88A780144FCEA66BDCDA50D6071C54E5D0DA5B//整数(指数1)//无填充021824FFBBD0DDF2AD02A0FC106DB8F3198ED7C200038ECD345D//INTEGER(exponent2)//需要填充02190085DF73BB045D91006C2D459BE6C42E69954A0224ACFE424D//INTEGER(coefficient)//nopadding02181A3A769C21262B84CA9CA9620F98D2F43EACCCD4879A6FFD现在我们计算进入RSAPrivateKey结构的字节数我计算0xF2(242).由于这大于0x7F,我们需要使用多字节长度编码:81F2。所以现在使用字节数组3081F2020100...9A6FFD您可以将其转换为多行Base64并将其包装在“RSAPRIVATEKEY”PEM装甲中。但也许您想要PKCS#8。PrivateKeyInfo::=SEQUENCE{versionVersion,privateKeyAlgorithmPrivateKeyAlgorithmIdentifier,privateKeyPrivateKey,attributes[0]IMPLICITAttributesOPTIONAL}Version::=INTEGERPrivateKeyAlgorithmIdentifier::=RFC让我们再说一遍……我们也想要version=0。AlgorithmIdentifier可以在RFC5280中找到。//SEQUENCE(PrivateKeyInfo)30xa[ya[za]]//INTEGER(Version=0)020100//SEQUENCE(PrivateKeyAlgorithmIdentifier/AlgorithmIdentifier)30xb[yb[zb]]//OBJECTIDENTIFIERid-rsaEncryption(1.2.840.113549.1.1.1)06092A864886F70D010101//NULL(根据RFC3447A.1)0500//OCTETSTRING(又名byte[])(私钥)0481F5【这里是之前的值,注意这里的长度是F5因为是payload的tag和length字节】回填长度:“b”系列是13(0x0D),因为它只包含预定长度的东西。“a”系列现在是(2+1)+(2+13)+(3+0xF5)=266(0x010A)。3082010A020100300D...现在您可以将PEM视为“私钥”。它是加密的吗?这是一场完全不同的球赛。我找到了一个效果很好的解决方案。我找不到关于如何在Windows中从证书存储到pem文件的确切示例。当然,这可能不适用于某些证书,但如果您使用的是您自己创建的证书(例如,如果您只需要控制最终用户看不到的两台计算机之间的安全性),这是好方法的好方法。回到pem/pk(linux风格)。我用的是http://www.bouncycastle.org/csharp/上的实用工具以上是C#学习教程:Exporttheprivatekey/publickeyfromtheX509certificatetothewholecontentofthePEMshare,如果有用大家和需要了解更多C#学习教程,希望大家多多关注——X509StorecertStore=newX509Store(StoreName.My,StoreLocation.LocalMachine);certStore.Open(OpenFlags.ReadOnly);X509Certificate2caCert=certStore.Certificates.Find(X509FindType.FindByThumbprint,"3C97BF2632ACAB5E35B48CB94927C4A7D20BBEBA",true)[0];RSACryptoServiceProviderpkey=(RSACryptoServiceProvider)caCert.PrivateKey;AsymmetricCipherKeyPairkeyPair=DotNetUtilities.GetRsaKeyPair(pkey);使用(TextWritertw=newStreamWriter("C:\private.pem")){PemWriterpw=newPemWriter(tw);pw.WriteObject(keyPair.Private);tw.Flush();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢