pfx证书具有一对RSA公钥与私钥,正常情况下私钥签名,公钥验签。
cer证书基本都只具有一个公钥,用作签名验证使用。
正常客户端使用pfx证书加签,服务器使用pfx验签,服务器使用cer证书对应的私钥加签,客户端使用cer证书公钥验签。
好了下面上菜。
1.读取证书信息。
//读取pfx证书,pfxPath证书路径,pfxPwd证书密码 X509Certificate2 pfx = DataCertificate.GetCertificateFromPfxFile(pfxPath, pfxPwd); //读取cer证书, cerPath证书路径 X509Certificate2 certificate = DataCertificate.GetCertFromCerFile(cerPath); //读取公私钥 string EncryptPrivateKey = pfx.PrivateKey.ToXmlString(true); string EncryptPublicKey = pfx.PublicKey.Key.ToXmlString(false); string VerifyPublicKey = certificate.PublicKey.Key.ToXmlString(false);下面上C#对应java的签名方法
//签名 public static string RSASignCSharp256(string data, string privateKeyCSharp, string encoding = "UTF-8") { //转换成适用于.Net的秘钥 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(privateKeyCSharp);//加载私钥 //创建一个空对象 var rsaClear = new RSACryptoServiceProvider(); var paras = rsa.ExportParameters(true); rsaClear.ImportParameters(paras); //签名返回 using (var sha256 = new SHA256CryptoServiceProvider()) { var signData = rsa.SignData(Encoding.GetEncoding(encoding).GetBytes(data), sha256); return BytesToHex(signData).ToUpper(); } } //验签 public static bool VerifyCSharp256(string data, string publicKeyCSharp, string signature, string encoding = "UTF-8") { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); //导入公钥,准备验证签名 rsa.FromXmlString(publicKeyCSharp);//加载私钥 //返回数据验证结果 using (var sha256 = new SHA256CryptoServiceProvider()) { return rsa.VerifyData(Encoding.GetEncoding(encoding).GetBytes(data), sha256, HexToBytes(signature)); } } public static string BytesToHex(byte[] data) { StringBuilder sbRet = new StringBuilder(data.Length * 2); for (int i = 0; i < data.Length; i++) { sbRet.Append(Convert.ToString(data[i], 16).PadLeft(2, '0')); } return sbRet.ToString(); } public static byte[] HexToBytes(string text) { if (text.Length % 2 != 0) throw new ArgumentException("text 长度为奇数。"); List<byte> lstRet = new List<byte>(); for (int i = 0; i < text.Length; i = i + 2) { lstRet.Add(Convert.ToByte(text.Substring(i, 2), 16)); } return lstRet.ToArray(); }示例加签验签
// stringBuilder签名原串, string signature = TopUtils.RSASignCSharp256(stringBuilder.ToString().TrimEnd('&'), EncryptPrivateKey, "GBK"); //dicParam["serverSign"]加签结果 bool isVerify = TopUtils.VerifyCSharp256(stringBuilder.ToString().TrimEnd('&'), VerifyPublicKey, dicParam["serverSign"], "GBK");
