我正在研究一些创建X509certificate和公钥/私钥对的代码.公钥被添加到证书中,并将其发送给签署它的CA.
然后通过System.Security.Cryptography.X509Certificates.X509Certificate2类访问返回的证书.现在,我想使用此证书启动与其他客户端的安全连接.因此我使用SslStream类.要启动SSL握手,我使用以下方法:
server.AssociatedSslStream.AuthenticateAsServer(
MyCertificate, // Client Certificate
true, // Require Certificate from connecting Peer
SslProtocols.Tls, // Use TLS 1.0
false // check Certificate revocation
);
Run Code Online (Sandbox Code Playgroud)
此方法要求私钥与证书关联.当然,CA返回的证书不包含私钥.但它作为.key文件存储在硬盘上.X509Certificate2类有一个名为PrivateKey的属性,我想将私钥与证书关联,但我找不到设置此属性的方法.
有没有办法可以将私钥与.net X509类关联起来?
我正在创建一个证书分发系统来跟踪客户和东西.
会发生什么:
所以在客户端会发生这种情况:
//Pseudo Server Object:
Server s = new Server();
//Requested Certificate Name and things
X509Name name = new X509Name("CN=Client Cert, C=NL");
//Key generation 2048bits
RsaKeyPairGenerator rkpg = new RsaKeyPairGenerator();
rkpg.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
AsymmetricCipherKeyPair ackp = rkpg.GenerateKeyPair();
//PKCS #10 Certificate Signing Request
Pkcs10CertificationRequest csr = new Pkcs10CertificationRequest("SHA1WITHRSA", name, ackp.Public, null, ackp.Private);
//Make it a nice PEM thingie
StringBuilder sb = new StringBuilder();
PemWriter pemwrit = new PemWriter(new StringWriter(b));
pemwrit.WriteObject(csr);
pemwrit.Writer.Flush();
s.SendRequest(sb.ToSting());
Run Code Online (Sandbox Code Playgroud)
好吧我会跳过服务器端只要相信我服务器签署证书并将其发送回客户端.多数民众赞成在那里我会采取行动.
PemReader pr …Run Code Online (Sandbox Code Playgroud) 我知道这是一个类似的问题这一个,但我低着头Bouncey城堡路线之前,没有人知道它可以从一个.质子交换膜的文件,例如加载RSA密钥:
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBALKzy66nRuof8Fg0ItatyHS9RiDIKH0m5lorKzKn4y5wR6BXpVUv
ZwnevrAJWBd6EPr/lcV3hjObxD6+q9vmN8ECAwEAAQJAGNcxWwfZrbXe3QPyS9FA
aindU7U/G5aKssIJcTMxO0UYpGU+WArJbboKeEIE7bpNfhDOKTL7ZL6kWBR1Svlh
WQIhAOhtx+xXuSrIot59tmXZaypBDjA4n+Xare0ObFLQxWuvAiEAxNMwm6w33bVr
FHS9slkOh59Le2mgs0uNT6perHaRP48CIGMyRzrlDY/m5SvTtz6slgIIlceawxNU
Sxp7J1wI4djdAiA6+BchHNjkCP2a9Fr9OydaRMSFpiDqduFQk/enbiKYSwIhANO3
SQ51oLFtWN9gX3tfKTXflyO6BV8rgPo980d9CEsb
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
直接使用.NET 3.5加密库而无需参加第三方或自行滚动?
最近我有项目需要在.net core 1.1上运行它。我意识到RSACryptoServiceProvider不在.net核心RSA类上。
在我在stackoverflow中搜索后,只有很少的结果如下=>
C#将私有/公共RSA密钥从RSACryptoServiceProvider导出到PEM字符串
这是上面的帖子提示我下面的链接
https://gist.github.com/brentmaxwell/46081df6fcbc0ca33fe1
我也研究了BouncyCastle PCL 1.8.1.1。我仍然无法解决
任何一种都可以帮助将以下pem格式转换为.net core中的XML格式。
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIZaRouD0ESme7+v
FefIW5aCyrjJWt1mkA5ITWfHHsFbZ8ErIWFTaysr95aLWIdHkEoBUi0lNKwnlQdP
V0/X5XNTJK03o/u+52424ppinZbog2nDSWYeuAwTe2zipdGB9COwJ/7TIgJyTLhX
fxAax7l6FxKmP6oXK7SJk5Ln5ZAlAgMBAAECgYBSatC5xxuc8XAab4KFlFAy7XsE
jmjSRpd6W3o4flrsjHECe73XYX/tlOQmEsc0/X6TF2pczWUZcpKmUFKkZTGYgM4q
ku0qimu9rsbMNFrro0R0weV2sq2sShRzN9qTXbDv/6ze6jn1gzDCSEAsb0LLtTQM
J2jH9zPm7tRzK8qAoQJBALr+EkQxZxDMe/TD7l15lFWH+DZPMGC9X7ZSafICzdgJ
u+XPAQiDOVFmtd/hEIF9ee7ifhc1Zf4NZy4QQGdrQT0CQQC37xvGZdrsteWaNrKF
QFVkG+zJ4gProhR1QDUB1LGOny+avL5mi+nbghJ7XwfI7NqFPYzTUjmNp3lVm5IG
O6kJAkAk9fdyVzmCDokp1liVTWTOizO6uGhdltEGXr/mQDujyjjDsekIX7fCqUSl
3fy/O6gQWeCGgd2JG+kbJ8czKfYZAkB0UuTm8S2mPFdL00HNoeUfHcX/20+NawCz
MnsTgFcWkrgBjVKA+gVZDIbxvSToPlronwd78elyG7NRn8SW6o45AkEAtB0nGH5Y
KXIS07CoQMRBHoXx4f+ojofNoJvzI5Ax+ZBbSx/z5hTSm/jN7llVFRE+3rRyNLig
X/r2O4vVkprHTg==
-----END PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
来自https://superdry.apphb.com/tools/online-rsa-key-converter的结果 是有效的。但是bouncyCastle .net核心示例代码并不多
我必须privateKey在每次API调用时使用 OpenSSL 生成的字符串签名,该字符串privateKey是从数据库接收的,并为每个用户进行更改。
我读过我应该使用RSACryptoService并添加privateKey作为参数来实现这一点。但是我收到错误“无效数据”ImportParameters
这是代码:
string privateKey = "-----BEGIN RSA PRIVATE KEY-----
MIIJ....."
RSAParameters rsap = new RSAParameters
{
Modulus = Encoding.ASCII.GetBytes(privateKey)
};
rsa.ImportParameters(rsap);
byte[] encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(StringToSign), false);
string base64Encrypted = Convert.ToBase64String(encryptedData);
Run Code Online (Sandbox Code Playgroud)
在服务的文档中声明需要使用 RSA-SHA256 对字符串进行签名。这是在 Node.JS 中对该字符串进行签名的代码:
const signature = crypto.createSign('RSA-SHA256').update(string).sign(privateKey, 'base64')
Run Code Online (Sandbox Code Playgroud)
但是,我在 c# 中找不到任何类似的东西。
是否可以生成RSA密钥对,将其导出为与DKIM的类似PEM格式兼容的ASN1 格式,仅使用C#?
我想减少对第三方的依赖,但这里有一些我发现的
充气城堡
密码学应用程序块
Win32 PFXImportCertStore
导入PEM
微软的CLR安全增强功能
微软CNG
以下是在Codeplex上使用.NET dll的Microsoft CNG提供程序的代码(上图)...但是我不知道如何以DKIM兼容的ASN1格式导出和导入公钥和私钥.
byte[] pkcs8PrivateKey = null;
byte[] signedData = null;
CngKey key = CngKey.Create(CngAlgorithm2.Rsa);
byte[] exportedPrivateBytes = key.Export(CngKeyBlobFormat.GenericPrivateBlob);
string exportedPrivateString= Encoding.UTF8.GetString(exportedPrivateBytes);
pkcs8PrivateKey = Encoding.UTF8.GetBytes(exportedPrivateString);
using (CngKey signingKey = CngKey.Import(pkcs8PrivateKey, CngKeyBlobFormat.Pkcs8PrivateBlob))
{
using (RSACng rsa = new RSACng(signingKey))
{
rsa.SignatureHashAlgorithm = CngAlgorithm.Sha1;
signedData = rsa.SignData(dataToSign);
}
}
Run Code Online (Sandbox Code Playgroud)
题
是否有任何使用Microsoft库(Codeplex上的Win32,PFX或CLR)的直接示例,说明如何创建密钥对并以PEM格式导出/导入这些值?
我有一个随机私钥 ( "C:\tmp\private.key"):
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDHikastc8+I81zCg/qWW8dMr8mqvXQ3qbPAmu0RjxoZVI47tvs
kYlFAXOf0sPrhO2nUuooJngnHV0639iTTEYG1vckNaW2R6U5QTdQ5Rq5u+uV3pMk
7w7Vs4n3urQ6jnqt2rTXbC1DNa/PFeAZatbf7ffBBy0IGO0zc128IshYcwIDAQAB
AoGBALTNl2JxTvq4SDW/3VH0fZkQXWH1MM10oeMbB2qO5beWb11FGaOO77nGKfWc
bYgfp5Ogrql4yhBvLAXnxH8bcqqwORtFhlyV68U1y4R+8WxDNh0aevxH8hRS/1X5
031DJm1JlU0E+vStiktN0tC3ebH5hE+1OxbIHSZ+WOWLYX7JAkEA5uigRgKp8ScG
auUijvdOLZIhHWq7y5Wz+nOHUuDw8P7wOTKU34QJAoWEe771p9Pf/GTA/kr0BQnP
QvWUDxGzJwJBAN05C6krwPeryFKrKtjOGJIniIoY72wRnoNcdEEs3HDRhf48YWFo
riRbZylzzzNFy/gmzT6XJQTfktGqq+FZD9UCQGIJaGrxHJgfmpDuAhMzGsUsYtTr
iRox0D1Iqa7dhE693t5aBG010OF6MLqdZA1CXrn5SRtuVVaCSLZEL/2J5UcCQQDA
d3MXucNnN4NPuS/L9HMYJWD7lPoosaORcgyK77bSSNgk+u9WSjbH1uYIAIPSffUZ
bti+jc1dUg5wb+aeZlgJAkEAurrpmpqj5vg087ZngKfFGR5rozDiTsK5DceTV97K
a3Y+Nzl+XWTxDBWk4YPh2ZlKv402hZEfWBYxUDn5ZkH/bw==
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
我尝试使用RSACryptoServiceProvider.ImportCspBlob导入它,但失败并显示错误:
System.Security.Cryptography.CryptographicException:提供程序的错误版本。
完整的堆栈跟踪:
Failed: System.Security.Cryptography.CryptographicException: Bad Version of provider.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.Utils._ImportCspBlob(Byte[] keyBlob, SafeProvHandle hProv, CspProviderFlags flags, SafeKeyHandle& hKey)
at System.Security.Cryptography.Utils.ImportCspBlobHelper(CspAlgorithmType keyType, Byte[] keyBlob, Boolean publicOnly, CspParameters& parameters, Boolean randomKeyContainer, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.ImportCspBlob(Byte[] keyBlob)
at ConsoleApplication3.Program.DecodeRSA(Byte[] data, Int32 c_data) in C:\Users\myuser\Documents\Visual Studio 2015\Projects\myproj\ConsoleApplication3\Program.cs:line 28
at ConsoleApplication3.Program.Main(String[] args) in …Run Code Online (Sandbox Code Playgroud) 我正在研究一些当前使用OpenSSL.net为证书签名请求创建公钥/私钥对的代码.该请求配有公钥并发送给CA,CA返回签名证书.然后将以前创建的私钥添加到证书中:
myCert.PrivateKey = CryptoKey.FromPrivateKey(rsa.PrivateKeyAsPEM, null);
Run Code Online (Sandbox Code Playgroud)
问题是我需要一个.net X509Certificate,因为该软件的其余部分使用SslStream和其他.net类进行TLS.
我能够从CA的响应中创建证书,但我找不到向其添加私钥的方法.我还尝试从CA的响应创建一个OpenSSL证书,将其导出为DER或PEM并从中创建.net证书,但它始终忽略私钥.
关于如何解决这个问题的任何想法?
我有一个私钥,看起来像这样:
----- BEGIN RSA 私钥 ----- 一些私钥数据 ----- END RSA PRIVA
我需要在我的C#项目中使用此密钥,但我找不到任何示例如何使用此格式的密钥.谢谢
有没有办法将 RSA PEM 公钥转换为 XML,而不使用第三方库(例如BouncyCastle)。到目前为止我System.Security.Cryptography只知道识别xml sring。RSA.FromXmlString(PublicKey)
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArqNpTjJR6+aP7dYNTqIU
OPcpTirmN5JbS+ZL255MByiHWn7AF9DU5Q99TROtGbtqySuyzv3fu28YRRSIwK/J
kMLb50AEe3XvnUoZhN86QLCie3iFIq8kpELmX5v2GxCt15ks+cwGsYGYGGwTZNo2
2Y4W1cRgVBLhhbEbuvybKddi7UsmhJlbvLqinUUGCJFkgCAyIbYYowlUjZhbVjp9
DGiaF7EwpcbcERckYXwnKheejWG0chHL9Nt9YldW33Vjgb6s3A9GNF80XNuqT6GJ
T3h3Ig/aoK/9AIhVvc53atCJEgRnjKgfkYPr3SQoKLH7HDCq2TOwN9N5Mbp0QNvb
kwIDAQAB
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
提前致谢
更新
在这里找到了答案。
c# ×7
rsa ×7
.net ×5
cryptography ×2
encryption ×2
pem ×2
ssl ×2
.net-3.5 ×1
.net-core ×1
bouncycastle ×1
certificate ×1
csr ×1
private-key ×1