public static X509Certificate2 LoadFromPemFile(this X509Certificate2 x, string pemFile)
{
int i;
string[] certFileContents = File.ReadAllLines(pemFile);
bool certFound = false;
bool keyFound = false;
string certData = "";
string keyData = "";
byte[] certBytes = null;
byte[] keyBytes = null;
for (i = 0; i < certFileContents.Length; i++)
{
var line = certFileContents[i].Trim();
if (String.Equals(line, "-----BEGIN CERTIFICATE-----"))
{
certFound = false;
for (i++; i < certFileContents.Length && !certFound; i++)
{
if (!String.Equals(certFileContents[i].Trim(),
"-----END CERTIFICATE-----"))
certData += certFileContents[i];
else certFound = true;
}
certBytes = Convert.FromBase64String(certData.Trim());
continue;
}
if (String.Equals(line, "-----BEGIN RSA PRIVATE KEY-----"))
{
keyFound = false;
for (i++; i < certFileContents.Length && !keyFound; i++)
{
if (!String.Equals(certFileContents[i].Trim(),
"-----END RSA PRIVATE KEY-----"))
keyData += certFileContents[i];
else keyFound = true;
}
keyBytes = Convert.FromBase64String(keyData.Trim());
continue;
}
}
// var certBytes = Convert.FromBase64String(File.ReadAllText(@"D:\projects\openssl\openssl-bin\xxx_certonly.pem").Trim());
// var keyBytes = Convert.FromBase64String(File.ReadAllText(@"D:\projects\openssl\openssl-bin\xxx_keyonly.pem").Trim());
if (!keyFound || !certFound)
throw new Exception("The PEM file did not contain a valid certificate and private key.");
RSACryptoServiceProvider crypto = DecodeRsaPrivateKey(keyBytes);
if (crypto == null)
throw new Exception("Unable to parse the private key in the PEM file.");
x.Import(certBytes);
x.PrivateKey = crypto;
return x;
}